TSULOTT
通过查看源代码,可以发现hint,得到源码,这里只贴重点部分。
看到有unserialize
,感觉会考反序列化问题。看到有rand()
感觉会考随机数预测问题。看到===
,一般不存在弱类型问题。从源码上看,这题需要我们预测留个数字,然后序列化再传入并反序列化,与服务器上随机生成的六个数进行对比,若相同则出flag。这题最后用反序列化的方法解出来了。不过这个反序列化的套路跟以前不太一样。利用下面的php代码:
上述代码,将$jackpot
的地址赋给$enter
,相当于两个指针指到了同一块内存区域,所以不管做什么变化,这两个变量的变化是同步的。
访问:
FLAG:
这个思路当时我想到了但没去尝试,因为当时想的是传给enter的jackpot地址是我本机上的地址,跟服务器上的不同,然后就死磕在rand()的预测上。在跟一航大佬讨论后,才知道这个姿势可行。永远不要怀疑自己的脑洞。关于php变量的内存分布之后单独开一篇写。
还有就是对rand()的预测。这个想法不是不无根据,HITCON CTF 2015 Quals Web Giraffe’s Coffee和0CTF 2016 qual rand2都考到过。ph师傅的安全箱子的秘密和Sjoerd Langkemper的Cracking PHP rand()有谈到这个rand()预测的具体技巧和操作。不过我没成功:)
Br0kenMySQL
|
|
从源码来看,逻辑上我们得先让$username
值为guest
进入if判断后,再让$username
的值为admin
,从而echo出flag。而且$id
处可注入。做法是找到一个随机串,利用case语句在不同情况下随机取值,结合爆破,拿flag。
题目把rand()
,floor()
等过滤了,不能直接生成随机数。可以利用mysql内置的一些函数或变量,比如时间戳。因此有了下面的payload:
FLAG:
除了用UNIX_TIMESTAMP(),其他一些函数/变量也行,比如:
Br0kenMySQL v2
|
|
相比较于第一题,过滤了select,和括号(),所以需要换其他方法。类似前面,需要找到一个随机的方法,使得id的值在某些情况下为1(admin),为2(guest),并且不需要括号。比如对一个“随机”值,对其进行mod 2,得到的结果是0或1,我们只要再加上1,就能得到对应的1或2。
几种payload:
当然在发送的时候要进行url编码,+替换为%2b,%替换为%25
|
|
Br0kenMySQL v3
|
|