记一次代码审计某教育系统sql注入

新闻资讯   2023-06-26 08:33   94   0  

我们要审计 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 进行过滤,我们往前跟踪下,看下调daoservice 层有没有进行过滤该变量,那么怎么往前跟踪呢?我们只需要看哪些方法调用了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安全",如有侵权,请联系管理员删除!

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。