addslashes函数 绕过注入(使用addslashes函数绕过注入)

jk 395次浏览

最佳答案使用addslashes函数绕过注入 在web开发中,使用数据库存储用户的输入是常见的做法。但如果不对用户输入进行过滤和转义,可能会导致SQL注入攻击,使数据暴露在危险之中。addslashe...

使用addslashes函数绕过注入

在web开发中,使用数据库存储用户的输入是常见的做法。但如果不对用户输入进行过滤和转义,可能会导致SQL注入攻击,使数据暴露在危险之中。addslashes函数是PHP语言内置的一个函数,可以对单引号、双引号、反斜杠、NULL字符进行转义,从而防止SQL注入攻击。但有些开发人员错误地认为addslashes是绝对安全的,直接把用户输入参数传入SQL语句,从而给攻击者留下了可乘之机。

1.addcslashes函数绕过

addcslashes是PHP的另一个内置函数,它同样可以对一些字符进行转义。攻击者可以使用addcslashes函数绕过addslashes的转义。

假设代码中有这样的转义:

$username=addslashes($_POST['username']);

那么攻击者可以这样构造payload:

username=\\\\\";

这个payload将会被addslashes转义成:

username=\\\\\\\\\"

这样SQL语句的条件值将会变成一个反斜杠和一个双引号,即\"x\\\\\\\"。攻击者就利用了addslashes和addcslashes的差异,绕过了转义。

2.addslashes函数被禁用绕过

一些程序员在网站开发中,为了打击sql注入,可能会禁用addslashes函数。但这并不能绝对避免注入攻击。

攻击者可以用另一种转义函数代替addslashes函数,如下:

functionaddslashes2($str){ if(get_magic_quotes_gpc()) return$str; returnaddslashes(str_replace(array('\\\\','\"'),array('\\\\\\\\','\\\\\"'),$str)); }

这个函数首先判断系统是否开启了magic_quotes_gpc,如果开启了则直接返回。如果没有开启,那么会用str_replace函数进行转义,将反斜杠和双引号转义。

这样攻击者在构造payload的时候可以这样做:

id=1UNIONSELECTNULL,addslashes2(\"payload\"),NULL--

这个语句将会把addslashes2函数作为SQL语句的一个条件值提交给服务器,由于禁用了addslashes函数,所以它不会被转义。这样攻击者就成功地绕过了addslashes函数的限制。

3.addslashes函数无法转义GB2312字符集

addslashes函数在处理GB2312字符集时有一个很明显的问题:它无法完全转义GB2312的字符。

由于GB2312字符集不仅包含ASCII字符集中的字符,还包含一些多字节字符,这使得在使用addslashes函数转义输入参数时可能会产生漏洞,造成SQL注入漏洞。

假设代码中有这样的转义:

$name=addslashes($_GET['name']);

那么攻击者可以这样构造payload:

name='明天';DROPTABLEuser--'

这个payload中含有两张sql语句,第一句是获取名字为“明天”的用户信息,第二句是删除user表。如果addslashes函数完全转义了单引号,那么攻击者构造的第二句语句理论上无法生效,用户表不会被删除。但现实中情况并非如此,因为addslashes无法完全转义多字节字符,所以攻击者可以绕过这个防护措施。

这种情况下,开发人员应该避免使用addslashes函数对输入参数进行转义,而是采用对应的字符集进行安全的转义操作,或者采用PDO和预处理语句等技术。

结语

addslashes函数虽然具有一定的安全性,但在web开发过程中,也有很多的限制和安全风险,因此在实际使用过程中,必须要注意针对上述情况做好相应的检查和处理工作,避免因为安全性问题而导致应用程序受到攻击。