您好,登錄后才能下訂單哦!
怎么進行CVE-2020-1938漏洞分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
環境搭建這部分直接使用brew包管理器進行Tomcat安裝,版本為8.5.47如下圖所示:
與IDEA進行遠程調試的設置部分略過,搭建完成后查看端口開啟狀況如下圖所示:
既然CVE-2020-1938漏洞是通過Tomcat的AJP協議進行攻擊,那么首先應先對AJP協議進行學習,了解它是啥、用來干啥的。
這里附上Apache官網上對于AJP協議部分的AJP官方文檔。
通過閱讀官方文檔與server.xml文檔后可知,Tomcat服務器對外監聽兩個端口用于與客戶端進行正常的訪問通信,如上圖所示,分別監聽8080端口與8009端口,其中8080端口為我們所熟知的正常進行HTTP協議通信的端口,8009端口則是使用AJP協議進行通信,使用二進制格式來傳輸可讀性文本,能降低 HTTP 請求的處理成本,因此主要在需要集群、反向代理的場景被使用。
通過閱讀文檔可知AJP協議的請求報文結構、Headers的定義方式、屬性的代碼值等等,這部分在接下來的漏洞代碼分析中還會再回來查找。
漏洞分析這一塊是跟著最早放出的安恒 Tomcat-Ajp協議漏洞分析文章做的,個人對該分析文章進行學習與漏洞細節補充,下載Tomcat源碼進行分析。
定位到漏洞核心代碼部分在org.apache.coyote.ajp.AjpProcessor.java
文件的778~812行,如下所示:
首先,對第一個紅框位置代碼進行分析,先為attributeCode
進行賦值后將比較結果作為循環條件;在Constants.java
文件中查詢到Constants.SC_A_ARE_DONE的值為0XFF
,在官方手冊中查詢到屬性代碼為請求終止,則這是個恒True的判斷,循環執行下面的switch
判斷代碼。
對第二個紅框位置代碼進行分析,當case到Constants.SC_A_REQ_ATTRIBUTE
時會進入下面的判斷,那么這個Constants.SC_A_REQ_ATTRIBUTE
又是什么呢?在Constants.java
中查找到SC_A_REQ_ATTRIBUTE = 10;
同時還有一行注釋聲明此用于不在上面列表中的屬性。
繼續返回官網手冊進行查找,果然在官網的屬性說明中存在著如下圖所示的聲明。也就是說,如果要發超出上述基礎屬性以外的值,都可以通過req_attribute(0X0A)
來設置其屬性名和值來發送。
那么第三個紅框部分的代碼的含義就已經顯而易見了,我們可以將AJP里面的內容取出來設置成request
對象的Attribute
屬性。
在上面部分設置完成request
對象之后一直沒搞清楚是怎么傳進容器的,直到看到了淺析Tomcat之CoyoteAdapter這篇文章:
Adapter連接了Tomcat連接器Connector和容器Container.它的實現類是CoyoteAdapter主要負責的是對請求進行封裝,構造Request和Response對象.并將請求轉發給Container也就是Servlet容器.
終于將安恒漏洞分析文章中的getAdapter().service(request,response)
串聯起來,到這里之后還需要注意Servlet的處理,可以在web.xml
中看到在其中配置了兩個servlet
處理,DefaultServlet
和JSP Servlet
,越精確的路徑越優先匹配,而/
匹配所有,匹配程度模糊所以優先級最低,當其它的Servlet
匹配不成功時便由DefaultServlet來進行兜底。
跟進Tomcat_lib中DefaultServlet.class
文件,通過serveResource
方法來獲取資源文件。
通過getRelativePath
來獲取資源文件路徑。
然后再通過控制ajp控制的上述三個屬性來讀取文件,通過操控上述三個屬性從而可以讀取到/WEB-INF下面的所有敏感文件,不限于class、xml、jar等文件。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。