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__);
可以看到需要get一个flag变量,第一个绕过
else if (strlen($_GET['flag']) != strlen($exam)) {
echo '长度不允许';
}
flag的长度要等于exam=49
第二个绕过,flag,echo,[ ]等被过滤,
else if (preg_match('/`|"|\.|\\\\|\(|\)|\[|\]|_|flag|echo|print|require|include|die|exit/is', $_GET['flag'])) {
echo '关键字不允许';
}
第三个绕过,这里传入的flag值要等于原本的flag的sha1值,但是flag根本不知道,,所以这里就要利用eval函数的短标签绕过了
else if (eval($_GET['flag']) === sha1($flag)) {
echo $flag;
}
(不知道为什么,从我的笔记复制过来就有显示问题,就用图片来代替吧)
拿到
从输出了“马老师发生甚么事了”可以看到我们其实是没有让传入的flag=sha1($flag)的,而是直接让eval函数输出flag