半懂不懂地做出来,总要分析一下
首先这两天的代码审计题给我感觉就是:查函数漏洞
请看这几个例子
1extract变量覆盖
<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));//content=""
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>
isset这个函数只是检查变量是否存在,与变量的值无关
file_get_contents()读入文件时若文件不存在,则返回0
所以只要在地址栏输入?shiyan=即可,或者shiyan=&flag也行。
2strcmp比较字符串
<?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()在5.3版本之前,若比较值不是字符串类型,则return值为0!
所以只要输入?a[]=即可。
3urldecode二次编码绕过
http://123.206.87.240:9009/10.php
<?php
if(eregi("hackerDJ",$_GET[id]))
{
echo("not allowed!");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "Access granted!";
echo "flag";
}
?>
urldecode()解码时“%25”对应的为“%”所以可以通过2次编码绕过第一次,得出flag。
4md5()函数
<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password']))
{
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>
因为md5函数不能处理数组,所以直接用数组储存不一样的数据就可以绕过md5判断。
5数组返回NULL绕过
<?php$flag = "flag";
if (isset ($_GET['password']))
{
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo 'You password must be alphanumeric';
else if (strpos ($_GET['password'], '--') !== FALSE)
die('Flag: ' . $flag);
else echo 'Invalid password';
}
?>
strpos可以查找子字符串位置,无法判断数组,这里又是输入值类型无法判断从而绕过,输入?password[]=aA1(包含大小写字母和数字)即可。
6弱类型整数大小比较绕过
$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;
if($temp>1336)
{
echo $flag;
依旧可以利用数组无法判断的特性绕过,或者可以在末尾加上其他字符,还可以在最后加上%00截断,(is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,引用自https://www.cnblogs.com/GH-D/p/8085676.html)。