[BJDCTF 2020]easy_md5
[BJDCTF 2020]easy_md5
题目来源:nssctf
题目类型:web
涉及考点:弱比较、SQL注入
1. 题目给了一个传入口,先随便传点数据
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230729150059_image-20230729215424000.png)
- 发现传入什么都没有回显,尝试抓包:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230729150059_image-20230729215606127.png)
- 在相应包中看到hint:
select * from 'admin' where password=md5($pass,true)
这里介绍下md5函数的知识点:
md5($a):返回a字符串的散列值
md5($a,TRUE):返回a字符串散列值的16进制转ascii码值(个人理解,若理解错了请评论区留言指出)
官方说法是:返回原始 16 字符二进制格式(实在理解不了)
看其他大佬的wp,拼接的语句应该是这样的:
select * from 'admin' where password=''or'6.......'
刚才在随便传数的时候,我们可以在url中注意到传入的是password,个人觉得应该是传到了$pass里面 。因此我们需要找一个字符串,这个字符串在进行md5后返回的散列值在ascii之后得到的字符串应该是:'or'6...
,这样在拼接的语句中,相当于把外部单引号闭合掉,形成一个永真的语句(or)
则我们传入字符串ffifdyop
(大佬的wp)
2. 传入后得到以下页面:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230729150059_image-20230729223947999.png)
- 查看网页源代码发现:
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
header('Location: levell14.php');
-->
即我们需要GET传入字符串a和b,使得两者不等,但md5散列值相等,这里利用弱比较,只需md5散列值前几位相等即可
常用的几个见:[SWPUCTF 2021 新生赛]easy_md5
我们直接传入:
?a=QNKCDZO&b=240610708
- 得到第三个页面:
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
与第二个一样,只不过这次需要散列值完全相等,我们抓包进行POST传参:
![](https://images.cnblogs.com/cnblogs_com/blogs/729425/galleries/2326707/o_230729150059_image-20230729225914267.png)
传入后得到flag:
NSSCTF{e2748923-ff73-4822-81bf-7a5b5f73dfd0}
日期:2023.7.29
作者:y0Zero