• 二阶SQL注入漏洞


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

    二阶SQL注入原理

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

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

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

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

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

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

    二次SQL注入实例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    登录成功。

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

    二阶SQL注入防御

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

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

    结语

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

    参考文献

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

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

    作者:拾瑾
    个性签名:愿历经千帆,归来仍少年.
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    C#枚举(一)使用总结以及扩展类分享
    .NET使用DinkToPdf将HTML转成PDF
    .NET使用MailKit进行邮件处理
    socket+django
    mysql 修改编码格式
    django中Model表的反向查询
    浅谈 session 会话的原理
    浅谈 django Models中的跨表
    django Models 常用的字段和参数
    encoding/xml
  • 原文地址:https://www.cnblogs.com/ayoung/p/14437814.html
Copyright © 2020-2023  润新知