以管理员身份登录系统 分值: 450
这道题提示很明显了,伪造admin重置密码的链接,发送这个链接重置管理员密码即可拿到key。
首先随便输个邮箱重置密码试一下,抓包发现包里存在三个参数,一个是cookie里面的Cookie: PHPSESSID,由于我对php并不了解,因此又换了一个邮箱重置密码,抓包测试该cookie会不会变,发现不会变,那么关键点多半不在cookie里面。第二个参数是username,这个没什么好说的,伪造请求的时候改成admin就好了,但是单独改了这个参数之后将请求发出去,发现并无卵用,于是看向第三个参数:
sukey,该参数在返回的重置密码的超链接里面。数了数该参数的位数,32位,长得又像md5,因此初步推测是将某种信息进行md5之后的值。那么,将admin重置密码链接的sukey爆破出来,伪造一个请求不就可以拿到key了吗。难点在于怎么找到这个sukey
首先猜测sukey是将用户名进行md5之后得到的哈希值,来做一个小小的验证:随便输入一个邮箱:123@163.com,获取该邮箱重置密码请求的sukey,拿到https://www.somd5.com/上一解密,结果是1523349779
????????
和想象中的123@163.com完全不一样,因此猜测不是将用户名md5之后的结果。
这时候不懂就问百度,百度的结果说像是一个时间戳,那么猜测sukey是将时间戳进行md5之后的哈希值。
时间戳的哈希的话,完全可以生成一个时间戳哈希的字典,逐一进行爆破。
由于我对php的时间戳并不了解,因此我的思路是将当前获得的一个时间戳设置为起点,每次将其+1,计算哈希之后存入文件。比如说我当前获得的时间戳是1523349779,那么就计算区间(1523349779,1523349779+400]中每个整数的哈希值并存入文件(我猜测每次+1就是+1s,如果是毫秒或者更小,我们再将区间拉大并逐一计算哈希就好了),python代码如下:
import hashlib
def md5String(str):
myMd5 = hashlib.md5()
myMd5.update(str)
myMd5_Digest = myMd5.hexdigest()
return myMd5_Digest
if __name__ == '__main__':
f = open("md5.txt","wr")
for i in range(1523349779,1523349779+400,1): #此处写你捕获的时间戳的值
f.write(md5String(str(i)))
f.write("\n")
f.close()
计算得到的hash如下:
然后我们将重置密码的get请求送往Intruder,将sukey=§c447352e51484367f7073f9ce06cc019§设置为载荷,将username设置为username=admin(当然,之前你需要先向服务器发送一个重置admin密码的请求),在payloads里面的payload Options [simple list]里面点击load,将txt文本里面的hash加载进去,然后点击start attack.
等待爆破的过程中点击length对返回的请求做一个排序,当爆破到正确的hash的时候会发现有一个response的长度格外的与众不同:
点击response就可以看到flag了。
当然,厉害的也可以自己写python脚本,一边生成hash一边发送请求并对返回结果进行判断。我没有这个本事,只能用burpsuite进行爆破。