《SQL注入与防御》

sqli5

1.什么是SQL注入?

* 应用程序在向后台提交SQL查询时,如果为攻击者提供了影响该查询的能力,就会引发SQL注入
*

2.理解Web应用工作原理?

* Web应用包含三层:表示层(浏览器等)、逻辑层(编程语言实现的逻辑)、存储层(数据库)
* Web浏览器(表示层)向服务器(逻辑层)发送请求,服务器通过查询、更新数据库(存储层)来响应该请求。
* Web应用架构
*
* 简单:
*
* 用户激活浏览器并连接到www.victim.com,位于逻辑层的Web服务器从文件系统中加载脚本并将其传递给脚本引擎,脚本引擎负责解析并执行脚本。
* 脚本使用数据库连接程序打开存储层连接并对数据库执行SQL语句。
* 数据库将数据返回给数据库连接程序,后者将其传递给逻辑层的脚本引擎。
* 逻辑层先执行相关应用或业务逻辑规则后以HTML格式返回给表示层。

* 复杂:
*
* 多了一个应用层

3.理解SQL注入原理?

1. 主要攻击方式:

1. 直接将代码插入参数中
2. 将恶意代码插入字符中,将其保存到数据库中,然后视图执行其中的代码

2. 产生过程:

1. 构造动态字符串

* 允许在运行过程中动态构造SQL语句
*
* $query="SELECT * FROM table WHERE id = '$_GET["input"]'";

2. 转义字符处理不当

* SQL数据库将单引号字符解析成与数据间的分界线:单引号外面的内容均是要运行的代码,而用单引号引起来的内容均是数据
* 其他转义字符:空格、双竖线、逗号、点号、双引号、*/

3. 类型处理不当

* 误认为整形不需要”处理,实际上可以用调用函数来执行sql语句

4. 查询语句组装不当

* 多个参数使用时,没有进行限定

5. 错误处理不当

* 将详细的内部错误消息显示给攻击者
* 可操纵错误来获得信息;如构造 ‘and 1 in (SELECT @@version) – 来从错误信息查看版本信息

6. 多个提交处理不当

* 先处理第一个表单才能处理第二个表单,然而只对第一个表单进行过滤,可用工具进行修改提交

7. 不安全的数据库配置

* 权限的配置

3. 根本原因:

* 没有对输入进行过滤
* 攻击者可以操控输入数据

4.SQL注入测试阶段

1. 阶段目标:

* 识别服务器响应中的异常并确定是否是由SQL注入漏洞产生的
* 将确定在服务器端运行的SQL查询的类型(增删查改哪种类型)
* 将攻击代码注入查询中的位置

2. 识别SQL注入规则:

* 识别Web应用上所有的数据输入
* 了解哪种类型的请求会触发异常
* 检测服务器响应中的异常

3. 识别数据输入:

* GET、POST、cookie、主机头、引用站点头、用户代理头等
* 后三种发生的情形:网络监视程序利用主机头等值来创建图形,并将它们存储在数据库中

4. 操纵参数
5. 数据流
6. 识别数据库错误(错误页面)

* 将SQL错误显示在页面上
* 将SQL错误隐藏在Web页面的源代码中以便于调试
* 检测到错误时跳转到另一页面
* 返回HTTP错误代码500(内部服务器错误)
* 自定义404页面

1. 针对上面后三种,可以通过注入永真或者永假的语句进行测试,或者通过区分合法请求和SQL注入行为间的差异

5.SQL注入确认阶段

1. 遵循的原则

* 确认是否存在sql注入漏洞。主要是理解服务器端正在执行什么SQL代码,然后针对每种情况注入相应的条件

2. 测试语句

1. 内联SQL注入(sql注入后,原来的查询仍然会全部执行)

1. 不同的测试语句,根据不同的返回结果进行分析,一般是进行永真永假等

2. 终止式SQL注入(sql注入后,通过将剩余的部分注释掉,从而成功结束原来的查询语句)

1. 注释语法:–(双连字符) /* */(多行注释) #(仅Mysql)

3. 时间延迟(盲注)
* 如果Web应用未显示任何错误,要想识别漏洞,可以向数据库注入时间延迟,并检查服务器的响应是否产生延迟
* 测试语句: ;waitfor delay '0:0:5';--(MSSQL) ;select BENCHMARK(100000,ENCODE('hello','baby'));--(MYSQL) or 1=dbms_pipe.receive_message('RDS',10)(Oracle) ;select pg_sleep(10);--(PostgreSQL)


6.SQL注入利用阶段

1. 利用技术:

* 堆叠查询:指的是在单个数据库连接中执行多个数据库查询
* Oracle:不支持堆叠查询,可以使用PL/SQL匿名块、dbms_xmlquery.newcontext()、dbms_xmlquery.getxml()
*
* and (select dbms_xmlquery.newcontext('PL/SWL块') from xxx ) is not null --

2. 识别数据库

1. 非盲跟踪

* @@version、@@servername、@@language、@@spid
* select serverproperty('xxx') ;xxx为:productversion、edition
* 基于UNION错误推断
* sqli1
*

2. 盲跟踪

* 从字符串连接推断(通过判断哪一个请求会返回与原始请求相同的结果)
*
* MSSQL(+)、MYSQL(空格、concat('a','b')) 、Oracle\PostgreSQL( ||、concat('a','b'))

* 从数字函数推断(通过判断表达式在正确的数据库计算后是否返回整数)
* sqli2
*

* 利用特定特征
*
* 比如可以成功注入waitfor deley则为MSSQL、可以用#注释则为MYSQL等等各自的特征


3. 提取数据

1. 使用UNION语句

1. 可以使用UNION合并两条或者多条查询语句,必须满足要求:1、两个查询返回的列数相同2、两个查询语句对应列返回的数据类型必须相同
2. 注意,NULL值会被转换成任何数据类型
3. 获取准确列数可以使用ORDER BY语句(详细见SQL注入笔记)

2. 使用条件语句

1. 基于时间

* 如果某个查询是存在的,则延迟返回
*
* if (system_user='sa') waitfor delay '0:0:5' --
* substring()三个参数:原始字符串、提取字符的起始位置、提取多少个字符
* benchmark()函数将第二个参数的表达式执行由第一个参数指定的次数

2. 基于错误

* 利用is_xxx函数返回值(0、1、NULL)、case语法(case when condition then action1 else action2 end
* 进行除法计算 例如: id=12/is_systemuser()

3. 基于内容

* 类似基于错误,只是使用加法或减法,根据返回内容的区分来判断

4. 处理字符串

* 通过char()函数转换为处理数字的问题,可利用上面两者
* char()函数接收一个数字作为参数并返回与其对应的ASCII字符

5. 扩展攻击

* 发现用户名长度:select len(system_user),使用除法,根据错误来判断
* 提取每个字符:ascii(substring(select len(system_user) ,1,1))

4. 带外通信(Out of band)

1. 以上情况查询及返回结果始终在同一信道上传输,带外通信是指:通过完全不同的信道来传输结果
2. email

7、SQL盲注

1. 寻找并确认SQL盲注

1. 强制产生通用错误界面

* 构造错误SQL语句触发错误通用界面

2. 注入带副作用的查询

* 时间延迟注入
* 对比语句注入(永真、永假语句进行判断)

3. 参数拆分与平衡

* 分解合法的输入的操作称为拆分;平衡则保证最终的查询中不会包含不平衡的结尾单引号
* 比如id=5 可以拆分为 id=2+3,如果返回正确,说明存在注入
* sqli3

4. sql盲注技术

1. 推断攻击技术(通过响应,一次推断一位或者一个字符)

1. 首先要确认两种状态(真、假),然后通过不同的请求来确认请求的位是不是正确

1. len(SYSTEM_USER)=1-- #判断用户名长度
2. and substring(SYSTEM_USER,1,1)='a #逐位推断判断真假
3. and ascii(substring(SYSTEM_USER,1,1))>127-- #二分法查找推断(没办法并发)
4. and ascii(substring(SYSTEM_USER,1,1)) & 128=128-- #位运算直接找出8bit(可并发)

2. 带外通道技术(通过特殊的通道比如DNS\E-MAIL\HTTP,提取大量数据)

2. sql盲注利用

1. 使用基于时间的技术

1. 原理:当某一状态为真时,可以延迟几秒钟,为假时,能够不出现延迟

2. 使用基于响应的技术

1. 原理:修改查询逻辑,检查位为真时,查询返回结果(或错误),为假时不作响应,这里的错误并不是语法错误,而是查询逻辑的变化

3. 使用非主流通道

1. 数据库连接
2. DNS渗漏
3. e-mail渗漏
4. HTTP渗漏

4. 自动化sql工具

1. Absinthe
2. BSQL Hacker
3. SQLBrute
4. Sqlninja
5. Squeeza

本文属于原创,转载请注明来自tasfa.cn 如有问题请联系管理员root@tasfa.cn

发表评论

电子邮件地址不会被公开。

You must enable javascript to see captcha here!