时间延迟开发技术
当测试人员发现Blind SQL Injection情况时,时间延迟利用技术非常有用,在这种情况下,操作结果中什么都不知道。这种技术包括发送注入查询,如果条件为真,测试人员可以监视服务器响应所花费的时间。如果有延迟,测试人员可以假定条件查询的结果为真。这种开发技术可以不同于DBMS到DBMS(检查DBMS特定部分)。
考虑下面的SQL查询:
SELECT * FROM products WHERE id_product = $ id_product
请考虑对执行上述查询的脚本的请求:
http://www.example.com/product.php?id=10
恶意请求会是(例如MySql 5.x):
http://www.example.com/product.php?id=10 AND IF(version()like'5%',sleep(10),'false')) -
在这个例子中,测试人员正在检查MySql版本是否为5.x,从而使服务器将答案延迟10秒。测试仪可以增加延迟时间并监测响应。测试仪也不需要等待响应。有时他可以设置一个非常高的值(例如100),并在几秒钟后取消请求。
存储程序注入
在存储过程中使用动态SQL时,应用程序必须正确清理用户输入以消除代码注入的风险。如果没有消毒,用户可能会输入将在存储过程中执行的恶意SQL。
考虑下面的SQL Server存储过程:
Create procedure user_login @username varchar(20), @passwd varchar(20) As Declare @sqlstring varchar(250) Set @sqlstring = ‘ Select 1 from users Where username = ‘ + @username + ‘ and passwd = ‘ + @passwd exec(@sqlstring) Go
用户输入:
anyusername or 1=1' anypassword
此过程不会清理输入,因此允许返回值显示具有这些参数的现有记录。
注:由于使用动态SQL登录用户,此示例似乎不太可能,但考虑用户选择要查看的列的动态报告查询。用户可能会在这种情况下插入恶意代码并损害数据。
考虑下面的SQL Server存储过程:
Create procedure get_report @columnamelist varchar(7900) As Declare @sqlstring varchar(8000) Set @sqlstring = ‘ Select ‘ + @columnamelist + ‘ from ReportTable‘ exec(@sqlstring) Go
用户输入:
1 from users; update users set password = 'password'; select *
这将导致报告运行并更新所有用户的密码。