一,漏洞原理
代码执行:在php中的表现是exec()等函数把用户输入的数据不严格过滤就当作了代码来执行
命令执行:php中就是shell_exec等函数把用户输入的数据当作命令执行
本质:其实就是把用户输入的数据,在不进行严格过滤的情况下,当成了命令或者代码来执行。
二,危险函数
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
修复方案
php.ini的disable_functions中禁用相关危险函数
三,靶场
DVWA
1.low(无校验)
简单的输入了127.0.0.1后,提示shell_exec被禁用。
百度发现,要在php.ini配置文件把disable_functions = exec , popen, system 把这个里面的exec去掉,在重启下apache。成功执行
2.medium(过滤&&和;)
看关键代码
但是用&就可以绕过,因为基于黑名单过滤,不严格
3.high
首先看下代码
经过测试,会过滤数组中出现的所有字符。尝试了很久都没有找到banf,最后屈服了去看wp,发现过滤的时候是’| ‘,多了一个空格,接下来就好办了
可以看到没有空格也能执行,看来以后看源码的时候要细心啊!
4.impossble
看下代码
发现他是先以’.'把参数进行分割,然后再分别验证4个参数是否为数字。。应该是真的没法绕了。。
Pikachu
1.exec"eval"
看下核心代码
if语句检查是否传入参数,@eva($_POST[‘txt’])是把txt参数的内容当作php代码执行,@是忽略错误。可以看出无任何过滤,直接执行就行,但是注意txt的内容要符合php的语法payload=phpinfo();