2018強網杯線上賽Web部分思路心得及writeup分享
強網杯線下賽也結束了,我們團隊也取得了不錯的成績。比起結果,我更看重的是和小夥伴一起奮鬥的過程。夢想很遠,還好一路有你。在此記錄下一起奮鬥過的足跡。
0x01 web簽到
看到前兩個判斷很容易聯想到數組的MD5的特性,用直接過
第三個判段:將兩個hash碰撞相等的文件轉成16進位
param1=%0e%30%65%61%55%9a%a7%87%d0%0b%c6%f7%0b%bd%fe%34%04%cf%03%65%9e%70%4f%85%34%c0%0f%fb%65%9c%4c%87%40%cc%94%2f%eb%2d%a1%15%a3%f4%15%5c%bb%86%07%49%73%86%65%6d%7d%1f%34%a4%20%59%d7%8f%5a%8d%d1%ef?m2=%0e%30%65%61%55%9a%a7%87%d0%0b%c6%f7%0b%bd%fe%34%04%cf%03%65%9e%74%4f%85%34%c0%0f%fb%65%9c%4c%87%40%cc%94%2f%eb%2d%a1%15%a3%f4%15%dc%bb%86%07%49%73%86%65%6d%7d%1f%34%a4%20%59%d7%8f%5a%8d%d1%ef
0x02 Share your mind
地址:http://39.107.33.96:20000
註冊賬號登錄成功後會有一個發文章和提交反饋的地方存在XSS,但是並不能打到COOKIE。官方提示了PhantomJS/2.1.1所以想到了在安全客看到的這個
《從PhantomJS圖片渲染中的XSS漏洞到SSRF/本地文件讀取漏洞》,參考鏈接:
https://www.anquanke.com/post/id/86371。本地復現成功,線上不行,發現windows.domain不同,不過還是學到了點姿勢。後來嘗試了一陣後發現其實這個地方只是在phantomjs中載入,不是登錄狀態,容器還會直接打開我們提交的連接,如果下存在XSS應該就可以拿到COOKIE
參考利用RPO(Relative Path Overwrite)相對路徑覆蓋技術
我們先發布一篇文章
然後提交該鏈接
其中驗證碼可通過查錶快速獲取,然後成功獲取COOKIE
這個顯然是提示真正的COOKIE在路徑下,構造代碼
d=document;f=d.createElement("iframe");f.src="/QWB_fl4g/QWB/";f.onload=function();d.body.appendChild(f};d.body.appendChild(f));"
成功獲取該頁面下的COOKIE
從而成功獲取flag
0x03 Three hit-Web
註冊登陸後發現,首頁會從中取出值做二次查詢,因此,在註冊時候猜測不為存入資料庫。註冊新賬號,為的時候,查詢不出相同年齡的人,因此二次注入成立。腳本如下
結果如下
0x04 彩蛋
開始在想jackson,shior的洞都無果,後面在此人github主頁上驚奇的發現有個phrack-docker項目:https://github.com/zjlywjh001/phrackCTF-Team-Docker。Dockerfile上有postgresql的口令和密碼並在pg_hba.conf中發現psql允許遠程訪問。
參考postgresql_getshell
遠程登錄一波操作後無果,但是udf能行通。
結果
PS:附上Orange大牛的反序列化解法
http://blog.orange.tw/2018/03/pwn-ctf-platform-with-java-jrmp-gadget.html
0x05 Python is the best language 1(first blood)
通過代碼審計很容易發現註冊處email存在sql注入
直接通過sqlmap構造,使用使sqlmap識別正確頁面
#py.txt
POST /register HTTP/1.1Host: 39.107.32.29:20000Content-Length: 212Cache-Control: max-age=0Origin: http://39.107.32.29:20000Upgrade-Insecure-Requests: 1Content-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8Referer: http://39.107.32.29:20000/registerAccept-Language: en,zh-CN;q=0.9,zh;q=0.8,zh-TW;q=0.7Cookie: session=de32a41b-54fa-4b6f-9c86-df6848cc8c29Connection: close
csrf_token=ImJmZDk1NTZiZDNjZTczOTllMGE5Y2UxMTQ3NDMxN2Y0NGYwNDZmMGYi.DZevVA.Tub8TPOi3FfJsylw3Ct-VLsd_CY&username=testfuckfuck&email=fuckfuck123"or (1=1*)#%40qq.com&password=fuckfuck&password2=fuckfuck&submit=Register
#End py.txt
結果:
0x06 Python is the best language 2(first blood)
通過審計發現處讀取緩存存在反序列化漏洞
其中,key是通過預設的和組合在一起計算md5得到,已知,可控,可以輕易構造通過第一步中的SQL注入,可以在緩存目錄下寫入自己構造的pickle序列化數據,通過構造來反序列化執行惡意代碼。
在pickle反序列化時存在一定過濾:
但由於禁用的方法不全,可以繞過,例如:
即可下載遠程代碼執行。
反彈shell後,找到flag:
0x07 3pigs(時間浪費在了wechat題目,只做了前面一小部分,orz)
題目信息
There is a world of 3pigs~ (web+pwn)
hint:unsorted bin attack by using top chunk
hint2:SSTI in login again
解題過程查看源碼獲得提示
知道考的可能是時序攻擊,密碼長度為10位
通過測試,發現前面的密碼正確的時候,用時最長
時序攻擊大概可以這麼理解,用於驗證密碼的函數一位一位判斷密碼,錯誤就立即返回,只有前面正確才會判斷後面字元,所以前面字元正確的越多所需要的時間越長。
寫腳本進行爆破
得到密碼為
題目放出的時間太靠後了,大部分精力都放在wechat上了
0x08 wechat(無限接近最後的真相)
題目信息
https://www.qiangwangbei.com/wechat/wechat_7yu89io0.jpg
Please follow our WeChat Official Account (web+pwn)
hint:sqli in fromUser
hint2 : sqli1 not mysql not blind , sqli2 in message and you know anything in blacklist
hint3 : sqli2:table is adminuserhint4:if you are admin, you can read local file from ssrf
解題過程:
然而一切並沒有想像的那麼簡單,出來的信息和可控的輸入查詢根本就是對兩張表的兩個獨立查詢,start_time的內容確實可以回顯,但是限制了輸入位只能32位,並且不能構造聯合查詢語句,想要通過回顯跨表或者跨庫注出更多信息幾乎不可能,在查詢過程中伺服器幾度崩潰,一番嘗試後發現了一些奇奇怪怪的東西:
隨後看到HINT提示sql注入的點在fromUser上,聯想到微信公眾號的介面似乎有這個參數,於是使用微信公眾平台介面調試工具https://mp.weixin.qq.com/debug向自己的伺服器提交請求,獲取發送的請求包,並模擬微信向比賽伺服器發送請求。
可以看出,這是一個insert語句的SQL注入,輸出點在,嘗試 返回 3.11.0,可知資料庫為SQLite。嘗試子查詢得到note表中id為999的文章內容為:
並沒有外部解析,按照之前的思路使用公眾號的第三個介面嘗試SSRF,然而回顯告訴我們內網也訪問不到這個域名。接著嘗試了修改host、反代、cname指向等等各種方式都訪問不了這個頁面,局面一度變得十分尷尬。
該域名直接訪問或者通過內網也都不可達,猜測伺服器配置限制只能域名訪問,通過微信上的ssrf功能向我們的vps發送請求,可以獲得微信伺服器的ip地址為。通過綁定本地(常用作繞過cdn等雲waf直接訪問目標主機),將指向便能正常訪問,訪問得到頁面截圖如下:
該網站的前台存在3個頁面,分別是登陸(admin_login.php)、留言(leave_message.php)和找回密碼(forgetpassword.php)
在頁面的變數中存在SQLi,然而這個地方提交回顯只有兩種結果,一種是Success,不論SQL語法是否正確;另一種是Hacker,代表此次請求被waf攔截了。因此要SQL注入只能用
經過一些列的Fuzz 得到了以下信息:
message變數不能存在不可見字元、x20、x09、反引號、換行符和注釋符
SLEEP函數不可傳字元串和數字常量,但可以傳函數(PS:經過幾次測試可以通過SLEEP(UNHEX(HEX(VERSION()))) 的形式延時版本號實數5秒多)
SELECT 和 FROM 後面不能接左括弧。
此題難點在於SQL中不能通過常用分隔符分離SQL語句的關鍵字,然而在盲注查詢的時候,結構是必出現的,因此經過大量測試得知通過下面的方式可以查詢到adminuser表中的信息,並繞過WAF:
其中@x:= 意思是變數,根據文檔意思是兼容ODBC的一種寫法。
完整的變數的payload為
TAG:雙螺旋Sec團隊 |