靶場搭建
靶場下載?:
https://github.com/whgojp/JavaSecLab
這個靶場是使用Springboot搭建的所以不要下載 jar?文件運行,要使用IDEA運行他的文件夾
先打開pom?然后進行maven一下
改一下端口
配置完成之后修改一下?運行的模式
使用phpstudy搞一個sql數據庫
導入sql文件
運行應用
????????
SQL注入
先了解一下sql注入的修復形式和漏洞成因 :成因說白了就是使用字符串拼接的形式進行查詢數據庫才導致數據的惡意插入? ? ? ?修復形式就是把字符串拼接的形式改為預編譯(預編譯分為函數的調用和形式的調用)如果只是調用了函數那還是會造成sql問題
第一類:JDBC
JDBC數據庫是一種通過API接口進行數據存儲交互的形式?所以它是可以加載遠程的數據庫的
先看payload
1' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) AND '1'='1
這是個報錯注入
從白盒角度去審計一下:
場景二是
漏洞出現的原因 :sql語句仍是拼接模式下的
安全場景 :
第二類MyBatis
還有個注意點就是? #{}? 這樣處理下 {}?內的內容 會轉為字符串
介紹一下Mybatis 數據庫 他的配置和jdbc完全是不一樣的
他不是和JDBC一樣使用一個單個的文件進行處理
所以他的安全問題按理來說是非常好的
但是就是因為? ? #{}? 這樣處理下 {}?內的內容 會轉為字符串
所以一些如order by 1? 如果使用? ?? #{}? ?1會被轉為字符串? 但是 by后面跟的必須是int數字 所以會報錯? ?這樣的話程序員就只能使用 ${} 進行字符串的拼接? 所以就能使用在這個點上進行注入?
可以先把前面的整數進行閉合就能進行注入語句的插入
Order by 漏洞問題
語句:
1' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1) AND '1'='1
漏洞點 :
通過審計處理 就是因為 ${}
% 和 Like模糊匹配 安全問題
審計一下 上面的多余代碼
// Controller層
public R special1OrderBy() {List<Sqli> sqlis = new ArrayList<>(); //新創一個數據庫數據交互列表switch (type) { //選擇 查詢的類型 case "raw": //原始類型 sqlis = sqliService.orderByVul(field); //這個是引用mapping 層的那個 ${} 拼接執行break;case "prepareStatement": //這個就是使用預編譯參數 sqlis = sqliService.orderByPrepareStatement(field); //這個是執行的是mapping 中的#{}break;case "writeList": // 使用白名單模式sqlis = sqliService.orderByWriteList(field);...
// Service層
//自定義SQL-使用#{}
@Override
//服務層就是對查詢的數據進行回顯
public List<Sqli> orderByVul(String field) {return sqliMapper.orderByVul(field);
}
@Override
public List<Sqli> orderByPrepareStatement(String field) {return sqliMapper.orderByPrepareStatement(field);
}
@Override
public List<Sqli> orderByWriteList(String field) {return sqliMapper.orderByWriteList(field);
}
in 后參數問題
我們知道?
第三類? Hibernate
這個漏洞仍然是 原生的拼接導致的 :
預編譯的使用并不是執行的代碼不管用了? 而是被當做了字符串
第四類 SPA
缺陷仍然是原生
小結SQl注入
以上四個不是數據庫,而是數據庫處理的框架? 他們的本意就是優化數據庫到代碼中間的操作
黑盒測試就是使用找參數點 然后盲注
白盒 : 需要先分辨數據庫 :最容易分辨的? MyBatis,所以他的判斷就是 在maping文件中看是否有三個危險的語句
其他的就是尋找 控制器有沒有相應的配置
找到數據庫之后就先找 語句是否使用拼接模式? 或者看是否使用預編譯
各個數據的預編譯 :
-JDBC
1、采用Statement方法拼接SQL語句
2、PrepareStatement會對SQL語句進行預編譯,但如果直接采取拼接的方式構造SQL,此時進行預編譯也無用。
3、JDBCTemplate是Spring對JDBC的封裝,如果使用拼接語句便會產生注入
4、自定義過濾(黑白名單)
安全寫法:SQL語句占位符(?) + PrepareStatement預編譯
-Hibernate
1、setParameter:預編譯
2、username=:username 預編譯-JPA
1、username=:username 預編譯
XXE漏洞
XXE類似于反序列化? 不過就是xml框架的權限比較高可以支持直接進行一些修改框架插入惡意代碼就能執行一些命令
XXE的前提是項目沒有禁用外部的實體(一般是不會禁用的)
他主要就是解析 <> 內的內容實現注入
代碼審計SINK點:1、XMLReader2、SAXReader3、DocumentBuilder4、XMLStreamReader5、SAXBuilder6、SAXParser7、SAXSource8、TransformerFactory9、SAXTransformerFactory10、SchemaFactory11、Unmarshaller12、XPathExpression
RCE
白盒審計下的相關函數
命令執行 :
1、ProcessBuilder
Runtime.getRuntime().exec()
3、ProcessImpl
代碼執行:??Groovy代碼注入