您好,登錄后才能下訂單哦!
近期對平臺安全滲透測試中遇到有JAVA+mysql架構的網站,針對此架構我們Sine安全滲透工程師整理了下具體的漏洞檢測方法和防護修復方法,很多像執行框架漏洞獲取到系統權限,以及跨權限寫入木馬后門等等操作,希望大家在滲透測試的道路中發現更多的知識和經驗。
4.2.1. 格式化字符串
在Python中,有兩種格式化字符串的方式,在Python2的較低版本中,格式化字符串的方式為 "this is a %s" % "test" ,之后增加了format的方式, 語法為 "this is a {}".format('test') 或者 "this is a {test}".format(test='test')
當格式化字符串由用戶輸入時,則可能會造成一些問題,下面是一個最簡單的例子
>>> 'class of {0} is {0.__class__}'.format(42)
"class of 42 is <class 'int'>"
從上面這個簡單的例子不難知道,當我們可以控制要format的字符串時,則可以使用 __init__ / __globals__ 等屬性讀取一些比較敏感的值,甚至任意執行代碼。
4.2.2. 反序列化
4.2.2.1. pickle
>>> class A(object):
... a = 1
... b = 2
... def __reduce__(self):
... return (subprocess.Popen, (('cmd.exe',),))
>>> cPickle.dumps(A())
"csubprocess\nPopen\np1\n((S'cmd.exe'\np2\ntp3\ntp4\nRp5\n."
4.2.2.2. 其他
4.2.3. 沙箱
4.2.3.1. 常用函數
4.2.3.2. 繞過
4.2.3.3. 防御
Python官方給出了一些防御的建議
4.2.4. 框架
4.2.4.1. Django
4.2.4.1.1. 歷史漏洞
4.2.4.1.2. 配置相關
4.2.4.2. Flask
Flask默認使用客戶端session,使得session可以被偽造
4.2.5. 危險函數 / 模塊列表
4.2.5.1. 命令執行
4.2.5.2. 危險第三方庫
4.2.5.3. 反序列化
Java
4.3.1. 基本概念
JVM是Java平臺的核心,以機器代碼來實現,為程序執行提供了所需的所有基本功能,例如字節碼解析器、JIT編譯器、垃圾收集器等。由于它是機器代碼實現的,其同樣受到二進制文件受到的攻擊。
JCL是JVM自帶的一個標準庫,含有數百個系統類。默認情況下,所有系統類都是可信任的,且擁有所有的特權。
4.3.1.2. JNDI
JNDI(Java Naming and Directory Interface,JAVA命名和目錄接口)是為JAVA應用程序提供命名和目錄訪問服務的API(Application Programing Interface,應用程序編程接口)。
4.3.1.3. OGNL
OGNL(Object-Graph Navigation Language,對象導航語言)是一種功能強大的表達式語言,通過簡單一致的表達式語法,提供了存取對象的任意屬性、調用對象的方法、遍歷整個對象的結構圖、實現字段類型轉化等功能。
Struts2中使用了OGNL,提供了一個ValueStack類。ValueStack分為root和context兩部分。root中是當前的action對象,context中是ActionContext里面所有的內容。
4.3.1.4. RMI
RMI(Remote Method Invocation,遠程方法調用)能夠讓在客戶端Java虛擬機上的對象像調用本地對象一樣調用服務端java虛擬機中的對象上的方法。
RMI遠程調用步驟:
4.3.2. 框架
4.3.2.1. Servlet
4.3.2.1.1. 簡介
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,是用Java編寫的服務器端程序,主要功能在于交互式地瀏覽和修改數據,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解為后者。Servlet運行于支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基于HTTP協議的Web服務器。
4.3.2.1.2. 生命周期為
4.3.2.1.3. 接口
init()
在 Servlet 的生命期中,僅執行一次 init() 方法,在服務器裝入 Servlet 時執行。
service()
service() 方法是 Servlet 的核心。每當一個客戶請求一個HttpServlet對象,該對象的 service() 方法就要被調用,而且傳遞給這個方法一個”請求”(ServletRequest)對象和一個”響應”(ServletResponse)對象作為參數。
4.3.2.2. Struts 2
4.3.2.2.1. 簡介
Struts2是一個基于MVC設計模式的Web應用框架,它本質上相當于一個servlet,在MVC設計模式中,Struts2作為控制器(Controller)來建立模型與視圖的數據交互。
4.3.2.2.2. 請求流程
4.3.2.2.3. 相關CVE
4.3.2.3. Spring MVC
4.3.2.3.1. 請求流程
4.3.3. 容器
常見的Java服務器有Tomcat、Weblogic、JBoss、GlassFish、Jetty、Resin、IBM Websphere等,這里對部分框架做一個簡單的說明。
4.3.3.1. Tomcat
Tomcat是一個輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,用于開發和調試JSP程序。
在收到請求后,Tomcat的處理流程如下:
Tomcat服務器是由一系列可配置的組件構成的,其中核心組件是Catalina Servlet容器,它是所有其他Tomcat組件的頂層容器。
4.3.3.1.1. 相關CVE
4.3.3.2. Weblogic
4.3.3.2.1. 簡介
WebLogic是美國Oracle公司出品的一個Application Server,是一個基于Java EE架構的中間件,WebLogic是用于開發、集成、部署和管理大型分布式Web應用、網絡應用和數據庫應用的Java應用服務器。其將Java的動態功能和Java Enterprise標準的安全性引入大型網絡應用的開發、集成、部署和管理之中。
WebLogic對業內多種標準的全面支持,包括EJB、JSP、Servlet、JMS、JDBC等。
4.3.3.2.2. 相關CVE
4.3.3.3. JBoss
4.3.3.3.1. 簡介
JBoss是一個基于J2EE的管理EJB的容器和服務器,但JBoss核心服務不包括支持servlet/JSP的WEB容器,一般與Tomcat或Jetty綁定使用。
4.3.3.3.2. 相關CVE
4.3.4. 沙箱
4.3.4.1. 簡介
Java實現了一套沙箱環境,使遠程的非可信代碼只能在受限的環境下執行。
4.3.4.2. 相關CVE
4.3.5. 反序列化
4.3.5.1. 簡介
序列化就是把對象轉換成字節流,便于保存在內存、文件、數據庫中;反序列化即逆過程,由字節流還原成對象。Java中的 ObjectOutputStream 類的 writeObject() 方法可以實現序列化,類 ObjectInputStream類的readObject() 方法用于反序列化。
如果要實現類的反序列化,則是對其實現 Serializable 接口。
4.3.5.2. 序列數據結構
4.3.5.3. 序列化流程
4.3.5.4. 反序列化流程
4.3.5.5. 相關函數
4.3.5.6. 主流JSON庫
4.3.5.6.1. GSON
Gson默認只能反序列化基本類型,如果是復雜類型,需要程序員實現反序列化機制,相對比較安全。
4.3.5.6.2. Jackson
除非指明@jsonAutoDetect,Jackson不會反序列化非public屬性。在防御時,可以不使用enableDefaultTyping方法。
相關CVE有
4.3.5.6.3. Fastjson
相關CVE有
4.3.5.7. 存在危險的基礎庫
4.3.5.8. 網站漏洞修復和防護
4.3.5.8.1. Hook resolveClass
在使用 readObject() 反序列化時會調用 resolveClass 方法讀取反序列化的類名,可以通過hook該方法來校驗反序列化的類,一個Demo如下
以上的Demo就只允許序列化 SerialObject ,通過這種方式,就可以設置允許序列化的白名單
4.3.5.8.2. ValidatingObjectInputStream
Apache Commons IO Serialization包中的 ValidatingObjectInputStream 類提供了 accept 方法,可以通過該方法來實現反序列化類白/黑名單控制,一個demo如下
4.3.5.8.3. ObjectInputFilter
Java 9提供了支持序列化數據過濾的新特性,可以繼承 java.io.ObjectInputFilter 類重寫 checkInput方法來實現自定義的過濾器,并使用 ObjectInputStream 對象的 setObjectInputFilter 設置過濾器來實現反序列化類白/黑名單控制,對JAVA漏洞滲透測試有想進一步了解的可以咨詢專業的網站安全公司,國內推薦Sinesafe,綠盟,啟明星辰等等專業的安全維護公司。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。