OAsys代码审计
1. sql注入
全局搜索可以注入的地方${
可以找到sql注入的地方。#{}
是预编译不可以进行注入的。
做了一个简单的判断然后进行拼接操作。
这个语句的id是sortMyNotice
(我没截进去) 然后在这个所属的类
在cn.gson.oasys.mappers
这个包下的.NoticeMapper
类
可以看到是
这就可以看到传入了baseKey
这个参数 然后找到哪里实例化了它
@RequestMapping("informlistpaging") /*GET POST都可以*/
public String informListPaging(@RequestParam(value = "pageNum", defaultValue = "1") int page, /*pageNum 默认值是1 */
@RequestParam(value = "baseKey", required = false) String baseKey, /*required = false可以没有这个参数*/
@RequestParam(value="type",required=false) Integer type,
@RequestParam(value="status",required=false) Integer status,
@RequestParam(value="time",required=false) Integer time,
@RequestParam(value="icon",required=false) String icon,
@SessionAttribute("userId") Long userId,
Model model,HttpServletRequest req){
System.out.println("baseKey:"+baseKey);
System.out.println("page:"+page);
setSomething(baseKey, type, status, time, icon, model);
PageHelper.startPage(page, 10);
List<Map<String, Object>> list=nm.sortMyNotice(userId, baseKey, type, status, time); /*这里就调用了sql语句并且传入baseKey参数, nm是NoticeMapper 做了组合 */
PageInfo<Map<String, Object>> pageinfo=new PageInfo<Map<String, Object>>(list);
List<Map<String, Object>> list2=informRelationService.setList(list);
for (Map<String, Object> map : list2) {
System.out.println(map);
}
漏洞路径:http://127.0.0.1/informlistpaging?baseKey=sqlexp
复现
2. 存储xss (过于冗长不推荐阅读)
我在挖掘xss时候,不会FreeMarker语法所以选择存储xss进行挖掘。
首先要关注数据库,因为因为存储xss数据都会存放在数据中
可以全局搜索save
。
这个可以看name文件可控,但是路径是从数据库获取不可控。 下面的重命名文件夹也会有存储xss漏洞(我没测,一眼定真)
onlyname方法看看有没有过滤
public String onlyname(String name,FilePath filepath,String shuffix,int num,boolean isfile){
Object f = null;
if (isfile) {
f = fldao.findByFileNameAndFpath(name, filepath); //传入路径、文件名返回对象
}else{
f = fpdao.findByPathNameAndParentId(name, filepath.getId()/*路径ID*/);
}
/*findByFileNameAndFpath来生成查询语句如果查询到了,就代表存在有个文件然后这段代码就解决文件名冲突问题*/
if(f != null){
int num2 = num -1;
if(shuffix == null){
name = name.replace("("+num2+")", "")+"("+num+")";
}else{
name = name.replace("."+shuffix,"").replace("("+num2+")", "")+"("+num+")"+"."+shuffix;
}
num += 1;
return onlyname(name,filepath,shuffix,num,isfile);
}
return name; /*然后就返回name了没做过滤操作*/
}
之后查看findByFileNameAndFpath
这是调用了那个表都使用了什么字段。
一个文件名一个路径
return name之后看上一级
FileList fl = fldao.findOne(renamefp); //findOne 查询对应的ID
String newname = onlyname(name/*文件名我可以控制的参数*/, fl.getFpath()/*传入路径*/, fl.getFileShuffix()/*文件后缀名*/, 1, isfile/*我可以控制的参数*/);
fl.setFileName(newname); //设置文件名
fldao.save(fl); //保存到表里
然后看看哪里调用的rename这个方法 然后找到调用这个路径的ftl文件 之后在这个文件找关键字然后找到页面,我不会看FreeMarker回不回显全看天意
复现
3. xss反射
4. 任意文件读取
我感觉任意文件读取算好挖的了,比sql注入还简单。
首先全局搜索找到可以读取文件的地方,主要是这俩函数File()
进行拼接FileInputStream()
进行读取操作
show/**
中的**
是允许多层级的,然后使用replace函数进行了过滤操作,使用了File()
和FileInputStream()
进行拼接读取路径
复现
可以直接读取maven工程配置文件, 现在网站在D: 盘怎么读取C盘内容?
http://192.168.0.115:8088/show//show..//show../pom.xml
6.越权
越权属于逻辑漏洞,并没有什么特别的函数可以帮助你快速找到漏洞点,相比之下黑盒可能更快出越权漏洞。
代码上主要看有没有做权限校验的逻辑功能。
像这个方法particular
这是查询报销记录的只能财务和管理员能查看,但是这个没做权限校验逻辑导致只要知道接口就可以 调用。
调用数据库了但是没做权限的验证,这就会产生越权漏洞。
只需要便利这两个参数就可以了。
id 是申请人的ID ,typename是报销的类型
复现
使用第权限账号访问接口提交参数就好了
7.越权删除
这个查询到存在的ID就可以进行删除,也是没做权限验证。
复现
payload
http://127.0.0.1:8088/dayremove?rcid=10
知识星球
...