昨天参加了补天白帽子沙龙成都站。期间,主办方搞了一道CTF,一共三个关卡,最终拿到Flag可以获得奖品。
先吐槽一下,第一个关卡的tips出来之前我的电脑就断电了(主办方都不准备个电源插头之类的,差评)!于是只能眼睁睁看着会场上各位表哥去夺旗了。
0x01 关卡一关键字:php弱类型、“0e”、爆破
http://btctf.secbox.cn/
放出题后很长时间没有tips,这段时间应该做出来这道题吧!当我电脑断电自动关机的时候,放出了tips 1 (无语凝噎……)
tips 1:
<?php $flag = '{下一关地址}'; $name = $_POST['name']; $pass = encode($_POST['pass']); $admin_user = "admin"; $admin_pw = get_hash("0e260265122865008095838959784793"); if ($name == $admin_user && $pass == $admin_pw){ echo $flag; }else{ echo "Guess it ?"; } function get_hash($hash) { return preg_replace("/[^0-9a-f]/","",$hash); } function encode($str) { return get_hash(md5(md5($str) . "SALT")); } ?>是不是看到了熟悉的‘0e’打头的md5,这里需要密码的encode函数加密后内容为‘0e’打头即可成功获取下一关地址。
其实0e开头的字符串会被php解析为0,这是一个叫做‘Magic Hash’的PHP漏洞,我们来看看CodeSec上的介绍:
最近一个被称为“Magic Hash”的PHP漏洞可以使得攻击者非法获取用户的账号信息。漏洞原因是PHP以一种特定的方式处理被哈希的字符串,攻击者可以利用其从中尝试并可能获取密码,绕过登录认证系统和其它运行在PHP哈希比较之上的函数。
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
攻击者可以利用这一漏洞,通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,尽管并没有真正的密码。
简而言之,md5后的‘0e’==‘0e’结果为真。
那么这里的 md5(md5(str),"SALT") 该如何得到这样一个符合条件的pass呢?看来只有爆破了。可以在web上直接爆破,亦可以在本地搭建环境爆破,这样会快很多。
符合条件的结果理论上不止一个,不过这里有一个就可以了。比如: 62778807提交得到下一关地址:
0x02 关卡二
关键字:验证码加密解密、PsQREdit
http://btctf.secbox.cn/7c43bc96790717a772d50754f9f1f7e6/
右键源代码看到下面信息:
<head> <title>还我血汗钱</title> <p>muhe带着小姨子跑了,还我Flag!!!</p> <!--tips:tieba&机器人--> </head> <body>于是听话地去贴吧看看吧:
看到那张二维码,后来官方给出了tips 2: 鸟叔英文名+二维码英文
Psr/qr code 就在说那个工具吧:PsQREdit
需要密码,这个时候想起了robots里边的passwd:
http://btctf.secbox.cn/7c43bc96790717a772d50754f9f1f7e6/passwd得到一个64位字符串,前后解密分别为butian/ctf,密码就是butianctf,拿到下关地址:
关卡三
关键字:Apk逆向
http://btctf.secbox.cn/m/x/n/y/xiaolu.apk
不懂apk逆向,找同学去玩了,出来了更新在这里。
tips 3:就一个简单的tea加密,把解密的结果放到apk里重打包运行就行了,密钥在Java里都是明文