正文  软件开发 > 编程综合 >

Python结合NC.exe 实现模拟登录&批量填表

1.工作需求 有很多事项,每个事项分为:名称、种类。时间等,需要把每个事项逐个输入到网页中并提交。 如果用人肉操作的话,流程就是先登录到网站后台,点击“添加”——>输入各项内容——...

1.工作需求

有很多事项,每个事项分为:名称、种类。时间等,需要把每个事项逐个输入到网页中并提交。

如果用人肉操作的话,流程就是先登录到网站后台,点击“添加”——>输入各项内容——>点击“保存”。然后重复这个动作100遍。如图:

 Python结合NC.exe 实现模拟登录&批量填表

2.设想的解决办法

对手工“登录”、“添加”、“保存”的全过程进行抓包,获取整个流程提交的数据,然后将其POST到服务器。

3.具体操作

3.1 抓取并分析操作时的数据

使用Chrome浏览器,打开所需登录的页面:http://222.000.36.113/ ,并输入账号与密码:

 Python结合NC.exe 实现模拟登录&批量填表

然后按下键盘的F12,浏览器弹出“开发者工具”的界面,选择"Network":

 Python结合NC.exe 实现模拟登录&批量填表

然后将鼠标移回登录窗口,点击“登陆”。然后“开发者工具”界面会出现POST和GET的文件与数据,找出登录对应的文件,点选Header标签。

此时在Form Data里面能看到POST到服务器的参数(明文密码,汗):

 Python结合NC.exe 实现模拟登录&批量填表

登录进去之后,点击“添加”按钮,出来一个表单界面,让填写内容。开始填写各项内容ing(截图只是内容一部分):

 Python结合NC.exe 实现模拟登录&批量填表

辛苦填完之后,点击“保存”。内容就保存在了服务器中。

此时在“开发者工具”里面就能看到点击“保存”按钮后,浏览器的行为:

 Python结合NC.exe 实现模拟登录&批量填表

 Python结合NC.exe 实现模拟登录&批量填表

 Python结合NC.exe 实现模拟登录&批量填表

这次POST的数据类型和登录时的不同了(见红色方框)。

登录时是Form Data,而提交时却是Request Payload。

(这一点在之后的操作中难倒了我。我不会用Python的Requests模块提交这些数据。因为我不知道如何加上Cookie)

以上就是登录+提交的全程。

3.2编程实现

3.2.1 模拟登录获取Cookie

经过我多次试验,发现提交这些数据需要用到Cookie。i所以先模拟登录获取Cookie:

import httplib
import urllib
#定义请求头
reqheaders={'Content-type':'application/x-www-form-urlencoded',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Host':'222.000.36.113',
'Origin':'http://222.000.36.113',
'Referer':'http://222.000.36.113/login_loginOut.fdo',
'User-Agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',}

#定义post的参数
reqdata={'tnnd':'abcdef','tmmd':'mimaqqq'}


#对请求参数进行编码
data=urllib.urlencode(reqdata)
#连接到服务器
conn=httplib.HTTPConnection('222.000.36.113')
#提交登录的post请求
conn.request('POST', '/login_loginIn.fdo', data, reqheaders)
#打印服务器返回请求头中设置的cookie
print(res.getheader('Set-Cookie'))

3.2.2模拟提交

所需提交的Request Payload属于 Multipart-Encoded 格式,在Python的文档里有记载:

http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

文档中的操作方法是: 
url = 'http://httpbin.org/post' files = {'file': open('report.txt', 'rb')}
r = requests.post(url, files=files)
r.text

其中 report.txt 里面就是上图的Request Payload 下方的一长串字符内容。

(可是我按照文档进行操作的时候不成功,是因为服务器需要Cookie而我没加上?那么Requests这个方法怎么加上Cookie呢?)

于是我使用了多年前渗透测试中的一个技巧:

a.先把浏览器提交过程中所有POST的内容全部抓了下来,保存为“1.txt”。用的是WSockExpert。

b.使用NC,“nc 222.000.36.113 80 < 1.txt”,把txt的内容全部提交到目标服务器。

经测试,此方法可行。但要注意两点:

一是Cookie要有效。可以由模拟登录的步骤中获取。

二是1.txt 的编码格式为UTF-8,不然提交的内容全是乱码!

(第二条当时百思不得其解,最终人肉测试了出来。最后才发现response headers写的是charset=UTF-8,忽略了,汗)

那就用Python来调用NC吧:

import os
os.system("nc  222.000.36.113  80  < 1.txt")

剩下的工作,就是将各个事项汇总到一起,然后用Python将对应的事项内容替换到1.txt的那一套格式里面,逐个提交100次!

PS:

请问一下如何用Python提交这个Request Payload?调用NC太不优雅了。