From ChaMd5安全团队核心成员 Pcat
web100
xctf2017第二站的zctf,web100的链接点开之后,只看到ha?一个
作为ctf的web第一题,题目简介是“简单点”,那么先查找源代码、header等信息,没发现什么有用的,于是直接上简单的扫描器,扫到了一个1.php,进去后是phpinfo();的界面
翻阅一番后没发现什么,估计是个坑。于是回到index.php,继续看那个ha?,按以往经验,ctf的web题一部分是有源码的(让人可以源码审计,不然纯黑盒测试就太难了),所以先尝试常见的源码备份,幸运的是访问.index.php.swp(最前面有一个点,表示是隐藏文件,.swp文件是因为vi不正常退出产生的)有效,右键查看源码即可得到如下源码。
源码分析如下:
1. get提交flag参数
2. flag中不能等于15562
3. flag中要包含zctf字样
4. md5(flag)的中间16位要跟md5(15562)中间16位相等
(php的substr(string,start,length)相当于python的string[start:start+length])
只要满足以上提交就可以得到flag
前3点都简单,关键是第4点,要md5相同,那么我们先算15562的md5值,45961dd50e46379442318098474e0ced ,中间16位是0e46379442318098
这个0e46379442318098很特别,0e开头,跟着14个数字,在php弱类型转换中,可以转换为0(0e这种可以视为数字的科学计算法)
所以一个思路就是我们也找一串字符串,包含zctf字样,然后其md5值的中间16位以0e开头,并且后面带着14位数字(不能含a-f十六进制的,0e头跟0x头不同)
依照这个思路,我编写了如下的py文件
代码中建议用re.match来匹配0e字符串就简单,其他的只要符合刚才分析的思路即可,运行后得到的值(不管多长,我们这里没追求优化),get提交即可得到flag。