SQL注入
1. SQL注入的理解
SQL:全称:Structured Query Language 结构化查询语言。可以对数据库进行增添删除更新
SQL注入是一种常见的web安全漏洞,形成的主要原因是web应用程序在接受相关数据参数时没有做好过滤,将其直接带入到数据库中查询,导致攻击者可以直接拼接执行构造的SQL语句。
就是在输入url的一行使用sql语句对数据库进行访问,因为web应用程序在接受相关数据时并没有对其仔细过滤,从而让攻击者有机会使用拼接执行构造的sql语句对服务器中数据库的查询
2. 漏洞危害
2.1. SQL注入漏洞对于数据安全的影响:
数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
网页篡改:通过操作数据库对特定网页进行篡改。
网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
服务器被远程控制,被安装后门:经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
2.2. 常见的产生原因
2.2.1. 产生的条件
SQL注入漏洞的产生需要满足以下两个条件:
(1)参数用户可控:前端传给后端的参数内容是用户可以控制的。
(2)参数带入数据库查询:传入的参数拼接到SQL语句,且带入参数库查询。`
3. SQL注入分类
3.1. 按照数据类型分类
3.1.1. 数字型
当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
如 www.text.com/text.php?id=3 对应的sql语句为
select * from table where id=3
3.1.2. 字符型
当输入的参数被当做字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要引号来闭合,而字符串一般需要通过引号来闭合的。即看参数是否被引号包裹
例如数字型语句:select * from table where id =3
则字符型如下:select * from table where name=’admin’
3.2. 数字型注入与字符型注入的分辨
1. 添加单引号',看是否报错。如果报错,可能是字符型注入。
2. 尝试构造恒真条件,比如1' AND '1'='1 或者 1 AND 1=1,根据是否返回正常页面来判断。
3. 使用逻辑测试,比如1 AND 1=2,如果页面结果不同,可能为数字型。
4. 使用注释符,比如-- 或 #,在字符型注入中可能用来闭合引号。
3.2.1. 添加单引号 '
- 测试URL:在参数值后添加单引号,例如 id=1'。
3.2.2. 布尔逻辑测试
- 字符型注入验证:
- 闭合引号并添加恒真条件:id=1' AND '1'='1,若页面正常,则可能是字符型。
- 闭合引号并添加恒假条件:id=1' AND '1'='2,若页面异常,进一步确认字符型。
3.2.3. 其他
- 回显正常---------》联合注入 union select
- 回显报错---------》Error-based SQL injection(报错注入)
- ------------------》extractvalue()
- ------------------》updatexml()
- 无回显(盲注)-----------》
Boolean-based blind SQL injection(基于布尔的盲注)
Time-based blind SQL injection(基于时间的盲注)sleep()
Stacked queries SQL injection(堆叠查询SQL注入)