首页 > 技术文章 > 记一次渗透测试(3)

lixiaoyao123 2018-09-19 19:40 原文

网址: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" >&nbsp;&nbsp;
    <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

 

推荐阅读