java自动化审计

java自动化审计

codeql

CodeQL是一个免费开源的代码语义分析引擎(GitHub购买之后的开源项目),其利用QL语言对代码、执行流程等进行“查询”,以此实现对代码的安全性白盒审计,进行漏洞挖掘。

靶场

在网上找到的一个简单的靶场,spring的项目,使用的jdk1.8。

codeql安装

到目前为止,codeql已经更新到v2.7.3版本,

  1. 下载codeql:下载地址:https://github.com/github/codeql-cli-binaries/releases

  2. 放入环境变量:export PATH=/Home/CodeQL/codeql:$PATHsource /etc/profile,方便我们后期使用vscode插件。

  3. 下载codeql sdk:git clone https://github.com/Semmle/ql

  4. 下载codeql vsc插件:

image

只需要几步下载就可以完成codeql环境的部署

生成codeql数据库

codeql并不提供语法树解析,只是提供对外查询的接口,所以我们需要给他生成database帮助其进行查询(这里检测的是我在网上clone下的靶场)。

codeql database create databasePath  --language="java"  --command="mvn clean install --file pom.xml" --source-root=sourcePath

databasePath:数据库路径(要保存到哪)

sourcePath:源文件代码存放路径

执行完之后就会生成对应的数据库,这里需要注意,mvn的路径问题。

测试语句

  1. 首先用vscode打开codeql sdk,在ql/java/ql/src下创建一个test.ql来编写测试脚本。

  2. 在codeql选项卡中打开之前创建的数据库

  3. 在test.ql中编写 select “hello word”,右击选择执行ql,选择测试的数据库

如果执行完毕之后出现如下洁面,则说明环境搭建完毕

image

到此为止就可以在test.ql下编写检测脚本了。

codeql语法

和sql语句很类似,可以通过AST视图查看到当前数据库中的内容:

image

这里简单介绍基本的使用方法

from [datatype] var
where condition(var = something)
select var

对应下面的

from int i
where i = 1
select i

第一行指定的变量,第二行条件判断,第三行输出内容。

类库可以通过查看AST中的内容进行确定

名称解释
Method方法类,Method method表示获取当前项目中所有的方法
MethodAccess方法调用类,MethodAccess call表示获取当前项目当中的所有方法调用
Parameter参数类,Parameter表示获取当前项目当中所有的参数

这只是举例说明,例如下面这段代码:

import java
 
from Method method
select method

可以查询出当前项目的所有方法。

下面这段是存在过滤的代码:

import java
 
from Method method
where method.hasName("getStudent")
select method.getName(), method.getDeclaringType()

查找名称为getStudent的方法和对应的类

并且codeql提供了一种谓词的方法帮助来分割复杂的逻辑代码:

import java
 
predicate isStudent(Method method) {exists(|method.hasName("getStudent"))}
 
from Method method
where isStudent(method)
select method.getName(), method.getDeclaringType()

详细的语法内容可以参考:https://codeql.github.com/docs/codeql-language-guides/basic-query-
for-java-code/

污点分析

污点分析可以抽象成一个三元组〈sources, sinks, sanitizers〉的形式, 其中, source即污点源,
代表直接引入不受信任的数据或者机密数据到系统中; sink即污点汇聚点, 代表直接产生安全敏感操作 (违反数据完整性) 或者泄露隐私数据到外界
(违反数据保密性); sanitizer即无害处理,
代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害.污点分析就是分析程序中由污点源引入的数据是否能够不经无害处理,
而直接传播到污点汇聚点.如果不能, 说明系统是信息流安全的; 否则, 说明系统产生了隐私数据泄露或危险数据操作等安全问题.

简单的理解是,source参数输入的位置,sink危险函数执行的位置,sanitizers过滤函数

通过定义上述三点内容可以定位出一条参数传递链,当然sanitizers可以不存在。

设置source

通过override predicate isSource(DataFlow::Node src) {}设置source,这是大多常用的source入口,包括spring的也在其中。

设置sink
override predicate isSink(DataFlow::Node sink) {
exists(Method method, MethodAccess call |
  method.hasName("query")
  and
  call.getMethod() = method and
  sink.asExpr() = call.getArgument(0)
)
}

上述代码是一个谓语,查询方法名为query的方法。

当然,目前检测的是SQL注入,所以当jdbc执行query方法,则为进入了sink。

Flow数据流
from VulConfig config, DataFlow::PathNode source, DataFlow::PathNode sink
where config.hasFlowPath(source, sink)
select source.getNode(), source, sink, "source"

通过config.hasFlowPath(source, sink)设置source和sink,这样codeql就可以帮助自动检测漏洞,检索调用链。

测试

import java
import semmle.code.java.dataflow.FlowSources
import semmle.code.java.security.QueryInjection
import DataFlow::PathGraph


class VulConfig extends TaintTracking::Configuration {
  VulConfig() { this = "SqlInjectionConfig" }

  override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }

  override predicate isSink(DataFlow::Node sink) {
    exists(Method method, MethodAccess call |
      method.hasName("query")
      and
      call.getMethod() = method and
      sink.asExpr() = call.getArgument(0)
    )
  }
}


from VulConfig config, DataFlow::PathNode source, DataFlow::PathNode sink
where config.hasFlowPath(source, sink)
select source.getNode(), source, sink, "source"

上述是拷贝的他人写好的,代码也是上面所讲,运行之后就可以看到所有进入query方法的链路了。

image

可以点击对应的source和sink查看位置,可以看到,codeql已经帮我们整理出了5条调用链

一步步跟踪第一条调用链,可以得出完整的调用链路:

indexLogic.getStudent(username);
indexDb.getStudent(username);
String sql = "select * from students where username like '%" + username + "%'";
jdbcTemplate.query(sql, ROW_MAPPER);

至此,简单的SQL注入就能查询得到。

codeql缺点

虽然codeql的优点非常的多,但是也是存在一个比较明显的缺点:不能直接通过打包好的程序进行代码审计,当你得到的只是一个jar包,那么将会比较棘手,因为现在市面上的反编译程序反编译的结构都是不太满意,在我的使用体验中其实个人感觉idea是算是最完美的了,但是还是可能存在一些反编译出现问题一点语法错误的地方,最终可能导致编译过程中codeql解析的不准确。

Wker_java_audit

从公司回学校又接近三个周的时间了,虽然白天是在上班,但是晚上的时间相对比较宽裕一些,包括现在已经是凌晨了,我还可以在这里敲键盘,主要是工作是在学校进行,我在外面租了一个出租屋,保证自己的工作不会被舍友打扰和打扰到舍友。

在前几天log4j这个洞爆出之前(听说log4j这个在2020年就有人用codeql扫到了),有看到过一篇通过ASM追踪堆栈查看反序列化漏洞的文章,虽然没有完全看完,但是感觉这种自动化代码审计应该是可行的。

所以在回到学校这接近三个周,晚上我都会抽出一点时间实现一下这个自动化代码审计的工具,目前已经简单实现出了一个初代版本,如果反响比较好的话呢我会继续更新。

为了弥补codeql不能够直接检索打包好的程序,所以我在开发了Wker_java_audit,当然名字其实没有想好,暂时先这样子叫吧。

思路

我的思路是这样子的:

  1. 解析jar包,因为打包好的要不是war要不是jar

  2. 解析class文件结构

  3. 反编译class文件,得到方法的语法树,当然其他类似注解,属性之类的都是需要获取的

  4. 优化语法树执行流,其实就是将一些比较笨重的操作进行优化,类似于编译器做的一些优化

  5. 生成java代码,方便进行审计

  6. 编写相应脚本,根据语法树查询危险的数据流向

  7. 脚本中增加过滤,根据过滤函数进行剪枝

大体可以分为上述的7步,也就是将反编译工具和codeql结合起来做到可以实现自动化审计闭源代码的效果。

在这里我还是拿上面的的靶场进行演示。

首先需要准备:

  1. 靶场

  2. Wker_java_audit

使用方法

java -jar DecompileDialog.jar运行起来,运行起来之后将会让你选择项目jar包,我们选择靶场的jar包,程序就会打开。

spring的项目在BOOT-INF\classes中能找到对应的class文件。

首先我们可以先对比一下反编译的效果。

image
image

其实效果上的话呢还是比较相似的。

当然反编译这一块的内容我还是做的比较仔细的,就不给大家完全展开看了,最重要的还是要分享对于分析的思路。

codeql是通过类似于sql语句的方式进行检索的,而我还是沿用之前的cheetah,进行更有逻辑的结构分析。

我给大家带了一个例子,是针对于sql注入的,这里详细给大家介绍一些具体是怎样,这里先给大家看一下执行的结果,选择cheetahLangue标签,挑选script下的sqlI.cheetah然后执行。

image

可以看到,最终也打印出了所有的流程,并且也进行了颜色区分和信息处理。

sqlI.cheetah:

#define filter1=String.valueOf(.*?)
#define filter2=Integer.valueOf(.*?)
function filter(sentence){
	a = StrRe(sentence,filter1);
	if(GetArrayNum(a) != 0){return 0;}
	a = StrRe(sentence,filter2);
	if(GetArrayNum(a) != 0){return 0;}
	return 1;
}
function track(className,methodName){
	array allNode;
	allNode = TrackVarIntoFun(className,methodName,0,"org/springframework/jdbc/core/JdbcTemplate","query",0);
	size = GetArrayNum(allNode);
	if(StrFindStr(GetJavaSentence(allNode[ToInt(size-1)]),".query(",0) != "-1"){
		i = 0;
		print(methodName."参数流动:");
		cc = 7;
		cs = 1;
		while(i < size){
			sentence = GetJavaSentence(allNode[i]);
			if(filter(sentence) == 0){cc = 5;cs = 5;printcolor("想办法绕过此类:",4);}
			if(i == ToInt((size-1))){
				if(cc != 5){cs = 2;cc = 3;}
			}else{}
			if(cc == 5){printcolor("[-]",6);}else{printcolor("[+]",1);}
			printcolor(GetClassName(GetNodeClassName(allNode[i]))."   ",cc);
			printcolor(sentence.StrRN(),cs);
			i = ToInt(i+1);
		}
	}
	return 0;
}
function main(args){
	className = "com/l4yn3/microserviceseclab/controller/IndexController";
	methods = GetAllMethodName(className);
	size = GetArrayNum(methods);
	i = 0;
	while(i < size){
		if(methods[i] != "<init>"){track(className,methods[i]);
}
		i = ToInt(i+1);
	}
}

脚本编写

我来解释一下具体是做了一些什么事情,对于语法不懂的可以看我之前的cheetah渗透测试脚本语言的内容。

首先在main函数中指定我们要检索的class名称,通过支持库中的GetAllMethodName得到所有的方法名称,当然<init><cinit>这两个是构造方法和静态代码块的内容,我们就不看了,如果不是这两个函数,就调用track函数进行分析,track中调用支持库提供的TrackVarIntoFun

TrackVarIntoFun:

参数1:起始类
参数2:起始方法
参数3:起始方法参数下标
参数4:目标方法的类
参数5:目标方法:参数6:目标方法的参数下标
返回值:执行流node数组

通过调用这个函数得到执行流,返回的执行流中包含着class名称和对应的Node,这个Node并不是一个字符串而是一个AST,这个AST通过GetJavaSentence方法可以得到对应的java语句,通过GetNodeClassName可以得到类名称。

下面就是挨个输出,只是输出的时候进行了剪枝,当然这种剪枝并不是完全正确的,但是我咋是没有提供更好的剪枝函数。

这里的剪枝是通过正则匹配Integer.value进行剪枝,当然后期可以自行添加。

如果在路径中存在一处sanitizers,则被阻断,这样就用红色的进行输出。

如果整个路径都没有过滤函数,那最后的sink就用绿色打印出来,这样子会比较直观。

整个脚本没有什么难点,底层的复杂逻辑我已经实现了,但是肯定还是有一些不足的。

我们还可以测试一下里面的XXE漏洞。

image

当然,脚本内容大相径庭,无非就是起始类和目标类有所更改。

TrackVarIntoFun(className,methodName,0,"javax/xml/parsers/DocumentBuilder","parse",0);

当然,如果有兴趣,你也可以看spring的代码:

image

目前存在的一些缺陷,如果有反响的话呢之后会修复的。

  1. or 拼接问题,目前看起来很丑

  2. new int[]{1,2,3} 类似语句解析成分块的问题

  3. 目前只支持追踪参数流向,无法满足很多情况

工作顺利~

我们还可以测试一下里面的XXE漏洞。

[外链图片转存中…(img-ZwYcLtXo-1694482230781)]

当然,脚本内容大相径庭,无非就是起始类和目标类有所更改。

TrackVarIntoFun(className,methodName,0,"javax/xml/parsers/DocumentBuilder","parse",0);

当然,如果有兴趣,你也可以看spring的代码:

[外链图片转存中…(img-K8RKusrF-1694482230781)]

目前存在的一些缺陷,如果有反响的话呢之后会修复的。

  1. or 拼接问题,目前看起来很丑

  2. new int[]{1,2,3} 类似语句解析成分块的问题

  3. 目前只支持追踪参数流向,无法满足很多情况

工作顺利~

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

2023届全国高校毕业生预计达到1158万人,就业形势严峻;

国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

img

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
img

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值