前言:
坚持就是有点麻烦,但是你只要做下去就会感到习惯和快乐的事。
一、命令执行漏洞概念
什么是命令执行漏洞?命令执行漏洞就是服务器端没有对客户端用户输入的命令进行过滤,导致用户可以通过任意拼接系统命令,使服务器端成功执行任意系统命令。为什么客户端能直接对服务器执行命令呢,因为在服务器安装的web程序,web框架和web组件等外部程序有时候去需要调用执行命令的函数,所以如果没有对客户端用户输入的命令进行过滤,就会使得用户通过外部程序直接编写和执行系统的命令函数。
二、命令执行原理
命令执行漏洞主要是服务端没有对执行命令的函数做出过滤导致的。我们可通过编写一些系统函数来输入疑似存在命令执行接口的地方,来检测是否此接口是否存在命令执行漏洞。
1. 常见的执行系统命令的函数有:
windows系统:
whoami:查看服务器用户名
ipconfig:查看本机IP地址子网掩码以及默认网关等
dir:查看本目录文件
Linux系统:
whoami:查看服务器用户名
ifconfig:查看本机IP地址子网掩码以及默认网关等
ls:列出本目录文件
pwd:查看现目录的绝对路径
除了拼接函数外,我们还可以使用命令连接符来组合这些系统函数增加命令执行成功率。常见的命令连接符有(“|,&&,||”这三个连接符都是Windows系统与Linux系统共有的,而“&”是Windows系统特有,“;”是Linux系统特有的):
- |
管道操作符
A|B:无论执行的A命令是否正确,B命令都执行
- &&
逻辑与
A&&B:只有在A命令成功执行的前提下,B命令才可以执行
- ||
逻辑或
A||B:只有在A命令没有执行失败的前提下,B命令才可以执行
- &
A&B:不管A是否执行成功,B命令都会执行
- ;
A&B:不管A是否执行成功,B命令都会执行
2. 代码命令执行
一般我们能通过外部程序直接调用的系统命令的接口并不多,但是有些外部程序使用的代码可以也导致命令执行。 PHP代码执行漏洞是将PHP代码注入到Web应用中通过Web容器执行 。例如PHP中的 eval()、assert()、``、system()、exec()、shell_exec()、passthru()、 pcntl_exec()等(Windows上未对反斜杠进行过滤),当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击。
我们来解释一下这些命令的意思
system():
system函数是php函数通过调用外部程序命令来实现与系统命令函数交互达到执行系统函数的目的,system将执行结果显示输出
举例
创建一个123.php文件,在里面写入
<?php
system("whoami");
?>
执行命令whoami并输出
passthru()
passthru()函数(一般用于UNIX系统)和system函数类似,执行命令并且可以将输出结果回显
<?php
echo"<pre>";
passthru("ipconfig");
echo"</pre>";
?>
exec函数也是命令执行函数。作用与system差不多,只不过exec函数可以执行,但是不回显结果,只返回执行结果的最后一行。
要回显结果可以加上echo函数
<?php
exec("ipconfig");
?>
shell_exec()
与exec函数差不多,执行命令函数,但是不回显,我们可以使用echo函数把执行结果显示出来
代码执行漏洞
由于服务器对危险函数过滤不严,导致用户输入的一些字符串可以被转换成代码来执行,从而造成代码执行漏洞。
下面介绍一些危险函数,它们可以将输入的字符串转化为代码。
eval()
eval() 函数可将括号里面的字符串转换为代码执行,字符串必须是合法的php代码并且用分号结束,这样才能执行代码命令。
创建text.php文件。里面代码是
<?php
$cmd=$_GET["cmd"];
eval("$cmd");
?>
然后我们往这个文件名后面加上?cmd=phpinfo();
发现代码被后台解析了,并且成功执行了,但是一般情况下这个页面是不能显示出来了,是被过滤掉的,因为这样会暴露里面的配置信息。而这里是因为eval函数我们才能实现代码执行。
这里说一下php中的phpinf代码是表示输出php的配置信息的。如果服务端没有过滤eval这个危险注入函数的话,就会导致代码执行漏洞。
**assert() **
assert()函数是一个断言函数,在php里面判断一个表达式是否成立,返回真或假。如果直接将PHP代码传入也会被执行
三、命令执行漏洞演示
我们只是通过文字解说的话太抽象了,听起来还是懵懂,所以我们来通过使用DVWA靶场来为大家演示命令执行漏洞。
首先我们观察这个页面得知,这里是一个ping装置,就是说类似于我们使用cmd窗口ping的功能
一般来说ping装置只能输入ip进行ping,而输入其他系统则不能成功执行的。这时候如果我们能执行除了ip之外的系统命令,就证明存在命令执行漏洞了。
LOW等级:
我们输入ip试试,可以执行成功
再试一下直接输入其他系统命令。
发现不成功。
说明这里需要使用命令连接符拼接。
然后我们查看一下源码,发现没有任何防护,也就是说我们可以通过这个装置任意执行其他命令
我们试一下拼接系统命令来查看服务器的用户,发现这里居然能执行成功
medium等级
我们再次输入上次那个low等级的命令函数试一下,发现执行失败
我们看一下源码,发现这里多了一层防护,过滤掉了&&和;符号
但是命令连接符可不止这两个啊,既然这两个被过滤掉了,我们使用其他命令
high等级
我们尝试输入了所有的命令连接符去拼接系统命令了,发现都不能执行系统命令了,为啥呢,我们查看一下源码
发现所有的连接符都被过滤掉了,这个可怎么办啊,难道没有办法了吗,不,既然这里直接拼接的命令不成功,那我们试一下绕过
使用空格绕过
成功绕过。
四、漏洞危害
继承Web服务器程序的权限,去执行系统命令或读写文件
可以反弹shell
五、安全防护
服务端过滤危险函数
使用自定义函数或函数库来代替外部命令
————————————————
版权声明:本文为CSDN博主「bk天气」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_49577923/article/details/121341057
版权归原作者 DayGas 所有, 如有侵权,请联系我们删除。