RCE漏洞

  RCE命令一般发生在远程,有两种执行方式,远程命令执行(RemoteCommand Exec)和远程代码执行(Remote Code Exec)。命令注入就是通过注入一些特殊字符,改变原本的执行意图,从而执行攻击者指定的命令。

1.原理

  当调用函数执行命令且未对输入做过滤时,通过注入恶意命令,会造成巨大的危害。如下面PHP中的system()函数:

<?php
$dir = $_GET['d'];
system("echo ".$dir);
?>

  该代码的该代码的正常功能是调用操作系统的echo程序,将从d参数接收的字符串作为echo程序的输入,最终system()函数将echo程序执行的结果返回在网页中,其在操作系统执行的命令为“echo for test”,最终在网页显示为“for test”。但是当改变d参数为“for test %26%26 whoami”时,网页会多出whoami程序的执行结果,%26是“&”的编码。
在这里插入图片描述
  在各类编程语言中,“&&”是and语法的表达,一般通过调用时当两边的表达式都为真时,才会返回真,类似的语法还有or,通常用“||”表示。注意,它们存在惰性,在and语法中,若第一个表达式的结果为假,则第二个表达式不会执行,因为它恒为假。与or语法类比,若第一个表达式为真,则第二个表达式也不会执行,因为它恒为真。

2.命令执行基础

  首先了解cmd.exe、bash程序在解析命令时的规则,掌握Windows、Linux的异同点。

2.1 转义字符

  如果想去掉特殊字符的特殊意义,就需要进行转义,所以转义字符即为取消字符的特殊意义。

  • Windows:转义字符为"^"。
  • Linux:转义字符为""。
2.2 多条命令执行

  命令注入通过注入多条命令来扩大危害。

  • Windows:&&、||、%0a
  • Linux:&&、||、;、$()、"、%0a、%0d。
  • 可以使用||过滤前面可能出错的命令如:ttt || echo jjwzzd,ttt程序本身不存在,所以报错,但是通过注入“||”字符,即使前面报错,还会执行后面的“echopwnpwnpwn”命令。
  • &&”和“||”利用条件执进行多条命令执行,“%0a”和“%0d”则是由于换行而可以执行新的命令。
  • 在Linux中需要注意,双引号包裹的字符串“$()”或“``”中的内容被当作命令执行,但是单引号包括的字符串就是纯字符串,不会进行任何解析。
    在这里插入图片描述
2.3 注释符号
  • Windows:::
  • Linux:#

  与代码注释一样,当合理利用时,命令执行能够使命令后面的其他字符成为注释内容,这样可以降低程序执行的错误。

3.绕过

3.1 缺少空格

  禁止空格的出现或者会将空格过滤为空,下面将讲解如何突破。例如,对于如下PHP代码:

<?php
$cmd = str_replace(" ","",$_GET['cmd']);
echo "CMD:". $cmd . "<br>";
system($cmd)
?>

  将cmd参数中的空格过滤为空,导致执行“echo 123”命令失败。
在这里插入图片描述
  但是在命令中间隔的字符可以不只是空格(URL编码为“%20”),还可以利用burp suite对%00~%ff区间的字符串进行测试,可以发现还能用其他字符进行绕过,如“%09”“%0b”“%0c”等。以上只是其中一种通用去Fuzz未知情况的方式。若将“%0a”“%0d”等不可见字符都禁止,还可以通过字符串截取的方式获取空格。

(1)windows如:%ProgramFiles:~10,1%

  • “~”相当于截取符,表示获取环境变量%ProgramFiles%的值,一般为C:\Program Files。
  • 所以,以上命令表示,从第10个开始且获取一个字符串,也就是空格。
    在这里插入图片描述

(2)Linux

  • $IFS$9 绕过空格
  • {cmd,args} bash有效,zsh、dash无效
  • Cat<>flag 读取文件
  • $IFS$9:Linux存在IFS(Internal Field Separator)环境变量,即内部字段分隔符,定义了bash shell的命令间隔字符,一般为空格。注意,当只注入 I F S 时 , 即 执 行 的 命 令 结 果 为 e c h o / IFS时,即执行的命令结果为echo/ IFSecho/IFSaaa,可以发现解析后的$IFSaaa变量是不存在的,所以需要间隔符来避免,通常使用“$9”。“$9”表示为当前系统Shell进程的第9个参数,通常是一个空字符串,即最终能成功执行的命令为“echo$IFS$9aaa”
    在这里插入图片描述
3.2 黑名单关键字

黑名单关键字,如对cat、flag等字符串进行拦截,这时可以用下面的方式绕过。
(1)利用变量拼接 如:Linux:a=c;b=at;c=he;d=llo;$a$b ${c}${d}

  • a变量为c,b变量为at,最终$a$b是cat。
  • c变量为he,d变量为llo,最终${c}${d}为hello。
  • 所以在这里执行的命令是“cat hello”

(2)使用通配符

  • ?”代表任意一个字符串,“*”则代表任意个字符串。
  • Linux:cat /tm?/fl*
  • Windows:type fla*

(3)借用已有字符串

echo expr substr $(awk NR==1 1.php) 1 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晶晶娃在战斗

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值