漏洞原理
該漏洞是由於Tomcat AJP協議存在缺陷導致,攻擊者利用該漏洞可通過構造特定參數,讀取服務器webapp下的任意文件。若目標服務器同時存在文件上傳功能,攻擊者可進一步實現遠程代碼執行。目前,廠商已發布新版本完成漏洞修復。
復現環境
在ubuntu 16.04虛擬機中用vulhub靶場提供的docker容器來復現
jdk版本1.7
Tomcat版本9.0.30
影響版本
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
復現過程
1. 進入vulhub目錄:tomcat/CVE-2020-1938
2.啟動docker容器,tomcat頁面正常訪問:
看下server.xml中AJP協議的相關配置,目前是打開的,端口號8009:
使用推薦的漏洞利用工具(https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi)讀取web.xml:
防御實驗
在不升級版本的情況下,直接關閉AJP Connector:
重啟Tomcat,再試着讀取web.xml,讀取失敗:
拓展學習
我有一點點疑問,為啥這個漏洞要叫“文件包含”漏洞。。。和我理解的文件包含貌似不一樣啊(https://www.cnblogs.com/sallyzhang/p/12221089.html)。咱把https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi代碼copy下來debug了一下,作為一個Python零級菜鳥選手,我只看懂了一丟丟..>_<...
代碼做的事情大概就是自己按照AJP協議的要求拼裝了request(會轉成二進制)發過去,然后把response的內容解析出來,命令行傳入的參數放在attributes里面:
應該是javax.servlet.include.path_info的鍋。。。,網上參考了這兩篇文章:https://paper.seebug.org/1126/ , https://www.jianshu.com/p/1803731ed527
好吧,確實是文件包含漏洞,個人覺得也可以叫任意文件讀取漏洞 >_<
本文僅用於技術學習和交流,嚴禁用於非法用途,否則產生的一切后果自行承擔。
如需轉載,請注明出處,這是對他人勞動成果的尊重。