mysql addslashes()函数_addslashes()函数绕过

本文详细探讨了MySQL的addslashes()函数在防止SQL注入时可能遇到的编码绕过问题,包括URL解码和Base64解码两种绕过方法,并提供了测试代码示例。通过这些案例,读者可以理解如何在特定情况下规避addslashes()的过滤,增强对SQL注入漏洞防范的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

该文章主要描述了addslashes()函数常见的编码绕过的情况

2020-01-07

天象独行

函数addslashes()作用是返回在预定义字符之前添加反斜杠的字符串。预定义字符是单引号(')双引号(")反斜杠(\)NULL。比如下图,这样就造成了得结果是我们无法在注入的过程当中使用单引号(’)。在字符行注入的时候是比较头疼的一件事情。下面我们讨论一下一些情况可以绕过addslashes()函数。

51ebd82b669410c9c1920f15f08324fb.png

测试代码如下:

1

2

3

4

过滤函数和类---addslashes()函数

5

6

7

8

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。预定义字符是单引号(')双引号(")反斜杠(\)NULL


9 10 Username :
11 Password :
12
13 14 <?php15 function deep_addslashes($str)16 {17 if(is_array($str))18 {19 foreach($str as $key=>$val)20 {21 $str[$key] = deep_addslashes($val);22 }23 }24 else25 {26 $str = addslashes($str);27 }28 return $str;29 }30 $username = $_POST["username"];31 $password = $_POST["password"];32 if (empty("$username") or empty("$password"))33 {34 die("输入字符不能为空");35 }36 echo '$_POST接收后的username值:';37 echo "$username";38 echo "
";39 //echo $password;40 $connect_sql = mysqli_connect("127.0.0.1",'root','Password@2019','taodb');41 if (mysqli_connect_errno($connect_sql))42 {43 echo "连接数据库失败".mysqli_connect_errno;44 }45 //mysqli_query($connect_sql,"SET NAMES 'gbk';");46 //$username = deep_addslashes("$username");47 //$username = urldecode($username);48 $password = md5($password);49 $sql = "select user_name,pwd from taodb.blue_user where user_name = '$username' and pwd = '$password';";50 echo "查询语句:";51 echo "select user_name,pwd from taodb.blue_user where user_name = '$username' and pwd = '$password';";52 echo "
";53 $result = mysqli_query($connect_sql,$sql);54 echo "登陆输出结果:";55 if (mysqli_fetch_row($result))56 {57 echo "成功登陆";58 }else59 {60 echo "账号或密码错误";61 }62 mysqli_close($connect_sql);63 ?>64 65

测试代码验证:

输入:‘ or 1=1 # 测试发现存在漏洞

f66b19e144a9230bfa8718c038a2a5cf.png

0X01;编码绕过

很少一部分情况下,字符串在传入之后,带入数据库查询之前有个编码解码操作,然而在没有解码之后就没有对参数进行再一次的过滤。这个时候就存在了绕过addslashes()函数的可能性。

1;url解码导致addslashes()。下面我们调整一下代码,加入addslashes()函数以及urldecode()函数处理变量$username。

1

2

3

4

过滤函数和类---addslashes()函数

5

6

7

8

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。预定义字符是单引号(')双引号(")反斜杠(\)NULL


9 10 Username :
11 Password :
12
13 14 <?php15 function deep_addslashes($str)16 {17 if(is_array($str))18 {19 foreach($str as $key=>$val)20 {21 $str[$key] = deep_addslashes($val);22 }23 }24 else25 {26 $str = addslashes($str);27 }28 return $str;29 }30 $username = $_POST["username"];31 $password = $_POST["password"];32 if (empty("$username") or empty("$password"))33 {34 die("输入字符不能为空");35 }36 echo '$_POST接收后的username值:';37 echo "$username";38 echo "
";39 //echo $password;40 $connect_sql = mysqli_connect("127.0.0.1",'root','Password@2019','taodb');41 if (mysqli_connect_errno($connect_sql))42 {43 echo "连接数据库失败".mysqli_connect_errno;44 }45 //mysqli_query($connect_sql,"SET NAMES 'gbk';");46 $username = deep_addslashes("$username");47 $username = urldecode($username);48 $password = md5($password);49 $sql = "select user_name,pwd from taodb.blue_user where user_name = '$username' and pwd = '$password';";50 echo "查询语句:";51 echo "select user_name,pwd from taodb.blue_user where user_name = '$username' and pwd = '$password';";52 echo "
";53 $result = mysqli_query($connect_sql,$sql);54 echo "登陆输出结果:";55 if (mysqli_fetch_row($result))56 {57 echo "成功登陆";58 }else59 {60 echo "账号或密码错误";61 }62 mysqli_close($connect_sql);63 ?>64 65

现在我们再次输入万能密码看看’ or 1=1 # 这个时候我们发现已经无法正常注入且单引号被转义。

30abb8ee91e22ddeab78e636bd0a64c1.png

将万能密码进行url编码,再次注入:

4f1e02e38df778b436a74cc534325b93.png

2;base64解码绕过

测试代码当中插入“$username=base64_decode($username);”

401a77cf07240c395b56853909a1777b.png

编码万能密码:

15be437b6becb76568d9649907f55f45.png

输入成功绕过:

2e14ea7f3bcf6cc1acd9682e0dba3ee6.png

2;宽字节注入

造成这种情况是因为数据库采用的是gbk编码。核心是一个字符串采用不同的编码方式,过滤函数认为是安全的,数据库的编码方式会造成影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值