网址:http://ctf5.shiyanbar.com/ppc/sd.php
1.登陆该网页
2.分析一下步骤:假设我们已经选定了一个整数,我们首先需要将这个整数进行md5编码,然后再求sha1值,将这个结果与页面中的sha1值进行比对。
如果相同的话,那我们就提交这个整数,用到post命令。
3.因为有时间限制,所以用脚本应该是最快的方法了。为了获取md5,sha1的方法,需要导入hashlib的包,为了获取网页内容,需要导入requests包。
为了方便快捷的获取页面中的sha1值,导入beautifulsoup包。
4.在写代码之前,看一下网页的html。了解一下我们该获取什么标签,以及post的时候以什么关键字来传递参数。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Blast and fast</title>
</head>
<body>
<form name="form1" method="post" action="">
<table border="0">
<tr>
<td>给你一个sha1值,它是0-100000之间的整数的md5值再求取sha1值,请在2秒内提交该整数值</td>
</tr>
<tr>
<td align="center">请在2秒内提交该整数:<input type="text" name="inputNumber" size="5" >
<input name="submit" type="submit" id="submit" value="提交" /></td>
</tr>
</table>
<div name='sha1' style="color:red">96e828d718bbce384ee31e4a53cb10cddc5adc9c</div>
</form>
Wrong parameter!</body>
</html>
因为这个网页需要我们输入一个整数,也就是'inputNumber'的value,然后点击“提交",才算是完成这一整步骤操作。
所以post的时候应该构造'inputNumber':一个整数,‘submit':'提交' 这样的形式。
注意(我也是后来才学到这点):这里的’提交‘应该变为它的url编码形式,这样才能正确post,不能用中文。post的编码为:%E6%8F%90%E4%BA%A4
代码如下:(注释复杂,老鸟见谅)
from bs4 import BeautifulSoup #pthon3.x版本导入bs包需要这么写才可以正确导入,如果是2.x版本的直接import就可以 import requests #导入request包 import hashlib #导入hash包可以编码解码 def get_Flag(content,url,status): for i in range(0,100001):#实现对1到100000的遍历 hashmd5 = hashlib.md5(str(i).encode()).hexdigest() #对整数i进行MD5编码 hashsha1 = hashlib.sha1(hashmd5.encode()).hexdigest() #对MD5的结果进行sha1 if hashsha1 == content: i = int(i)#将i转换为整形 post_Content = {'inputNumber': i, 'submit': '%E6%8F%90%E4%BA%A4'} #post格式是我们找到的整数和模拟点击提交按钮 #submit后面的是提交中文的url编码 查看源代码可以看到格式 result = status.post(url,data=post_Content) #这里要用到我们获取的session来进行post print (result.text) #打印成功后网页的返回页面html内容 break url = 'http://ctf5.shiyanbar.com/ppc/sd.php' status = requests.session() #获取session html = status.get(url).text soup = BeautifulSoup(html,"html.parser") #soup的最常见用法之一,直接获取当前页面的html内容 get_Flag(soup.div.string,url,status)
这里讲解一下soup的很好用的一个用法,我们获取到soup之后,可以用 soup. 的命令来直接获取标签。
如果说想直接获取标签中的字符 比如:<div name='sha1' style="color:red">96e828d718bbce384ee31e4a53cb10cddc5adc9c</div>
就可以写成 soup.div.string 这样它返回的就是标签里面的 96e828d718bbce384ee31e4a53cb10cddc5adc9c
获取什么标签就可以写什么,比如soup.head soup.title 都可以 。
这道题还是比较简单,因为只有一个div标签,所以用soup方式十分方便。
至于为什么要用session进行post等操作,需要了解一下session的机制。
这篇文章写的非常好:https://blog.csdn.net/u014649204/article/details/24119029
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
运行后获得flag
关于beautifulsoup这个强大的库可以看中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html