我们要审计 SQL 注入漏洞首先要明白SQL 注入漏洞的原理,SQL 注入漏洞的原理网上文章很 多这里我就不说了,但是我们要明白以下几点:
⑴.jdbc 在SQL 语句中的拼接变量方式:
string sql="select count(*) from tudent where username='"+userName+" ' '" ;
⑵.mybatis 在 SQL 语句拼接变量的方式:
<select id="getAllAutoNodes" resultType = "com.wht.auto.group.NodeVO">
select host_name as hostName
from t_node tn,t_tenant tt
where tn.app_id=tt.app_id
<if test='sql != null and sql !="" '>
and ${sql}
</if>
</select>
⑶.hibernate 在 SQL 语句拼接变量的方式:
usernameString//前台输入的用户名
passwordString//前台输入的密码
//sql 语句
String queryString = "from User t where t.username= " + usernameString + "and t.password="+ passwordString;
//执行查询
List result = session.createQuery(queryString).list();
1.审计前先判断网站用了哪些框架,比如mvc springmvc 等等,这些在 web.xml 都写的很清楚
2.观察web.xml 中是否使用了全局过滤器,从而造成SQL 注入漏洞的成立条件
3.从上面中可以看出 jdbc 和 hibernate 拼接 SQL 语句的方式是直接拼接,而 mybatis 拼接方 式是${}。
审计方法:网上很多文章都说全局搜索关键字比如 select update insert 等,我这里并不使用这种方法,我这里使用的方法是首先判断使用了什么架构,然后从 dao 层开始寻找看 看是否有 sql 语句拼接,然后看调用该 dao 的 service 是否进行了过滤,就这样一直寻找到用户输入的地方,如果寻找过程中这些都没有过滤,那么就是存在 SQL 注入。
4.下面我们根据以上方法开始实战审计某教育系统的SQL注入漏洞,首先我们从dao层开始寻找,这时我们发现dao层存在sql 语句拼接:
从上面代码我们可以发现grade.getGradeName变量存在SQL语句拼接,同时我们也可以看出来gradeCount 这个方法中没有对 grade.getGradeName 进行过滤,我们往前跟踪下,看下调用该 dao的service 层有没有进行过滤该变量,那么怎么往前跟踪呢?我们只需要看哪些方法调用了gradeCount 这个方法即可,eclipse中只需要点击search 搜索即可:
我们搜索时发现GradeListServlet里面的doPost 方法调用了gradeCount方法:
从上面代码中我们可以看出来doPost中的gradeDao调用了gradeCount 方法,但是传过去的是grade 而不是grade.getGradeName,这是怎么回事呢?其实grade 是个实体类。
通过寻找我们发现这个实体类并发现 getGradeName 方法:
从上面代码中我们可以发现grade实体类定义了get set方法,然后我们继续观察doPost 方法看 doPost 方法有没有 grade 进行过滤,从中我们可以发现并没有进行过滤,下面我们继续跟踪,这时我们发现web.xml 文件中有这么一段代码:
从上面代码我们可以看出来提交到gradeList的请求由gradeListServlet 处理,那么我们只需ctrl+f 寻找jsp文件的请求提交到 gradeList 就可以找到前端页面,我们只需要ctrl+f 然后在每个sp 页面中搜索gradeList 即可,通过搜索我们发现gradeInfoManage.jsp 存在下面一行代码:
从中我们发现这段代码提交的请求正是gradeList ,然后我们搜索下gradeName 参数发现很多地方用到了gradeName 参数
可以看出上面两个 div 分别使用了 s_gradeName 和 gradeName 但是第二个的功能是保存显 然不是我们要找的,因为我们的 dao 层是查询,所以前端功能应该是查询才符合我们要找的 参数,但是问题又来了这个参数是$_gradeName 不是 gradeName 不像我们找的参数啊,这 时我们看下面代码会发现这个参数正是我们找的:
gradeName:$('#s_gradeName').val()
为了验证我们代码审计的结果我们来黑盒验证下,首先打开我们审计出问题的页面:
这时我们抓包测试下 gradeName 是否存在注入,我们这里手工测试下:
发现搜索框确实存在 sql 注入,现在我们使用工具对 gradeName 测试下发现确实存在 SQL 注入:
欢迎加我wx,一起交流交流
湘安无事团队 知识星球 一次付费,永久免费,享受两大内部群+星球双重福利(付费之后会拉入内部成员群,直接免费续上)。有需要的直接添加上面微信 118永久,私我支付,直接拉内部成员群,扫码支付,三天后拉内部成员群。
内部群共享
1.fofa高级会员账号
2.360quake高级会员
3.某在线高级会员靶场账号(附带wp)
4.专属内部漏洞库(持续更新)
5.原创漏洞挖掘报告
6.it课表众多好课(持续更新,内容涉及安全+开发等)
7.在线答疑,不定期直播技术分享【湘南第一深情、wuli等】
星球介绍:
星球针对安全新人有优秀学习资源,星球专属嘉宾进行问题解答,
性价比很高。
如果你是入门不久,想要提升漏洞挖掘能力,那该星球是个不错的选择,星球内拥有
专属漏洞报告,
各种奇淫技巧、挖洞技术、专属嘉宾在线问答等。
欢迎您的加入,星球部分内容请你查看!!
星球内容介绍
星球内部提供众多好课
安全类:web安全、内网、src挖掘、kail、逆向、游戏漏洞挖掘、免杀等
开发类:python安全开发、java、Golang、php等开发课程
专栏提供内部漏洞库
专栏内容预览
扫码查看更多内容
文章引用微信公众号"WK安全",如有侵权,请联系管理员删除!