java代码审计中的⼀些常见漏洞及其特征函数
⽂章来源:xz.aliyun/t/1633
最近在先知上看到之前有篇关于java代码审计的⽂章总结的蛮好,记录以下特征函数,⽅便查阅,同时⾃⼰也会将在平时代码审计过程中积累的函数补充在这篇⽂章中。(虽然作者已经很贴⼼的提供了脚本)。
<
常见解析xml的类有如下:
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
org.dom4j.io.SAXReader
1)l.parsers.DocumentBuilder  (原⽣dom解析xml)
例⼦:
DocumentBuilderFactory wInstance();
DocumentBuilder wDocumentBuilder();
InputStream is= new  FileInputStream("l");
Document doc=dombuilder.parse(is);  //sink点
Element rootElement = DocumentElement();
2)l.stream.XMLStreamReader    (StAX解析器,可读可写)
例⼦:
XMLInputFactory factory = wFactory();
InputStream stream = ClassLoader().getResourceAsStream("webService/l");
XMLStreamReader reader = ateXMLStreamReader(stream);  //sink点
while (reader.hasNext()) {...}
3)l.parsers.SAXParser  /  l.sax.XMLReader  (原⽣SAX解析xml)
例⼦:
SAXParserFactory factory = wInstance();
SAXParser parser = wSAXParser();
XMLReader reader = XMLReader();  //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("l");    //sink点
5)org.dom4j.io.SAXReader    (dom4j解析xml)
例⼦:
InputStream fis=new FileInputStream("G:\\eclipsewk\\SDK201702\\Test-Pack\\package\\work\\before\\l");
Document document = new SAXReader().read(fis);  //sink点
6)l.validation.SchemaFactory    (校验xml)
例⼦:
File xsdfile=new File("xml/orders.xsd");
File xmlfile=new File("l");
Handler errorHandler=new Handler();
SchemaFactory wInstance("/2001/XMLSchema"); //
Schema wSchema(xsdfile);
Validator wValidator();
vaildator.setErrorHandler((ErrorHandler) errorHandler);
vaildator.validate(new StreamSource(xmlfile));  //sink点
7)l.bind.Unmarshaller    (JAXB解析xml,也是实现java和xml的转换)
例⼦:
JAXBContext jc = wInstance(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)l.xpath.XPathExpression  (XPath查询)
DocumentBuilderFactory df = wInstance();
DocumentBuilder builder = df.newDocumentBuilder();
String result = new XPathExpression().evaluate(builder.parse(new Bytes())));
值得注意的是:l.xpath.XPathExpression类似于Unmarshaller,它⽆法⾃⾏安全地配置,因此必须⾸先通过另⼀个安全的XML解析器解析不受信任的数据
9)ansform.sax.SAXSource  /  ansform.TransformerFactory  /  ansform.sax.SAXTransformerFactory    (⽣成和转换xml)
10)Apache Commons Configuration读取xml配置
XMLConfiguration.load
代码审计的时候感觉⼀个个搜索也很⿇烦,在使⽤脚本前可以先全局搜索下DocumentBuilder、sax、Unmarshaller 、XPath、XMLInputFactory等字眼。
2.反序列化漏洞
反序列化操作⼀般在导⼊模版⽂件、⽹络通信、数据传输、⽇志格式化存储、对象数据落磁盘或DB存储等业务场景,在代码审计时可重点关注⼀些反序列化操作函数并判断输⼊
是否可控,如下:
1)adObject  //最常见的反序列化sink点,将流转化为object对象
2)adUnshared  //使⽤较少,和readobject有些区别
readUnshared()⽅法来读取对象,readUnshared()不允许后续的readObject和readUnshared调⽤引⽤这次调⽤反序列化得到的对象,⽽readObject读取的对象可以。
3)adObject  //读取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\\</string>
</void>
</array>
<void method="start"/>
</object>
</java>
4)XStream.fromXML  //XStream⽤于java object与xml的相互转换,XML(将java转换为xml)
String payload = "<map><entry><jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class=\"l.internal.bind.v2.runtime.unmarshaller.Base64Data\"> <dataHandler> <dataSour
ce class=\"l. 5)⼀些第三⽅jar包中的,这些第三⽅jar包历史版本中存在序列化漏洞
JSON.parseObject    fastjson中的api
6)Yaml.load
审计的时候搜索readobject、readUnshared、fromXML这些关键api
3.SSRF(服务器端请求伪造)
HttpURLConnection/URLConnection
new  HttpGet(url)
OkHttpClient()
URL:URL  url = new URL();
    1) url.openStream      ad(url)
其他
审计的时候搜索new URL、HttpClient、HttpURLConnection
4.⽂件上传
审计的时候搜索MultipartFile
5.Autobinding    //参数⾃动绑定漏洞,在php中叫object注⼊漏洞,json注⼊也属于其中⼀种
审计的时候搜索@SessionAttributes和@ModelAttribute,属于SpringMVC框架
6.URL跳转漏洞
使用dom4j解析xml文件
7.命令执⾏
1).            //Runtime().exec(command)
2).ProcessBuilder.start    //new ProcessBuilder(cmdArray).start(),取代了Process
3).GroovyShell.evaluate    //主要⽤于在java中运⾏Groovy脚本
shell.evaluate("
  static void main(String[]args){
    Runtime().exec(command);
  }
");
类似的还有GroovyClassLoader 、ScriptEngine
8.和⽂件操作相关的漏洞,例如任意⽂件读取、删除等等
1)最常见的就是JDK原始的java.io.FileInputStream类
2)JDK1.7新增的基于NIO读取⽂件的java.nio.file.Files类。常⽤⽅法如:adAllBytes、adAllLines 3)JDK原始的java.io.RandomAccessFile类
4)Apache Commons IO提供的org.apachemons.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
JsonWriter.write(Array|Object)    ateParser()    JsonGenerator
5)fastjson
10.ldap注⼊
审计过程中可以直接搜索ldap字符初略的进⾏定位
常见sink点:
javax.naming.directory
DirContext.search
org.springframework.ldap
LdapTemplate.search
LdapOperations.search
netscape.ldap
LDAPAsynchronousConnection|LDAPv2.search
最后是⼤佬的⾃动化脚本:
脚本还没⽤过。。。有机会看看效果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。