sql注入漏洞_原创干货 | 二阶SQL注入漏洞

大家通常谈论的SQL注入都是一阶SQL注入漏洞,但是还有一种二阶SQL注入,原理跟一阶SQL注入相同,只是稍加复杂,而且更加难以发现,难以利用,今天我们来分析一下二阶SQL注入漏洞。

二阶SQL注入原理

首先,要明白一阶SQL注入漏洞是在单个HTTP请求响应中触发的,而二阶SQL注入漏洞则需要两个HTTP请求响应,第一次HTTP请求是精心构造的,为第二次HTTP请求触发漏洞做准备。

在第一个HTTP请求中,攻击者构造脏数据(带有单引号或注释符)存储到数据库中。

在第二个HTTP请求中,攻击者直接从数据库中读取脏数据,没有执行进一步的校验和处理就拼接到下一次SQL查询中,从而造成二阶SQL注入漏洞。

其实,归根结底还是一个信任问题。开发人员信任了从数据库中来的数据,而没有进行处理和净化。

网上有张图对二次注入解释的比较清楚,在这里引用一下:

3df57d700633af8a5e68846ed2bd68d3.png

关于转义函数,我们需要重点关注:addslashes(),mysql_escape_string()和mysql_real_escape_string()。这几个函数,在参数插入数据库时会对特殊字符进行转义,但是保存在数据库中时还是原始格式内容。

二次SQL注入实例

sqlilab是一个SQL注入练习靶场,全面涵盖了各种SQL注入场景,练习SQL注入技术,一定要刷sqlilab。(sqlilab项目下载地址:https://github.com/Audi-1/sqli-labs)

sqlilab中的第二十四关,考察的知识点是二次SQL注入,我们来分析一下这个漏洞和其中的代码:

f177ad00b046fa1bf3575b20a0354ceb.png

登录的位置我们可以尝试是否存在SQL注入,尝试几次后发现行不通,无论输入什么SQL注入语句,都是无异常,如下图:

60f11189a401d0993d60ff92fdf1902e.png

看了源码才知道,这里输入的用户名和密码都经过了mysql_real_escape_string()这个函数的处理。

640243c91da240083e452c34e0414cf7.png

查一下这个函数,它会对SQL语句中的某些特殊字符进行转义:

2756914378a2f20596d2a88f4c26e86d.png

使用了这个函数,基本上注入是不太可能了。

如果仔细看的话,在登录页面下面还有两个功能,一个是忘记密码,一个是注册新用户。我们先注册一个venus用户,密码为111111,然后使用这个用户登录,登录成功界面如下:

88caf4f8c6a6ded49b5945c65d6542f4.png

登录之后,是一个让我们修改密码的功能。

我们看一下修改密码的源码并分析其中的逻辑

406e20244c73ba373823100234ca5d6f.png

可以看到$username是直接从session中获取的,并没有进行转义操作,而其他的几个变量如$curr_pass和$pass都已经经过mysql_real_escape_string函数处理。问题就出在$username这个参数上,session中的username是从数据库中获取到的。

而在这个例子中,我们可以通过注册账号往数据库中写入带有特殊字符的username,我们先看看注册用户的后台处理代码:

e59d32e462d40a922ff9493fa6ddd29e.png

注册用户时,使用了mysql_escape_string()函数,前面提到过,这个函数会对特殊字符进行转义,但最终存储到数据库时还是保留了原始格式,我们可以注册一个venus’#用户来验证一下,密码是123123,注册完成登录:

138bc595f6120e027daeb45f55c3b28a.png

注册成功之后,我们去数据库中查看下当前的用户名和密码:

b1f4273d056b9c551a2567dfbf670112.png

前面的是系统内置的用户,15和16是我们刚才注册的用户。

OK,现在我们来修改venus’#的密码,然后再看看修改密码的SQL语句,这里我们将密码改为123456。源码里的SQL语句如下:

7532b0ef424aeae2e24068bae848f60b.png

将用户名拼接到SQL语句中之后,SQL语句就成为了如下所示:

UPDATE users SET PASSWORD='123456' where username='venus’#' and password='$curr_pass'

由于#号注释掉了后面的语句,所以,我们本来是修改的venus’#的密码,但实际上修改了venus的密码,而且venus’#的当前密码也可以随便输入。

e3f0e70fe8cfcc47e1bd3aa8c879d638.png

8b76e4437e341cebccbba6d703400d21.png

现在我们再来看看数据库中venus用户的密码:

4ee0527a4258aec944888bd1444fd8b3.png

发现venus的密码改变了,而venus’#的密码没有变化。

我们现在用刚才修改的密码123456去登录venus这个用户

d7943dd4d379e76e347088c1cbb5cf33.png

登录成功。

这就是典型的二次SQL注入漏洞。

二阶SQL注入防御

防御SQL注入最有效的方法还是预编译,尽量避免使用SQL语句拼接。

如果使用了SQL语句拼接,要对所有拼接到SQL语句的参数进行严格的净化和处理。

结语

通过上面的讲解和案例分析,相信大家对二阶SQL注入有了一定的了解。二阶SQL注入漏洞比一阶SQL注入更加隐蔽和难以发现,根据二阶SQL注入形成原因,挖掘的时候应该重点关注数据库写入操作,比如创建用户或者是某个请求中提交精心构造的输入,然后逐步跟踪应用程序中可能会使用该输入的地方,来查找应用程序是否会有异常。二阶SQL注入的危害不仅是上文提到的修改管理员账户的密码,根据场景的不同,它的危害跟普通的SQL注入一样。如果在以后的渗透中遇到二阶SQL注入,会继续跟大家分享。

参考文献

1. 《SQL注入攻击与防御第二版》

2.  https://www.jianshu.com/p/3fe7904683ac

a4407c51cc4b8e061c5b80cd842e7a8d.png

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值