代码审计 0x01 start 首先分析代码,函数要求变量$temp不能存在1~9之间的数字, 最后,又要求$temp=3735929054; 这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把 3735929054转换成16进制为0xdeadc0de,记得带上0x; 构造payload

打开题目,又是MD5函数

以为又是一个套路直接md5('240610708') == md5('QNKCDZO')去尝试

结果构造http://123.206.87.240:9009/18.php?username=240610708&&password=QNKCDZO一直失败

后来再审计代码,发现判断的时候用了===,

所以而刚才我用那个的方法MD5只能==弱类型绕过

后来上网搜索发现,MD5无法处理数组

后来构造如下链接,拿到flag

代码审计
0x01 start
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload

题目

代码审计
0x01 start
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload

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

";
}
?>

来整理一下说明缘由。
代码审计
0x01 start
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload
种类的eregi就是在字符串中进行匹配
然后urldecode这个,因为最近就在看代码审计,所以这个还是很熟悉的,如果有需要,请看。

目标

所以我们现在就要对这个进行绕过了。

2. 绕过

首先我们想到的是二次转码,浏览器转码一次,然后urldecode转码一次,那么我们就可以利用%25,转码之后就是%,那么我们只要找到字母的url编码就可以成功绕过了。

构造payload:
代码审计
0x01 start
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload

?id=%25%61ackerDJ
  • 1

代码审计
0x01 start
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload

代码审计
0x01 start
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload

首先分析代码,函数要求变量$temp不能存在1~9之间的数字,

最后,又要求$temp=3735929054;

这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把

3735929054转换成16进制为0xdeadc0de,记得带上0x;

构造payload

?password=0xdeadc0de

拿到flag

代码审计
0x01 start
首先分析代码,函数要求变量$temp不能存在1~9之间的数字,
最后,又要求$temp=3735929054;
这本来是自相矛盾的,但php在转码时会把16进制转化为十进制.于是把
3735929054转换成16进制为0xdeadc0de,记得带上0x;
构造payload

ereg正则%00截断的一道代码审计:

  1. if (isset ($_GET['password'])) {
  2. if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
  3. {
  4. echo '<p>You password must be alphanumeric</p>';
  5. }
  6. else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
  7. {
  8. if (strpos ($_GET['password'], '*-*') !== FALSE)
  9. {
  10. die('Flag: ' . $flag);
  11. }
  12. else
  13. {
  14. echo('<p>*-* have not been found</p>');
  15. }
  16. }
  17. else
  18. {
  19. echo '<p>Invalid password</p>';
  20. }
  21. }

分析代码,有两个函数需要注意:

  1. ereg() 正则限制了password格式,只能是一个或者多个数字、大小写字母
  2. 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

判断是不是有“*-*”

Payload:http://123.206.87.240:9009/5.php?password=1e9%00*-*