1. 程式人生 > >學習週記(二)暨GXNNCTF WEB題writeup與重解

學習週記(二)暨GXNNCTF WEB題writeup與重解

WEB題writeup與重解

比賽時間:2018年12月15日至2018年12月16日
重解時間:2018年12月22日至2018年12月29日
1.超簡單writeup(php ereg函式00截斷):
題目連結:http://gxnnctf.gxsosec.cn:12311/
首先開啟連結,我們看到如下介面:


首先,對程式碼進行分析,上網搜尋瞭解到isset()函式用來檢測變數是否設定,且不為NULL值。即第一個條件:REQUEST[‘no’]存在且不為NULL值。
接下來進入到含有ereg()函式的第二個條件。繼續搜尋瞭解到,ereg()函式用指定的模式搜尋一個字串中指定的字串,如果匹配成功返回true,否則,則返回false。搜尋字母的字元是大小寫敏感的。但是ereg()函式存在漏洞,即NULL截斷漏洞。%00截斷及遇到%00則預設為字串的結束,可以繞過驗證。這一點對解題還是有很大幫助的。
繼續往下走,當ereg()函式返回true後,進入in_array()函式,即第三個條件是REQUESTS[‘no’]值為0~9之間的數,且字串長度大於1。那麼,現在只需結合上面提到的ereg()的00截斷漏洞,即構造no=1%00,輸入後即可看到flag。


當然no=後面的數字在0~9範圍內均可,但是不能沒有,或是大於9。例如,如果輸入no=10%00,返回的是you are so dark.;如果沒有,返回的是no must be number.
本題解題的關鍵就是ereg()的00截斷繞過驗證,這道題對於我這樣的初學者來說還是有一點難度的,畢竟PHP函式還沒有學明白,但上網搜尋後,也確實發現這道題並沒有想象中的那麼難,通過這道題,也確實學到了一些東西,加深了對php的瞭解,收穫還是有的。
2.帽子商城(重解):(條件競爭)
題目連結:http://gxnnctf.gxsosec.cn:12313/
開啟連結,出現下圖
在這裡插入圖片描述
一開始看這道題並沒有頭緒,雖然後來官方給出了’1s’的tip,我也上網查了許多關於註冊的web題型,但是直到比賽結束也沒有解出flag,後來看了一下大佬們的writeup,發現自己一開始就想的不太對。
網上給出了兩個做法,第一種同一賬號開兩個瀏覽器。這樣就有了兩個Cookie,條件競爭在短時間內獲得flag,而這個短時間就是官方給出的’1s’。師傅們結合這一種想法給出了py程式,並進行了實踐。考慮到一些因素,在此不再用此種方法重解。
第二種做法用我們熟悉的burpsuite,我們可以發現,開啟網頁原始碼第一關的’order’是base64編碼的,解碼後得到{“good”:1,“price”:500},而我們想的是,修改price,因為通過前期的賬號購買,不修改的情況下,是無法通過第二關的。因此我們修改為{“good”:1,“price”:1}。這樣得到下圖:
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
下面結合官方的tip:1s,我們開啟無痕瀏覽,兩個cookie同時購買,用burpsuite截包,在intruder裡發起攻擊。
在這裡插入圖片描述
Attack一下,得到flag:
在這裡插入圖片描述
3.SQL(重解):(git洩露)
題目連結:http://gxnnctf.gxsosec.cn:12312/
開啟網站後出現如下介面:
在這裡插入圖片描述
結合題目"SQL"我們第一種想法就是利用sqlmap跑一下,但是我作為一個新手,對於sqlmap瞭解很少,更不用說使用了,不知道往哪個方向上去想。後來看了一下別的師傅的wp,才知道是git原始碼洩露。git原始碼洩露也是網頁漏洞的一種,通過利用這個漏洞,可以使攻擊者獲得部署網頁所用的原始碼。
對於這道題而言,我們可以先用git_extract.py(
https://github.com/style-404/Git_Extract
)跑一下,出來以下內容:
在這裡插入圖片描述
這樣,就找到了我們想要的index.php,用Notepad開啟看一下:
在這裡插入圖片描述
接下來進行我們熟悉的程式碼審計工作,首先mysqli的出現意味著資料庫的連線,進入if語句,select where語句的出現意味著過濾,一直往下走,我們不難發現username,即其對應的id是在被過濾的。因此想到利用case when特性繞過,判斷變數是否為空,若為空賦值為2,不為空的話查詢結果為1。第一次查詢返回2,第二次查詢返回1。在這裡用select語句定義變數ctf,並對其進行賦值,@ctf:=2
在這裡插入圖片描述
由於程式碼中id對應的username需要經過兩次檢測, 即id經過兩次查詢。第一次id=2,第二次id=1。 結合下面的’backdoor’=‘Melonrind’,構造payload:http://gxnnctf.gxsosec.cn:12312/?id=case when @ctf is null then @ctf:=2 else @ctf:[email protected] end&backdoor=Melonrind
得到flag:
在這裡插入圖片描述
4.幾點感悟:
(1)作為一個新手,第一次打CTF的比賽,還是很生疏的,首先對一些方法或者說是技巧掌握不到位,遇到題只知道一個大概,然後就沒有然後了,東拼西湊,有什麼工具用什麼工具。但是通過這次比賽,也學到了一些解題的思路,雖然沒有固定的方法,但還是要形成自己發散的思維,要多去想為什麼。
(2)第二題與第三題都是參考過網上師傅們的writeup後重解的,不得不說非常佩服他們,本人在此一併感謝,如有侵權,還請諒解。
(3)git洩露:https://www.jianshu.com/p/0ea09975169d
條件競爭:http://v0w.top/2018/08/16/條件競爭/