在某些情况下,此转义功能将失败。最明显的是不使用单引号时:
string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index
在这种情况下,您可以使用双引号,反勾号“突破”。在最后一种情况下,没有什么可以“突破”的,因此您可以编写1 union select password from users--
攻击者想要的任何SQL有效负载。
此转义功能将失败的下一个条件是,如果在转义字符串后采用了子字符串(是的,我在野外发现了这样的漏洞):
string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";
在这种情况下,转义功能abcdefgji'
会将用户名转换为abcdefgji''
,然后abcdefgji'
通过获取子字符串将其转换回。可以通过将密码值设置为任何sql语句来利用此漏洞,在这种情况下,or 1=1--
它将被解释为sql,而用户名将被解释为abcdefgji'' and password=
。结果查询如下:
select * from users where name='abcdefgji'' and password=' or 1=1
前面已经提到过T-SQL和其他高级sql注入技术。《 SQL Server应用程序中的高级SQL注入》是一本不错的文章,如果尚未阅读,则应该阅读。
最后一个问题是unicode攻击。之所以出现此类漏洞,是因为转义功能不了解多字节编码,攻击者可以使用它来“消耗”转义字符。在字符串前添加“ N”将无济于事,因为这不会影响字符串后面的多字节字符的值。但是,这种攻击非常罕见,因为必须将数据库配置为接受GBK unicode字符串(而且我不确定MS-SQL可以做到这一点)。
二阶代码注入仍然是可能的,此攻击模式是通过信任攻击者控制的数据源创建的。转义用于将控制字符表示为字符文字。如果开发人员忘记逃脱从获得的值select
,然后使用在另一个查询此值,则BAM攻击者将不得不在他们的处置字符单引号。
测试一切,什么都不信任。
"SELECT * FROM MyTable WHERE Field = " + userInput
whenuserInput
is0; DROP TABLE OhNo;
。