标签:BugKu 变量 备份 习惯 replace mixed str 字符串 md5
题目:备份是个好习惯
思路分析
打开题目,看到一个字符串。
联系到题目,就猜到肯定是源代码泄露,用工具扫一下,发现了index.php.bak
,验证了我的猜想,下载下来看看。
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
源码审计
关注到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
替换之后的结果。
代码逻辑分析
程序逻辑比较简单:
-
提取query string,并去掉
?
,保存为$str
-
使用
str_replace
将$str
中的key
字符串替换成空格 -
使用
parse_str
将$str
中的变量解析出来 -
判断变量
$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,变量,备份,习惯,replace,mixed,str,字符串,md5 来源: https://www.cnblogs.com/zhuangshq/p/15512172.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。