2.1.4 常规注入代码审计
上面我们总结了常见的连接方式及可能出现SQL注入漏洞的点,据此我们可以总结出下面这些常见的关键字,通过这些关键字便可快速地定位到SQL语句的附近,进而进行有针对性的审计:
下面笔者使用了一个仅有查询功能的SQL注入演示系统来演示审计过程(代码量较少,便于读者理解)。
首先通过搜索SQL关键字Statement,可以快速地定位以下存在SQL语句的代码段,如图2-22所示。
图2-22 搜索SQL关键字Statement
跟进“statement.java”文件,可以明显地看到当前SQL语句直接拼接了外部变量id的值,如图2-23所示。
图2-23 SQL语句直接拼接了外部变量id的值
继续向上追踪代码可以发现:id作为UserInfoFoundDao方法的参数被传入。双击选中id,然后单击“Navigate-Call Hierarchy”,通过查看调用栈可以找到其引用,如图2-24所示。
图2-24 通过查看调用栈可以找到其引用
通过查看调用栈在“selectInfoServiceImpl”文件中成功地找到了“UserInfoFoundDao”的调用,如图2-25所示。
图2-25 在selectInfoServiceImpl文件中成功地找到了UserInfoFoundDao的调用
继续查看调用栈,可在InfoServlet.java中找到selectInfoServiceImpl的调用,这里可以明显地看到:id参数通过getParameter从request中获取,并在没有经过处理的情况下在直接传入UserInfoFoundService的过程中进行SQL拼接,如图2-26所示。
图2-26 在直接传入UserInfoFoundService的过程中进行了SQL拼接
至此,我们已弄清了整个漏洞产生的逻辑,现在只需通过web.xml文件找到对应的路由绑定关系,并通过浏览器传入包含SQL注入Payload的id参数即可触发SQL注入攻击。如图2-27所示,绑定的路径是/,所以只要传入相对应的路径及参数即可,因为“/”匹配的是所有路径,可以用/index?id=1来传入相关的数据。
当输入“/index?id=1 and 1=2 union select 1,database(),3”时会返回数据信息,如图2-28所示。
图2-27 路由绑定关系
图2-28 返回数据信息
除了手工注入,我们也可通过sqlmap进行注入,如图2-29所示。
图2-29 通过sqlmap进行注入