BugKu之备份是个好习惯

题目:备份是个好习惯

思路分析

打开题目,看到一个字符串。

BugKu之备份是个好习惯_第1张图片

联系到题目,就猜到肯定是源代码泄露,用工具扫一下,发现了index.php.bak,验证了我的猜想,下载下来看看。


源码审计

关注到parse_str函数。

parse_str — 将字符串解析成多个变量

如果 string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。

str_replace — 子字符串替换

str_replace(
mixed $search,
mixed $replace,
mixed $subject,
int &$count = ?
): [mixed]

该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

代码逻辑分析

程序逻辑比较简单:

  1. 提取query string,并去掉?,保存为$str

  2. 使用str_replace$str中的key字符串替换成空格

  3. 使用parse_str$str中的变量解析出来

  4. 判断变量$key1$key2的md5,需要同时满足:

  • md5($key1) == md5($key2)

  • $key1 !== $key2

所以做题思路也很简单,第一步,绕过str_replace。第二步,构造字符串绕过md5值比较。

payload构造

第一步payload:?kekeyy1=a&kekeyy2=a

第二步payload:?kkeyey1=QNKCDZO&kkeyey2=240610708

字符串不相等时如何构造md5相等?

PHP中==是判断值是否相等,若两个变量的类型不相等,则会转化为相同类型后再进行比较。PHP在处理哈希字符串的时候,它把每一个以0e开头的哈希值都解析为0。

在md5加密后以0E开头

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a

在sha1加密后以0E开头

  • aaroZmOk
  • aaK1STfY

获取flag

BugKu之备份是个好习惯_第2张图片

BugKu之备份是个好习惯_第3张图片

你可能感兴趣的:(BugKu之备份是个好习惯)