
设计自动化SQL注入检测工具,通过请求发送模块模拟HTTP请求(支持动态参数与参数化查询识别),参数注入模块生成适配数据库类型的注入Payload(覆盖布尔盲注、报错注入、Union注入),响应分析模块分析响应特征(内容变化、时间延迟、错误信息、Union列数据),测试流程遵循敏感参数优先、多类型覆盖,结果验证通过特征匹配确认漏洞。
老师讲解:
自动化SQL注入检测工具的核心是三模块协同工作,模拟真实攻击场景并分析响应:
' or 1=1 -- '(内容盲注)或' or sleep(5)#(时间盲注);' or 1=1 and select table_name from information_schema.tables where table_schema=database() -- '(适配MySQL/PostgreSQL的报错差异,如MySQL暴露表名,PostgreSQL暴露信息架构表);' union select user()#'(拼接列数据,需列数匹配)。?或占位符标记),若识别为参数化查询则跳过注入测试,避免无效Payload。(类比:请求发送模块像“网络代理”,负责把请求发出去;参数注入模块像“内容修改器”,修改请求中的参数;响应分析模块像“数据解析器”,检查回单里的异常信息。)
| 注入类型 | 检测方法 | 特点 | 适用场景 | 注意点 |
|---|---|---|---|---|
| 布尔盲注 | 响应内容变化(内容盲注)或时间延迟(时间盲注) | 需多次请求,效率低,依赖页面内容变化 | 页面内容简单,无错误信息,无返回列 | 时间延迟设置不当易误判,页面内容无变化时漏报 |
| 报错注入 | 分析响应错误信息 | 需SQL错误暴露,易被WAF过滤(错误信息被过滤),依赖错误信息内容 | 有错误提示的页面,且错误信息未过滤 | 不同数据库报错Payload不同,需适配 |
| Union注入 | 利用Union语句拼接列数据 | 需列数匹配,易被WAF过滤(列数不匹配),依赖返回列数据 | 有返回列的页面,且列数匹配 | 列数不匹配时返回乱码或错误,漏报 |
| 参数化查询场景 | 跳过或调整策略(如模拟参数化请求) | 注入Payload无效,需特殊处理 | 使用参数化查询的页面 | 漏报风险,需识别参数化标记 |
测试登录接口(URL: /login,参数:username(GET/POST)、password(POST)、隐藏参数csrf_token,假设部分页面使用参数化查询,如/api/login?username=...&password=...)。工具流程:
username=admin&password=123&csrf_token=abc。password注入(布尔盲注):
' or 1=1 -- ' → 生成请求:/login?username=admin&password=' or 1=1 -- '&csrf_token=abc。' or 1=1 and select table_name from information_schema.tables where table_schema=database() -- ' → 分析响应错误信息(如“表名:users”)。' union select 1,2,3 from users -- ' → 分析响应列数据(如用户名、ID)。?id=1),则跳过注入,标记为参数化查询,不进行注入测试。伪代码(请求发送模块,含参数化查询识别):
def send_request(url, params, method='GET', is_param_query=False):
if method == 'GET':
url = f"{url}?{'&'.join(f'{k}={v}' for k, v in params.items())}"
else:
url = url
headers = {'User-Agent': 'Mozilla/5.0', 'Cookie': get_cookies()}
if is_param_query:
return "跳过注入测试(参数化查询)", 401
response = requests.request(method, url, headers=headers, data=params)
return response.text, response.status_code
(约90秒)
“面试官您好,我设计的自动化SQL注入检测工具主要包含三个核心模块:请求发送模块、参数注入模块和响应分析模块。请求发送模块负责模拟HTTP请求(支持GET/POST),处理Cookie和Session,还能动态识别URL或表单中的参数(比如参数名或值随请求变化时,通过正则匹配或动态分析实时解析并调整请求)。参数注入模块识别Web应用中的参数(包括隐藏和动态参数),生成不同注入Payload,比如布尔盲注用' or 1=1 -- ',时间盲注用' or sleep(5)#,报错注入用' or 1=1 and select table_name from information_schema.tables where table_schema=database() -- '(适配MySQL/PostgreSQL的报错差异),Union注入用`' union select user()#'。响应分析模块分析服务器返回的响应,提取关键信息(如页面内容变化、时间延迟、错误信息、Union列数据),判断是否存在注入。测试流程是先识别参数,然后对敏感参数(如登录密码)优先测试,再测试其他参数,依次测试不同注入类型。结果验证通过响应变化(如页面显示登录成功、响应延迟5秒、错误信息包含表名或Union列数据)来确认漏洞。比如测试登录接口,注入后页面显示登录成功则判定为布尔盲注,响应错误信息显示表名为报错注入,返回用户列则判定为Union注入。对于参数化查询的页面,工具会检测请求体是否有占位符(如JDBC的占位符),若识别为参数化查询则跳过注入测试,避免无效Payload。”
/page?param1=...¶m2=...)或动态分析请求体中的参数字段(使用正则表达式匹配表单字段,或通过分析请求中的参数变化,实时调整注入Payload的参数名或值)。