代码审计部分
extract变量覆盖
题目
<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content){
echo'flag{xxx}';
}else{
echo'Oh.no';
}
}
?>
extract() 函数从数组中把变量导入到当前的符号表中。
对于数组中的每个元素,键名用于变量名,键值用于变量值。
在这里没有对重名情况进行处理,会导致变量覆盖,所以可以构造payload: ?shiyan=&flag=
strcmp比较字符串
题目
<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else
print 'No';
}
?>
strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算。在PHP5.3版本之后使用这个函数比较array跟sring会返回0。
所以可以构造payload: ?a[]=1
urldecode二次编码绕过
题目
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("not allowed!");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ"){
echo "Access granted!";
echo "flag";
}
?>
①int eregi(string pattern, string string, [array regs]);
eregi()函数在一个字符串搜索指定的模式的字符串,搜索不区分大小写。eregi()可以检查有效性字符串,如密码。如果匹配成功返回true,否则返回false。
eregi()函数漏洞:字符串对比解析,当ereg读取字符串string时%00后面的字符串不会被解析。
②urldecode()可构成二次编码漏洞
这里可以对hackerDJ进行二次编码,只选其中一个字母就行,可以构造:?id=hackerD%254A
得flag
md5()函数
题目
<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and