sql注入绕过addslashes()函数的几种情况

我们知道,如果程序稍有不严谨,会导致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) //该函数把\转换为\\,两个反斜杠抵消。

    A+
发布日期:2022年03月15日  所属分类:未分类

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: