【web安全】SQL注入漏洞1--寻找SQL注入

时间:2023-01-15 11:53:35

引言

我们在做web应用的时候,经常会根据前台的请求,到后台查询数据。由于前台用户输入的请求是不可信任的, 我们在代码里,如果直接将前台传过来的数据拼接到sql语句中,那么用户就可以构造非法的SQL语句并执行。系统存在SQL注入漏洞会产生较为严重的危害,攻击者可以获取系统数据甚至于拿到系统的权限。

这篇文章, 我们关注如何寻找mysql注入漏洞,也就是先学习如何找到注入点,不进一步研究渗透利用方法。 一般来讲,寻找该漏洞的方法有两类,黑盒与白盒。黑盒是在只能访问web页面的前提下寻找注入点; 而白盒可以审计源码来挖掘漏洞。

本文主要学习如下几点:

  • 黑盒方式挖掘SQL注入
  • 白盒方式挖掘SQL注入
  • 分析一例真实SQL注入案例。

黑盒方式

简单介绍一下黑盒找sql注入的思路。

  • 假如我们在测试渗透一个管理台

  • 我们通常会使用' or '1'='1之类的注入语句来构建一个查询结果永为真的SQL,俗称:万能密码

  • 因此,拿到一个待渗透的管理台,作为攻击者, 我们可以专门找一下这个管理台里有哪些可能存在用户输入查询的地方, 例如用户输入框, 管理台里的查询框, 或者是url中携带的参数。

  • 有的攻击者, 会先收集一下管理台的具体的URL接口, 然后利用攻击在url 中注入单引号, 双引号等信息,请求并获取返回来发现疑似存在注入的点。sqlmap是在进行渗透时候常用的工具,会在后续文章里介绍。

白盒方式

我们也可以通过白盒审计代码的方式来寻找sql注入漏洞。在什么情况下可以获得源码呢, 有可能是开源的管理台代码,也有可能是自己公司的代码, 或者是从其他途径获取到的源代码。 其实,我也做过一段时间开发,如果开发的新功能与用户交互的地方比较多的话, 就需要好好注意了,不仅要实现功能,还要好好防止漏洞的出现,要把所有的来自用户的输入看作是不可信任的,要做过滤。

  • 我们先拿一个简单的例子来讲代码中容易出现的SQL注入漏洞。可以想一下,现在假如你接到了一个需求: 输入学号就可以查询成绩。 那我们肯定是需要根据用户的输入信息在数据库中做查询,在代码实现中,有两个简单的方案思路:
  1. 把用户的输入拼接到SQL语句中
  2. 使用SLQ预编译,其实代码实现也简单,数据库预编译能够绝对避免数据变成代码被执行,时刻将数据和所要执行的代码隔离开来。通过在SQL语句中放置占位符来,然后将带有占位符的SQL语句传给数据库编译,执行的时候才将用户输入的数据作为执行的参数传给用户这一方法,使得其能够拥有防止SQL注入攻击的能力。
    如果采用直接拼接的思路,开发者就需要写一个专门用来过滤的函数,不过稍不注意,这个函数有可能会被绕过的哦,需要考虑全面。

讲个简单的例子:
如果在javaweb程序中,有使用到mybatis,我们就可以仔细审查代码了,mybatis可以方便的将java对象和数据库字段做一个映射, 因为mybatis中 #{}表示占位符预编译, ${}表示直接拼接(这肯定是有风险的,容易产生漏洞的)。如果使用${}的话,就容易有sql注入问题。当然,如果我是一个程序员的话,一下子就把${}拉入黑名单了。

如果在代码中发现类似如下代码:

String sql1 = "select * from t_user where user_name=\""+username+"\" and password =\""+oldpassword+"\";";

很明显, 这是在用户改密码时候用到的。这时, 就可以看看这个变量来源是否做了过滤。 如果恰巧程序员给参数做了过滤,也不要灰心,咱可以看看他的过滤逻辑是啥,有没有绕过的可能哦。

真实案例讲解

其实,个人认为,SQL注入漏洞还是很好防范的,只要用正确的安全编码规范, 对用户的输入做好过滤,基本就没啥问题了。我们训练靶场的时候, 一般会把sql注入做的很明显; 我可以找一个不是靶场的真实案例(github开源项目)来分析一下sql注入漏洞。

  • 若依管理系统sql注入漏洞
    参考文档:
    http://tttang.com/archive/1712/

在源码中, 若依系统 resources/mapper/system/SysDeptMapper.xml 文件有通过使用${}来传入参数,疑似有sql注入漏洞。然后顺着链条,可以找到调用的url, 然后构造请求触发sql注入。

笔者这里有一个小小的疑问:既然${}的方式容易产生sql 注入, 为不直接禁用掉这种用法? 或者,作为程序员, 知道这个有漏洞, 为啥不都在自己代码里禁用掉它的使用呢? 不过,存在必有价值, 也许可能只是我暂时体会不到罢了。

总结

这篇文章主要介绍了寻找SQL的思路。 对于初学者,可能会出现这种尴尬的情况: 找到了一个疑似SQL注入的点,但是不知道如何继续渗透利用,尽可能的获取更多的价值信息甚至于获取到主机权限。 后面我会介绍一下:

  • 如何利用sql注入进行渗透;
  • 如何进行sql 注入的绕过;
  • 如果使用sqlmap工具来进行渗透利用。

参考资料

https://www.yuque.com/maxsecurity/mbxigk/cvlou0