命令执行漏洞

前言:

坚持就是有点麻烦,但是你只要做下去就会感到习惯和快乐的事。

一、命令执行漏洞概念

什么是命令执行漏洞?命令执行漏洞就是服务器端没有对客户端用户输入的命令进行过滤,导致用户可以通过任意拼接系统命令,使服务器端成功执行任意系统命令。为什么客户端能直接对服务器执行命令呢,因为在服务器安装的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等级

我们尝试输入了所有的命令连接符去拼接系统命令了,发现都不能执行系统命令了,为啥呢,我们查看一下源码

发现所有的连接符都被过滤掉了,这个可怎么办啊,难道没有办法了吗,不,既然这里直接拼接的命令不成功,那我们试一下绕过

使用空格绕过

成功绕过。

四、漏洞危害

1. 继承Web服务器程序的权限,去执行系统命令或读写文件

2. 可以反弹shell

五、安全防护

1. 服务端过滤危险函数

2. 使用自定义函数或函数库来代替外部命令


————————————————
版权声明:本文为CSDN博主「bk天气」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_49577923/article/details/121341057

  • 13
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
任意命令执行漏洞是一种常见的安全漏洞,攻击者可以通过该漏洞在受影响的系统上执行任意命令,从而获取系统权限或者进行其他恶意操作。修复该漏洞的关键是要对输入进行有效的过滤和验证,以防止恶意命令的注入。 以下是修复任意命令执行漏洞的一些常见方法: 1. 输入验证和过滤:对于用户输入的数据,应该进行严格的验证和过滤,确保只接受预期的输入。可以使用白名单或正则表达式来限制输入的字符和格式,过滤掉特殊字符和命令注入相关的关键字。 2. 参数化查询:对于数据库查询等操作,应该使用参数化查询或预编译语句,而不是拼接字符串的方式构建查询语句。参数化查询可以有效地防止SQL注入攻击,从而间接防止任意命令执行漏洞。 3. 最小权限原则:在配置系统和应用程序时,应该按照最小权限原则进行设置。即给予每个组件或用户所需的最低权限,避免赋予过高的权限。这样即使发生漏洞被利用,攻击者也只能在受限的权限范围内操作。 4. 安全编码实践:开发人员应该遵循安全编码实践,如避免使用不可信的输入直接拼接命令、避免使用eval()等危险的函数、避免使用系统命令执行函数等。同时,及时更新和修复已知的安全漏洞,以保持系统的安全性。 5. 安全审计和漏洞扫描:定期进行安全审计和漏洞扫描,及时发现和修复潜在的任意命令执行漏洞。可以使用专业的安全工具进行扫描,如静态代码分析工具、漏洞扫描器等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值