一、前置知識(shí) 本文主要講解基礎(chǔ)的代碼審計(jì)思路與方法技巧,適合有一定java基礎(chǔ),無審計(jì)經(jīng)驗(yàn)的同學(xué)學(xué)習(xí)。 二、漏洞挖掘 1、配置信息 先看pom.xml,了解到使用了哪個(gè)依賴庫以及版本,從而可以確定是否存在漏洞。 圖中Shiro<=1.2.4版本,存在shiro550反序列化漏洞, application.yml 該配置文件可能存在數(shù)據(jù)庫或其他組件的連接信息,如數(shù)據(jù)庫連接信息。 漏洞關(guān)鍵字: Fastjson <=1.2.83 Jackson <=2.9.2 POI < 3.11 DOS XXE Shiro <= 1.24 Spring 5.0.x < 5.0.6 1Spring 4.3.x < 4.3.7 2、配置不當(dāng) 2.1swagger接口文檔泄露 圖下的就是將com.sky.controller.admin包下的所有接口掃描成swagger接口調(diào)試文檔。 這就是訪問swagger調(diào)試文檔訪問地址。 在項(xiàng)目審計(jì)中,swagger接口文檔是不應(yīng)該被用戶訪問的,接口文檔可直接就是存在漏洞問題。
2.2 springboot-actuator接口未授權(quán)
搜索關(guān)鍵字: management.endpoints.web.exposure.include=* endpoints.env.enabled=true endpoints.enabled = true management actuator 3.未授權(quán)訪問 3.1過濾器: 該方法判斷了請(qǐng)求url是否包含了/login.html或者register.html,如果包含就放行。 所以我們可以http://127.0.0.1/login.html/../admin/test的方法繞過過濾。
3.2攔截器: 如果路徑的開頭是以/admin開頭并且Session中的loginUser屬性為 null,就會(huì)判斷是否登錄。 利用:構(gòu)造結(jié)構(gòu)路徑為/;/admin或//admin后訪問(不影響解析),即可繞過登錄限制。 關(guān)鍵字: Interceptor addInterceptors 3.3shiro: 在shiro過濾器中對(duì)所有路徑配置了anon匿名攔截器,即不需要認(rèn)證校驗(yàn)。
4、SQL注入 現(xiàn)在大部分項(xiàng)目都是基于mybatis操作數(shù)據(jù)庫,不使用預(yù)編譯的情況就可能會(huì)導(dǎo)致sql注入漏洞。 簡單介紹一下預(yù)編譯與拼接: 占位符:#{},預(yù)編譯指的是在執(zhí)行 SQL 語句之前,先將 SQL 語句中的占位符(如 拼接符:${},可以用來替換 SQL 語句中的任何部分,包括表名、列名、條件等等。在執(zhí)行 SQL 語句之前,MyBatis 會(huì)將 mybatis中有些地方不能使用預(yù)編譯的,這種場(chǎng)景下就容易出現(xiàn)sql注入漏洞: 動(dòng)態(tài) SQL 中的表名、列名:如果在動(dòng)態(tài) SQL 中使用 ${} 來表示表名、列名等標(biāo)識(shí)符,因?yàn)檫@些標(biāo)識(shí)符是在 SQL 解析階段確定的,無法使用預(yù)編譯參數(shù)來替換。 動(dòng)態(tài) SQL 中的 SQL 語句片段:例如在 <sql> 或 <selectKey> 等元素中使用 ${},這些片段是在 SQL 解析階段確定的,也無法使用預(yù)編譯參數(shù)來替換。 動(dòng)態(tài) SQL 中的 ORDER BY 字段:如果在 ORDER BY 子句中使用 ${} 來表示排序字段,因?yàn)榕判蜃侄问窃?SQL 解析階段確定的,同樣無法使用預(yù)編譯參數(shù)來替換。 LIKE 操作中的模糊查詢字符串:如果在 LIKE 操作中使用 ${} 來表示模糊查詢的字符串,因?yàn)檫@個(gè)字符串是直接拼接到 SQL 語句中的,不會(huì)被預(yù)編譯。 如圖:模糊查詢處無法直接使用預(yù)編譯,直接使用預(yù)編譯會(huì)報(bào)錯(cuò)。 安全寫法:使用concat將%%與預(yù)編譯組合起來。 根據(jù)此處的sql語句,跟進(jìn)查看哪個(gè)函數(shù)調(diào)用了該sql。 進(jìn)行跟進(jìn) 發(fā)現(xiàn)了是page調(diào)用了list,而且name可控,繼續(xù)跟進(jìn)是哪個(gè)函數(shù)調(diào)用了page。 發(fā)現(xiàn)了是controller層的page調(diào)用了,訪問的接口為emps,即http://127.0.0.1/emps,而且name參數(shù)可控。 漏洞點(diǎn)2: 通過上面說的方法,一步一步跟,查看是那個(gè)訪問接口調(diào)用了該sql語句(此處省略) 此處asc參數(shù)為漏洞點(diǎn)。 輸入asc=asc,id,(asc=asc,sql列名),回顯正常。 輸入asc=asc,xxx,(asc=asc,不存在的sql列名),無回顯數(shù)據(jù)。 將數(shù)據(jù)包放到sqlmap跑一下 5.ssrf 現(xiàn)在大部分java代碼中的ssrf漏洞都不支持偽協(xié)議,基本只能進(jìn)行內(nèi)網(wǎng)探測(cè),危害也相對(duì)較低。 這段代碼只支持http請(qǐng)求,無法進(jìn)行偽協(xié)議。
6.文件操作類型漏洞 文件操作類型漏洞包括:文件上傳,文件下載,文件讀取,文件刪除等。 漏洞示例:文件名file可控而且沒有對(duì)后綴進(jìn)行過濾,存在文件上傳漏洞,文件操作類型漏洞在白盒中還是挺多的,大多都是文件上傳目錄穿越。 關(guān)鍵字: new FileOutputStream download upload File.createTempFile transferTo new FileInputStream IOUtils.readFully IOUtils.write FileReader fs.open file.exists() file.delete() 7.XXE xxe漏洞現(xiàn)在已經(jīng)不多了,遇到的次數(shù)也很少,一般出現(xiàn)在支持xml文件導(dǎo)入或者csv,xslx文件導(dǎo)入(POI組件)的地方。 漏洞示例:這段代碼讀取xml文件,但沒有明確禁用外部實(shí)體解析,所以存在xxe漏洞。 修復(fù)方法:
關(guān)鍵字: SAXReader SAXBuilder XMLReaderFactory.createXMLReader(); DocumentBuilderFactory XPathExpression DocumentHelper.parseText TransformerFactory Unmarshaller StringReader 組件: POI < 3.11 DOS XXE 8.RCE 存在可以執(zhí)行命令或者代碼的函數(shù)就可能存在RCE漏洞。 在該接口中將接口傳參未做過濾直接傳遞到繼承了FelEngineImpl類的工具類中執(zhí)行并返回結(jié)果,可以通過傳入如導(dǎo)致代碼注入從而執(zhí)行任意命令
9.邏輯缺陷 邏輯缺陷一般出在判斷條件處,例如esle if,動(dòng)態(tài)sql中的if判斷。若開發(fā)寫的if判斷條件有邏輯問題,就會(huì)出現(xiàn)漏洞。 漏洞案例:
|
|