java代码审计-sql注入

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一把梭哈