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

发布时间:2022-03-15 23:40:40 阅读:3555次

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

如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询

转载请注明:sql注入绕过addslashes()函数的几种情况 出自老鄢博客 | 欢迎分享