学了java se的一些知识,了解了web请求在代码层的一些实现,也就是Java的分层原理什么的,还有漏洞原理。所以基础铺的差不多了,就开始找一些cms去审计,从中遇坑,排错,慢慢提高了。
这次专门找了一个cms审计一下。如何刚开始学的话,可以看一些网上审计的文章,跟着复现一下,对应源码分析一下。之后自己审一下已经爆出的漏洞系统,再去看一下网上的对应分析文章。如果一直跟着做的话,进步不了。还是要自己去做一遍。
拿到源码的话,我通常会看一下登录逻辑和拦截器。当然还有第三方组件。
先看登录的代码实现。
最重要的是这段代码
SysUser user = service.findByName(site.getId(), username);
一步步跟进发现如下
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的代码逻辑如下
接着往下
||与&&的区别就不说了
上图代码,如果ip没有锁定,验证码不为空,启用了验证码功能,代码执行的含义如下。
获取名为 "captcha" 的 Session 属性,然后,将验证码从会话中移除,以避免重复使用或造成安全问题。
之后判断验证码错误或者验证码与sessionCaptcha不相等,就会对
ITEM_TYPE_LOGIN,ITEM_TYPE_IP_LOGI类型进行加锁操作,就是往数据库增加值,满次数后就会锁定。并将错误信息保存到日志中。这里进行了
Hibernate 持久化类的对象操作。向数据库进行了查询。ITEM_TYPE_LOGIN,ITEM_TYPE_IP_LOGI分别代表
userLogin与ipLogin
来仔细说一下lockComponent.lock方法内容实现,传入参数site_id ,type,ip,之后到数据库查询,具体如下
以下是写入的内容(pass为空就会写入,具体看往上数第二个图,因为pass为空,所以执行lock方法,进行写入锁定次数,也就是count值,看这篇文章的应该都是小白,嘿嘿,说清楚点。)
如果再次错误就会增加1,代码与效果如下
这下就与上文中的isLocked方法对应上了,iplogin的登录count是20。满20就会锁定