我们知道,如果程序稍有不严谨,会导致sql注入,轻则数据泄漏,重则删库删表
在php中,addshalshes()函数的作用是在单引号(')、双引号(")、反斜杠(\)和NULL前加上反斜杠,这样可以绕过大部分的恶意SQL注入。但是在某些情况下,该函数会失灵。
>1.SQL语句中传参无单引号闭合
数字型参数往往不需要用单引号(')闭合,比如select productname from product where productID=1 and 1=1.因为SQL语句没有单引号,故攻击者只需在后面加上注入语句,addslashes()函数对这些语句是不起作用的。
这种情况多见于数字型参数注入,解决的方法是先用intval()函数进行强制转换。
>2.宽字节注入
如果mysql连接中有这样的语句mysql_query("SET NAMES 'gbk'"),set character_set_client=gbk就有可能存在宽字节注入,该语句的作用是把传入的参数转换为GBK编码。这时候如果这样注入:id=5',就可以绕过addslashes()函数。
因为addslashes()函数首先在单引号(')前面加一个反斜杠(\),这是id=5\',url编码为id=5\',在GBK编码中\为中文“運”,这就导致后面的单引号逃掉了。
>3.使用iconv().mb_convert_encodeing()函数导致的宽字节注入
$userid = iconv('utf-8','gbk',$userid)
$userid = mb_convert_encoding('utf-8','gbk',$userid)
如果存在这样的注入语句$userid = admin' or 1=1--,那么久可以绕过addslashes注入。原理和2相同
而如果反过来,也同样存在字节注入
$userid = iconv(''gbk',utf-8',$userid)
$userid = mb_convert_encoding('gbk','utf-8',$userid)
只需要把注入语句改为$userid = admin運' or 1=1--,原理同上
>4.编码解码导致的URL绕过
$userid = urldecode($userid) //注入语句进行两次编码,首先通过addslashes()过滤,然后urlencode解码
$userid = rawurldecode($userid)
$userid = base64_decode($userid) //首先通过addslashes()过滤,然后urlencode解码
$userid = json_encode($userid) //该函数把\转换为\\,两个反斜杠抵消。