Fork me on GitHub

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。
  1.    我们都知道,MD5 加密是对字符串进行加密,那么如果我们传入的不是字符串,而是一个数组呢? 它没法进行加密,返回空,结果不就相等了吗?
  1.   众所周知,科学计数法是 *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://www.runoob.com/php/func-string-strstr.html
https://www.cnblogs.com/0yst3r-2046/p/10748412.html
posted @ 2019-04-22 09:42  0yst3r  阅读(1603)  评论(0编辑  收藏  举报
返回顶部