Java 代码审计常用漏洞总结

admin 2024年5月7日08:25:22评论23 views字数 6755阅读22分31秒阅读模式
免责声明:
本文所涉及的任何技术、信息或工具,仅供学习和参考之用。请勿利用本文提供的信息从事任何违法活动或不当行为。任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。
1.1审计方法总结

主要代码审计方法是跟踪用户输入数据和敏感函数参数回溯:

跟踪用户的输入数据, 判断数据进入的每一个代码逻辑是否有可利用的点, 此处的代码逻辑可以是一个函数,或者是条小小的条件判断语句。

敏感函数参数回溯, 根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效, 最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的, 只要找到这些函数,就能够快速挖掘想要的漏洞。

以下是基于关键词审计技巧总结:

在搜索时要注意是否为整个单词,以及小写敏感这些设置

漏洞名称

关键词

密码硬编码、密码明文存储

password passjdbc

XSS

getParamter<%=param.

SQL注入

SelectDaofromdeleteupdateinsert

任意文件下载

downloadfileNamefilePathwritegetFilegetWriter

任意文件删除

DeletedeleteFilefileNamefilePath

文件上传

UploadwritefileNamefilePath

命令注入

getRuntimeexeccmdshell

缓冲区溢出

strcpy,strcat,scanf,memcpy,memmove,memeccpy

Getc(),fgetc(),getchar;read,printf

XML注入

DocumentBuilderXMLStreamReaderSAXBuilderSAXParser

SAXReaderXMLReader

SAXSourceTransformerFactorySAXTransformerFactory  SchemaFactory

反序列化漏洞

ObjectInputStream.readObject

ObjectInputStream.readUnsharedXMLDecoder.readObjectYaml.load  XStream.fromXML  ObjectMapper.readValueJSON.parseObject

url跳转

sendRedirectsetHeaderforward

不安全组件暴露

activity Broadcast   Receiver Content   Provider Serviceinter-filter

日志记录敏感信息

loglog.infologger.info

代码执行

evalsystemexec

2.1可基于关键词审计的漏洞

2.1.1密码硬编码

审计方法

密码硬编码最容易找,直接用 SublimeText打开项目目录,然后按Ctrl+Shift+F  进行全局搜索password关键词:

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

2.1.2反射型XSS

审计方法: 反射型XSS一般fortify般都能扫描出来

如果是手工找,可全局搜索以下关键词

getParamter

<%=

param.

漏洞代码示例:

1.EL表达式输出请求参数:

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

代码在170行和305行处获取请求参数中的groupId值,在未经检查参数合法性的情况下输出在JavaScript代码中,存在反射型XSS漏洞。

2.    输出getParamter获取的参数

Java 代码审计常用漏洞总结

然后在224 行打印到如下的js 代码中:

Java 代码审计常用漏洞总结

2.1.3存储型XSS

审计方法: 方法有主要有两种:

1.    全局搜索数据库的插入语句(关键词:insert,save,update),然后找到该插入语句所属的方法名如(insertUser()),然后全局搜索该方法在哪里被调用,一层层的跟踪。直到getParamter()方法获取请求参数的地方停止,如果没有全局XSS过滤器,跟踪的整个流程都没有对获取的参数过滤, 则存在存储型XSS

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

2.    getParamter   关键词开始 ,跟踪请求参数,直到插入数据库的语句,如果中间没有过滤参数,则存在存储型XSS

Java 代码审计常用漏洞总结

2.1.4SQL注入

审计方法:

SQL注入一般fortify一般都能扫描出来

手动找的话,一般直接搜索 selectupdatedeleteinsert关键词就会有收获

如果sql语句中有出现+append $()#等字眼,如果没有配置SQL过滤文件, 则判断存

SQL 注入漏洞

Java 代码审计常用漏洞总结

当找到某个变量关键词有 SQL  注入漏洞时,还可以直接全局搜索那个关键词找出类似漏洞的文件,上面中可以直接全局搜索tableName关键词:

Java 代码审计常用漏洞总结

要查找那个页面调用到含有漏洞的代码,就要跟踪方法的调用栈。以上面的注入点tableName为例:

双击打开该文件,然后查看该变量所在函数:

Java 代码审计常用漏洞总结

发现该函数对应的URL/lookOverCubeFile,对应的功能为查看模型任务生成的文件。

2.1.5任意文件下载

审计方法: 全局搜索以下关键词

fileName

filePath

getFile

getWriter

漏洞示例:

Java 代码审计常用漏洞总结

代码在downloadFile()函数中获取请求参数中的affixalName的值,然后赋值给FileName

变量,接着在196 行处通过拼接字符串赋值给downPath 变量,然后在198 行处调用

download函数并把downPath值传进函数,download函数的代码如下:

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

download函数把filePath 处的文件写到http 响应中,在整个流程中并没有对文件名的合法

性进行检查,存在任意文件下载漏洞, 如通过把affixalName的值设置

../../../WEB-INF/web.xml 可以下载网站的web.xml 文件。

2.1.6任意文件删除

审计方法: 任意文件删除漏洞搜索以下关键词可以找到:

delete, deleteFile,fileName ,filePath

漏洞案例:

Java 代码审计常用漏洞总结

代码在41行获取fileName的值,在44行处调用ds.deleteFile()函数删除文件,该函数的代码如下:

Java 代码审计常用漏洞总结

在整个流程中并没有对文件名的合法性进行检查,存在任意文件删除漏洞,如通过把

fileName的值设置为../WEB-INF/web.xml 可以删除网站的web.xml 文件。

2.1.7文件上传

审计方法:

文件上传可以搜索以下关键词需注意有没有配置文件上传白名单)

uploadwrite,fileName ,filePath

在查看时,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单,像下面这种是检查了的:

Java 代码审计常用漏洞总结

下面的这种没检查:

List<FileItem> fileItems = servletFileUpload.parseRequest(request);for(int i =0;i<fileItems.size();++i){

FileItem fi =(FileItem)fileItems.get(i);

String strFileName =fi.getName();

if(strFileName!= null &&!"".endsWith(strFileName)){

String fileName = opId+"_"+getTimeSequence()+"."

+ getFileNameExtension(strFileName);

String diskFileName = path+fileName;

File file =newFile(diskFileName);

if(file.exists()){

file.delete();

}

fi.write(new File(diskFileName));

resultArrayNode.add(fileName);

......

private String getFileNameExtension(String fullFileName){if(fullFileName == null){

return null;

}

int pos = fullFileName.lastIndexOf(".");

if(pos!=-1){

return        fullFileName.substring(pos        +1,

fullFileName.length());

}else{

return null;

}

}

2.1.8命令注入

审计方法:可以搜索以下关键词:

getRuntime,exec,cmd,shell

Java 代码审计常用漏洞总结

在第205 行中, 通过拼接传过来的ip 来执行命令。如果ip 值通过外部传入,则可以构造

以下的ip 值来执行net user 命令:

127.0.0.1&&net user

2.1.9缓冲区溢出

审计方法:主要通过搜索关键词定位, 再分析上下文

可搜索以下关键字:

strcpy,strcat,scanf,memcpy,memmove,memeccpy Getc(),fgetc(),getchar;read,printf漏洞示例:

文件ktframepublictoolsocket_repeatermysocket.h中第177 行,这里的的参数

hostname 拷贝到m_hostname,具体如下图所示:

Java 代码审计常用漏洞总结

m_hostname的大小为MAXNAME

:

Java 代码审计常用漏洞总结

继续看,可以看到大小为255

Java 代码审计常用漏洞总结

如果传入的长度比255 要大,就会造成缓冲区溢出。

2.1.10XML注入

审计方法:

XML解析一般在导入配置、数据传输接口等场景可能会用到, 可通过搜索以下关键字定位:DocumentBuilderXMLStreamReaderSAXBuilderSAXParserSAXReaderXMLReader

SAXSourceTransformerFactorySAXTransformerFactorySchemaFactory

涉及到XML 文件处理的场景可留意下XML 解析器是否禁用外部实体,从而判断是否存XXE漏洞示例:

在代码6行处、获取DOM解析器,解析 XML文档的输入流得到一个 Document

Java 代码审计常用漏洞总结

如果没有禁用DTD则存在XXE漏洞,以下代码为XXE防御代码

Java 代码审计常用漏洞总结

2.1.11  日志记录敏感信息

审计方法:

通过搜索关键词log.infologger.info来进行定位

SFtpOperate.java文件中, 代码134行处,直接将用户名密码记录在日志中

Java 代码审计常用漏洞总结

2.1.12URL跳转

审计方法: 通过搜索以下关键词定位:

sendRedirectsetHeaderforward

需注意有没有配置url跳转白名单

漏洞示例:

以下代码中40行处只判断site只是否为空,没有对url进行判断是否为本站url,导致了url跳转漏洞

Java 代码审计常用漏洞总结

2.1.13敏感信息泄露及错误处理

审计方法: 查看配置文件是否配置统一错误页面,如果有则不存在此漏洞,如果没有再通过

搜索以下关键词搜索定位,

Getmessageexception

漏洞代码示例:

在以下文件中代码89行处打印出程序发生异常时的具体信息

Java 代码审计常用漏洞总结

2.1.14反序列化漏洞

审计方法:

Java程序使用ObjectInputStream对象的readObject方法将反序列化数据转换为java对象。但当输入的反序列化的数据可被用户控制,那么攻击者即可通过构造恶意输入,让反序列化产生非预期的对象, 在此过程中执行构造的任意代码。

反序列化操作一般在导入模版文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘或 DB存储等业务场景,在代码审计时可重点关注一些反序列化操作函数并判断输入是否 可控,如下:

ObjectInputStream.readObject

ObjectInputStream.readUnshared

XMLDecoder.readObject

Yaml.load

XStream.fromXML

ObjectMapper.readValue

JSON.parseObject

漏洞示例:

以下代码中,程序读取输入流并将其反序列化为对象。此时可查看项目工程中是否引入可利用的commons-collections3.1commons-fileupload  1.3.1等第三方库,即可构造特定反序列化对象实现任意代码执行。

Java 代码审计常用漏洞总结

2.1.15不安全组件暴露

审计方法:

通过查看配置文件AndroidManifest.xml,查看<inter-filter>属性有没有配置false

AndriodManifest.xml文件中,代码24 行处activity 组件添加<intent-filter>属性,没有配置false,默认组件可被导出

Java 代码审计常用漏洞总结

3.1其他漏洞审计方法

3.1.1CSRF

审计方法:通过查看配置文件有没有配置 csrf全局过滤器,如果没有则重点看每个操作前有没有添加token的防护机制

Smpkpiappealcontroller.java 200处,直接用用 ids控制删除操作,而没有添加防

csrf的随机token验证检查, 存在csrf漏洞

Java 代码审计常用漏洞总结

Java/main/com/venustech/tsoc/cupid/smp/kpi/dao/smpkpideclardao.java517行,对传

入的 ids进行删除操作。

Java 代码审计常用漏洞总结

3.1.2Struts2远程代码执行漏洞

审计方法: 查看struts插件的版本信息是否为漏洞版本

漏洞版本查询网址: https://www.exploit-db.com/

3.1.3越权操作

审计方法:重点关注用户操作请求时查看是否有对当前登陆用户权限做校验从而确定是否存在漏洞,有些厂商会使用一些主流的权限框架,例如shiro ,spring security等框架,那么需要重点关注框架的配置文件以及实现方法

漏洞示例:

在以下文件中采用了shiro 框架进行权限控制,在代码58-72 行处为控制访问路径的权限设置,51-55 行处为对admin 路径下访问限制,只有SysyUserFilter 设置了isAccessAllowed

方法,其他过滤均没有

Java 代码审计常用漏洞总结

SysUserFilterisAccessAllowed 具体实现方法如下,90-93 行处没有对是否为当前用户进

行判断,导致了越权

Java 代码审计常用漏洞总结

其他过滤文件均只设置了onAccessDaniad()方法

Java 代码审计常用漏洞总结

如果没有使用框架的话,就要注意每个操作是否有权限

代码7行处获取session里的username,只判断了username是不是为空,如果在截取

数据包的时候将username再重新赋一个值就有可能造成越权漏洞。

Java 代码审计常用漏洞总结

以这个年度服务费用编制功能为例,测试一下,代码如图所示:

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

3.1.4会话超时设置

审计方法:

Javaweb应用会话超时设置一般有俩种方法:

一是在配置文件web.xml 设置

Java 代码审计常用漏洞总结

二是通过java代码设置

Java 代码审计常用漏洞总结

3.1.5敏感数据弱加密

审计方法:

敏感数据弱加密主要看数据传输中的加密方法, 一般写在工具类util  

以下文件中为base64编码方法

Java 代码审计常用漏洞总结

4.1工具的使用

1.Fortify

1.1新建扫描

1.1.1 命令行自定义扫描目录:

如果想自定义Fortify扫描的目录的话,下面命令比较方便:

sourceanalyzer -scan -cp"lib/*.jar""src/**/*.java""web/**/*.jsp"-fresult.fpr

-cp指定类库的路径, 如果没有就不用这个选项

"src/**/*.java""web/**/*.jsp"  这两个参数指定扫描src  目录下的所有java文件和web  目录中的所有jsp文件

-f 指定扫描结果的输出文件为result.fpr,扫描完后双击就可以通过Fortity查看了。

1.1.2图形化界面

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

1.2查看结果

Java 代码审计常用漏洞总结

漏洞列表:

Java 代码审计常用漏洞总结

漏洞介绍:

Details

Java 代码审计常用漏洞总结

漏洞修复建议:

Recommendations

Java 代码审计常用漏洞总结

漏洞跟踪图:

Diagram

Java 代码审计常用漏洞总结

2.Sublime Text

2.1打开项目相应目录:

Java 代码审计常用漏洞总结

2.2全局搜索

Ctrl +Shift+F全局搜索

Java 代码审计常用漏洞总结

上面红框的几个图标可以设置是否大小写敏感, 是否搜索整个单词。

3.JD-GUI

没源码时, 要分析jar包或者class文件, 就要用到JD-GUI

直接拖动某个jar或者class文件进jd-gui 就可以打开了,然后搜索关键词审计:

Java 代码审计常用漏洞总结

Java 代码审计常用漏洞总结

把那些勾都勾上搜索。

4.文件浏览器

Windows  自带的文件浏览器可以方便地搜索某个文件或者java,jsp 文件:

Java 代码审计常用漏洞总结

实际中,都是FortifySublime Text和文件浏览器结合一起用最高效。

非原创,单纯看着很不错想分享一下,如有侵权请联系我立马删除。

交流群

Java 代码审计常用漏洞总结

广告

Java 代码审计常用漏洞总结

原文始发于微信公众号(影域实验室):Java 代码审计常用漏洞总结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年5月7日08:25:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java 代码审计常用漏洞总结http://cn-sec.com/archives/2712575.html

发表评论

匿名网友 填写信息