Bugku-CTF之备份是个好习惯
Day17
备份是个好习惯
听说备份是个好习惯
本题要点:MD5加密、.bak文件、 strstr()、substr()、str_replace()、parse_str()函数用法
看到一串md5字符
解一下
.
emmm,只能换个思路
备份这个关键字!
我们可以用御剑扫扫
发现.bak文件
小知识:备份文件一般都是.bak或者.swp
把备份文件下载下来,打开之后是网页的源码。
复制网址,访问,弹出下载页面
几个函数的用法:
解释一下
<?php
include_once "flag.php"; //包含 flag.php 文件
ini_set("display_errors", 0); //设置不返回错误信息
$str = strstr($_SERVER['REQUEST_URI'], '?'); //判断URL里是否有问号,存在就返回给 $str
$str = substr($str,1); //获取 ? 后面的值
$str = str_replace('key','',$str); //将 $str 里面的 key 替换为空
parse_str($str);//解析字符串echo md5($key1); //将 key1 进行 MD5 加密并输出
echo md5($key2); //将 key2 进行 MD5 加密并输出if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag"; //如果 key1 和 key2 的值不相等,但是两个的 MD5 相等,就返回 flag
}
?>
分析这段代码,可知:
网页URL应该有两个参数key1和key2,网页显示key1、key2的md5值,如果这俩值比较相等,则显示flag、“取得flag”。
网页已显示的原来是俩默认的md5值哦。现在关键,得到flag,需不同的key1和key2的md5值比较相等。
那么,如何绕过两个不同的值有相同的 MD5?
MD5值比较相等(PHP弱类型)
在PHP中,== 在进行比较的时候,会先将字符串类型转化成相同,再比较。注意,如果比较一个数字和字符串 或者 比较涉及到数字内容的字符串时,则字符串会被转换成数值并按照数值来进行比较。
举个小例子:
var_dump('asdas',0); 和 var_dump('0asdas',0); 的结果都是true。
所以,本题是要两MD5值的字符格式要么全部是字符,要么前面数字是0。
-
我们都知道,MD5 加密是对字符串进行加密,那么如果我们传入的不是字符串,而是一个数组呢? 它没法进行加密,返回空,结果不就相等了吗?
-
众所周知,科学计数法是 *e***** ,那么要使两个数的值相等,就只能是 0e***** ,所以只要找到两个加密之后是 0e 开头的数字,就可以绕过限制了。
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
... ...
更多有关md5碰撞的小知识请见: https://www.cnblogs.com/0yst3r-2046/p/10748412.html
注意~
前面之所以传入的是 kkeyey1 而不是 key1 ,是为了绕过 str_replace 这个函数的限制,这个函数将 key 替换为空,剩下的拼接在一起正好就成了 key1.
方法一:
构造
方法二:
根据前面的分析,我们可以构造:
http://123.206.87.240:8002/web16/?kkeyey1[]=wsafe&kkeyey2[]=sjkfsfd
完成!
参考资料:
http://www.runoob.com/php/func-string-strstr.html
https://www.cnblogs.com/0yst3r-2046/p/10748412.html
--------------------- ┑( ̄Д  ̄)┍ --------------------------
作者:0yst3r[一只在安全领域努力奋斗的小菜鸡]
来源:博客园[ https://www.cnblogs.com/0yst3r-2046/ ] 引用时请注明来源哦~
(๑•̀ㅂ•́)و✧ヽ(✿゚▽゚)ノ(*^▽^*) φ(≧ω≦*)♪
如果本文对你有用,本人不胜欢喜。
The world is your oyster.