昨天参加了补天白帽子沙龙·成都站。期间,主办方搞了一道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漏洞,我们来看看Freebuf上的介绍:

最近一个被称为“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

提交得到下一关地址:
QQ截图20161023215521.png

0x02 关卡二

关键字:验证码加密解密、PsQREdit

http://btctf.secbox.cn/7c43bc96790717a772d50754f9f1f7e6/

QQ截图20161023220010.png
右键源代码看到下面信息:

<head>
    <title>还我血汗钱</title>
    <p>muhe带着小姨子跑了,还我Flag!!!</p>
    <!--tips:tieba&机器人-->
</head>
<body>

于是听话地去贴吧看看吧:
QQ截图20161023220216.png

看到那张二维码,后来官方给出了tips 2:鸟叔英文名+二维码英文

Psr/qr code 就在说那个工具吧:PsQREdit

QQ截图20161023220547.png
需要密码,这个时候想起了robots里边的passwd:
http://btctf.secbox.cn/7c43bc96790717a772d50754f9f1f7e6/passwd

得到一个64位字符串,前后解密分别为butian/ctf,密码就是butianctf,拿到下关地址:
QQ截图20161023220839.png

关卡三

关键字:Apk逆向

http://btctf.secbox.cn/m/x/n/y/xiaolu.apk

不懂apk逆向,找同学去玩了,出来了更新在这里。(好吧,貌似出官方WP了)

tips 3:就一个简单的tea加密,把解密的结果放到apk里重打包运行就行了,密钥在Java里都是明文

官方WP已出,请点这里查看