SQL注入-二次注入攻击

本文详细剖析了二次注入漏洞的原理,通过sqli-labs第24关的例子展示了如何利用这种漏洞。在注册时,仅使用了mysql_escape_string()函数进行过滤,导致数据原样储存。在修改密码时,由于'与#的组合,导致原本要修改的账户密码未变,反而修改了admin账户的密码。这表明即使在第一次插入时进行了过滤,仍可能在数据二次使用时引发安全问题。

SQL注入-二次注入攻击

原理:

二次注入漏洞是一种在 Web 应用程序中广泛存在的安全漏洞形式,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。

在第一次进行数据库插入数据的时候,仅仅只是使用了addslashes或者是借助其他函数进行过滤,这些函数会在特殊字符前加\造成过滤的效果,但是\并不会插入在数据库中,我们输入的东西会原样储存到数据库中,虽然防止了一次注入,但如果可以二次使用该数据时,就有可能造成注入。

二次注入通常存在用户注册->修改密码邮箱注册->修改密码文章添加->文章编辑等数据可以二次使用的地方。

根据例子看二次注入:

环境:sqli-labs第24关。

我们先查看一下users表中的内容:
image-20220816085031034

记住这个admin用户。

然后我们回到第24关,点击注册账户:

image-20220816084909848

我们注册一个账户:用户名为admin'#密码123456

image-20220816085217816

我们检查一下表中的内容,看看是否原样插入:
image-20220816085448517

可以看到,我们的数据被原样插入。

接下来我们再修改这个账户的密码:原密码随便输入也没问题,修改成aaaaaa。image-20220816085740045

修改成功后我们再去数据库查看:
image-20220816085934650

我们发现,我们修改的admin'#账户密码并没有变,反而admin账户密码被更改。

解析:

一、为什么我们输入的账户会原样插入到数据库?

进入Less-24文件夹,查看login_create.php:
image-20220816090514918

我们发现他只用了mysql_escape_string()函数做过滤,这个函数会在特殊字符前加上\转义,但\不会插入到数据库中。

二、为什么我们修改的是admin'#,而被修改的是admin账户?

查看pass_change.php:image-20220816091128379

我们把这句复制下来:

UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'

把username的位置换上admin'#就会发现:

UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass;

我们的'与前面的闭合,而#将后面的注释掉,整个语句就只剩下了:

UPDATE users SET PASSWORD='$pass' where username='admin'。所以admin账户密码被更改了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小洋葱头头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值