[BJDCTF2020]Easy MD5
Step 1
看源代码没线索,用burp抓包看一下:
发现提示,发现输入的是password
要构造使password=’or‘1的形式使之形成永真的语句
md5($pass,true)应该就是将pass的值md5加密后成十六进制转换成字符
这时候276f7227就是十六进制的'or'
,只要MD5加密成276f7227+(非30)+随意填充到16个的字符,由于MD5加密不可逆,这比较难构造。
就上网看了一下wp,发现ffifdyop
返回的散列值的ascii字符串就是'or'6É]é!r,ùíb
,前面是'or'6可以构成永真式
Step 2
来到下一步,查看源代码,顶部发现
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->
是md5弱比较==
法一,0e绕过,百度的智能回答
- 0e绕过:当两个字符串的MD5哈希值以"0E"开头时,它们在弱比较中会被视为相等,即使原始字符串不相等。例如,字符串"QNKCDZO"和"s878926199a"的MD5哈希值都以"0E"开头,因此在弱比较的情况下,它们会被认为是相等的,从而绕过安全检查。
- Payload示例:为了利用这种弱比较的漏洞,攻击者可以构造特定的输入,如"?a=QNKCDZO&b=s878926199a",这样即使"a"和"b"的值在原始形式下不相等,但由于它们的MD5哈希值以"0E"开头且在弱比较中被视为相等,因此可以绕过某些安全检查。
但是比较难记,还有方法
法二,数组绕过
md5不能加密数组 ,如 a[]=1 , b[]=1 , 传入数组会报错,但会继续执行并且返回结果为null
比如传入md5(a[]=1)==md5(b[]=2),实际上是null==null,所以数组进行md5弱比较时,结果相等
payload=?a[]=1&b[]=2
Step 3
得到
<?php
error_reporting(0);
include "flag.php";highlight_file(FILE);
if(\(_POST['param1']!==\)_POST['param2']&&md5(\(_POST['param1'])===md5(\)_POST['param2'])){
echo $flag;
}
三个===,MD5强比较,post传入
hackbar一下,用数字绕过
最后成功获得flag
总结
MD5口诀
数组绕过,0e绕过
QNKCDZO 240610708 常用
md5(\(a)==md5(md5(\)a))
0e215962017
MD5加密登录万能通用
ffifdyop
参考
标签:加密,POST,MD5,Easy,绕过,BJDCTF2020,比较,md5 From: https://www.cnblogs.com/bolerat/p/18319589