概述
一般通过远程测试判断是否存在SQL注入( 列如,通过internet 并作为应用渗透测试的一部分 )。所以通常没有机会通过查看源代码来复查注入的查询的结构,因此常常需要进行大量的测试。
寻找SQL注入
SQL注入可以出现在任何从系统或用户接收数据输入的前端应用程序中,这些应用程序之后被用于访问数据库服务器。
在Web环境中,Web浏览器是客户端,它扮演向用户请求数据并将数据发送到远程服务器的前端角色。远程服务器使用提交的数据创建SQL查询。该阶段的主要目标是识别服务器响应中的异常并确定是否是由SQL注入漏洞产生。随后,将确定在服务器端运行的SQL查询的类型 ( 即SELECT、UPDATE、INSERT或DELETE ),以及将攻击代码注入查询中的位置 ( 比如FROM子句、WHERE子句或者ORDER BY子句等位置 )。
识别SQL注入漏洞有一种简单规则:通过发送意外数据来触发异常。
该规则的含义:
- 识别Web应用上所有的数据输入。
- 了解那种类型的请求会触发异常。
- 检测服务器响应中的异常。
识别数据输入
HTTP定义了很多很多客户端可以发送给服务器的操作,但我们只需要关注与SQL注入相关的两种方法: GET和POST。
GET方法
使用该方法,信息包含在URL中。
POST请求
在浏览器中填写表单并单击Submit按钮时通常使用该方法。
在客户端用户可以控制这些数据的传递。如果浏览器禁止修改,有两种解决方法:浏览器修改扩展,代理服务器。
浏览器修改扩展是运行于浏览器上的插件,如Firefox浏览器上的Web Developer插件,和Google上的Web Developer插件。它们可以实现显示隐藏字段、清楚大小限制、将所选HTML字段转换成输入字段等任务。
在HTTP请求的其它内容也可能会触发SQL注入漏洞。例如cookie。
引发SQL注入漏洞的两个原因:
- 缺少用户输入验证
- 数据和控制结构混合在同一传输通道中
信息工作流
1. 用户向Web服务器发送请求。
2. Web服务器检索用户数据,创建包含用户输入的SQL语句,然后向数据库服务器发送查询。
3. 数据库服务器执行SQL查询并将结果返回给Web服务器。数据库服务器并不知道应用逻辑,它只是执行查询并返回结果。
4. Web服务器根据数据库响应动态的创建HTML页面。
Web服务器和数据库服务器是相互独立的实体。Web服务器只负责创建SQL查询,解析结果,将结果显示给用户。数据库服务器接收查询并向Web服务器返回结果。我们可以通过操纵SQL语句来让数据库服务器返回任意数据,而Web服务器却无法验证数据是否合法,因此会将数据回传给攻击者。
SQL错误通常与不完整的单引号有关,因为SQL要求必须使用单引号将字母和数字的混合值括起来。
寻找SQL注入漏洞的过程包括识别用户数据输入、操纵发送给应用的数据以及识别服务器返回结果的变化。不过,操纵参数产生的错误可能与SQL注入无关。
确认SQL注入
构造有效的SQL注入语句,需要对SQL语言有个基本的了解。执行SQL注入攻击,首先要清楚数据库包含不同的数据类型,它们都具有不同的表示方式,可以将它们分为两类:
- 数字:不需要使用单引号来表示
- 其他类型:使用单引号表示
内联SQL注入
内联注入是指向查询注入一些SQL代码后,原来的查询仍然会全部执行。
用户名和口令的数据输入会用两个单引号引起来。
用以寻找和确认字符串字段是否存在内联注入漏洞