打开题目,又是MD5函数
以为又是一个套路直接md5('240610708') == md5('QNKCDZO')去尝试
结果构造http://123.206.87.240:9009/18.php?username=240610708&&password=QNKCDZO一直失败
后来再审计代码,发现判断的时候用了===,
所以而刚才我用那个的方法MD5只能==弱类型绕过
后来上网搜索发现,MD5无法处理数组
后来构造如下链接,拿到flag
题目
0x01 start
1.分析
这是一道代码审计的题目。
所以先来看看代码。
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("
not allowed!
");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "
Access granted!
";
echo "
flag
";
}
?>
来整理一下说明缘由。
种类的eregi就是在字符串中进行匹配
然后urldecode这个,因为最近就在看代码审计,所以这个还是很熟悉的,如果有需要,请看。
目标
所以我们现在就要对这个进行绕过了。
2. 绕过
首先我们想到的是二次转码,浏览器转码一次,然后urldecode转码一次,那么我们就可以利用%25,转码之后就是%,那么我们只要找到字母的url编码就可以成功绕过了。
构造payload:
?id=%25%61ackerDJ
- 1
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload
?password=0xdeadc0de
拿到flag
ereg正则%00截断的一道代码审计:
-
if (isset ($_GET['password'])) {
-
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
-
{
-
echo '<p>You password must be alphanumeric</p>';
-
}
-
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
-
{
-
if (strpos ($_GET['password'], '*-*') !== FALSE)
-
{
-
die('Flag: ' . $flag);
-
}
-
else
-
{
-
echo('<p>*-* have not been found</p>');
-
}
-
}
-
else
-
{
-
echo '<p>Invalid password</p>';
-
}
-
}
分析代码,有两个函数需要注意:
- ereg() 正则限制了password格式,只能是一个或者多个数字、大小写字母
- strpos() 查找某字符串在另一字符串中第一次出现的位置(区分大小写),本题中需要匹配到
"
*-*"
才能输出flag
解题方法1:利用数组绕过这两个函数
ereg() 只能处理字符串,而password是数组,所以返回的是null,三个等号的时候不会进行类型转换。所以null!==false。
strpos() 的参数同样不能够是数组,所以返回的依旧是null,null!==false也正确。
Payload:http://123.206.87.240:9009/5.php?password[]=1
解题方法2:%00截断绕过正则匹配
判断是不是长度<8且>9999999
判断是不是有“*-*”