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 

知识星球