记一次java代码审计学习
2023-10-11 15:39:46 Author: www.freebuf.com(查看原文) 阅读量:6 收藏

学了java se的一些知识,了解了web请求在代码层的一些实现,也就是Java的分层原理什么的,还有漏洞原理。所以基础铺的差不多了,就开始找一些cms去审计,从中遇坑,排错,慢慢提高了。

这次专门找了一个cms审计一下。如何刚开始学的话,可以看一些网上审计的文章,跟着复现一下,对应源码分析一下。之后自己审一下已经爆出的漏洞系统,再去看一下网上的对应分析文章。如果一直跟着做的话,进步不了。还是要自己去做一遍。

拿到源码的话,我通常会看一下登录逻辑和拦截器。当然还有第三方组件。

先看登录的代码实现。

1696588612_651fe3443447f68697971.png!small

1696589131_651fe54b83e4ac3f89f88.png!small

1696591485_651fee7d6d7d719a40f68.png!small

最重要的是这段代码

SysUser user = service.findByName(site.getId(), username);

一步步跟进发现如下

1696591535_651feeaf998059c94271c.png!small

Hibernate 框架的HQL

书上的一段话

正确使用以下几种 HQL 参数绑定的方式可以有效避免注入的产生。

1)位置参数(Positional parameter)。

String parameter = "z1ng";

Query<User> query = session.createQuery("from com.z1ng.bean.Userwhere name

= ?1", User.class);

query.setParameter(1, parameter);

2)命名参数(named parameter)。

Query<User> query = session.createQuery("from com.z1ng.bean.Userwhere name

= ?1", User.class);String parameter = "z1ng";

Query<User> query = session.createQuery("from com.z1ng.bean.Userwhere name

= :name", User.class);

query.setParameter("name", parameter);

3)命名参数列表(named parameter list)。

List<String> names = Arrays.asList("z1ng", "z2ng");

Query<User> query = session.createQuery("from com.z1ng.bean.User where name in

(:names)", User.class);

query.setParameter("names", names);

4)类实例(JavaBean)。

user1.setName("z1ng");

Query<User> query = session.createQuery("from com.z1ng.bean.User where name

=:name", User.class);

query.setProperties(user1)

所以说预处理了。不存在注入。

isLocked的代码逻辑如下

1696650418_6520d4b24c46afa001fbf.png!small

接着往下

1696645662_6520c21e304625a34da5e.png!small

||与&&的区别就不说了

上图代码,如果ip没有锁定,验证码不为空,启用了验证码功能,代码执行的含义如下。

获取名为 "captcha" 的 Session 属性,然后,将验证码从会话中移除,以避免重复使用或造成安全问题。

之后判断验证码错误或者验证码与sessionCaptcha不相等,就会对

ITEM_TYPE_LOGIN,ITEM_TYPE_IP_LOGI类型进行加锁操作,就是往数据库增加值,满次数后就会锁定。并将错误信息保存到日志中。这里进行了

Hibernate 持久化类的对象操作。向数据库进行了查询。ITEM_TYPE_LOGIN,ITEM_TYPE_IP_LOGI分别代表

userLogin与ipLogin

1696651755_6520d9ebbc1d2c9468514.png!small

来仔细说一下lockComponent.lock方法内容实现,传入参数site_id ,type,ip,之后到数据库查询,具体如下

1696652287_6520dbff8dc270973dbc8.png!small

以下是写入的内容(pass为空就会写入,具体看往上数第二个图,因为pass为空,所以执行lock方法,进行写入锁定次数,也就是count值,看这篇文章的应该都是小白,嘿嘿,说清楚点。)

1696649709_6520d1ed8eef5889ce82a.png!small

如果再次错误就会增加1,代码与效果如下

1696649837_6520d26d9fe9094ca5036.png!small

1696649849_6520d2793bd72acc8bd94.png!small

这下就与上文中的isLocked方法对应上了,iplogin的登录count是20。满20就会锁定


文章来源: https://www.freebuf.com/articles/web/380290.html
如有侵权请联系:admin#unsafe.sh