(一)出处:
shiyanbar中的一个ctf练习题,题目大概意思是:网页上给定一个sha1的hash值,这个hash值是1-100000中随机的一个整数先通过‘md5‘hash一次,然后再通过’sha1‘hash一次。如果能在两秒之内得到这个值,再输入并提交则过关。题目链接:http://ctf5.shiyanbar.com/ppc/sd.php . 截图下:
(二).分析:
既然是编程题,当然得编程来完成,思路也很简单。笔者用的python。
1.要求要在两秒钟之内完成,相对来说,效率肯定要高:
python的效率在大多数情况相对低级语言来说要低很多,瓶颈所以要竟可能快的得到这个整数,如果先得到网页给定的hash值然后在逐个整数循环计算比较,那就是在浪费这两秒,为了避免时间的不足,这两秒只完成三个任务:
1.获取网页上的hash值。
得到网页上的sha1值,方法很多,beautifulsoup或者re或者xpath等等,re的底层是C实现的,所以效率相对较高,笔者用的是xpath,re是默认自带的库,其他两个是三方库里的,需要提前安装。
2.找出这个整数。
3.提交这个整数。
2.要存储这些整数所对应的hash值:
笔者是使用列表来存储的,查询过程最多消耗100001次,现在绝大部分处理器都是足以胜任的。
3.最好伪装成浏览器:
有些验证可能会对浏览器代理有要求,养成这个习惯还是挺好的,有时可能会写爬虫。
4.post我们得到的值:
要post数据给服务器,首先要得到表单的参数,可以通过浏览器自带的代码检查,或这firebug之类的插件,便可分析出来,笔者用的是wireshark,也可以用其他抓包软件,如下图:
(三).效果如下:
执行脚本后返回的结果里面有通关所需的东西,终端编码有点问题所以显示的乱码:
(四).贴上代码:
#!/usr/bin/env python #-*- coding:utf-8 -*- import hashlib import requests from lxml import etree #The list of saving hash value of these integer l = [] #The User-Agent of Browser header = {"User-Agent":"Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0"} #Target url url = "http://ctf5.shiyanbar.com/ppc/sd.php" #Caculate hash value and save it to list for i in range(1,100001): md5 = hashlib.md5() sha1 = hashlib.sha1() md5.update(str(i)) sha1.update(md5.hexdigest()) l.append(sha1.hexdigest()) #Get target page and obtain the sha1 value on this page ss = requests.Session() ctt = ss.get(url, headers = header).content xml = etree.HTML(ctt) sha = xml.xpath('//div[@name="sha1"]/text()')[0] #Search the hash value and get index value on the list for index ,value in enumerate(l): if sha == value: #post the integer that corresponding the sha1 value data1 = {"inputNumber":index+1} result = ss.post(url,data = data1, params = header).content break #Output return page's content print(result)
(五).说明
这种方式用处还是挺大的,比如登录验证,或者暴力破解登陆验证,或这自动化登陆等等。不过现在很多登陆页面都加入了验证码机制或更高级的机制,稍微会麻烦写,不过现在机器识别还是很强大的,可以用其作为辅助,从而完成更加艰难的任务。
(六).如有错误,还请斧正.
原文地址:http://blog.51cto.com/daye8ku/2057585