南邮CTF Web类writeup
南京郵電大學CTF練習網站
https://cgctf.nuptsast.com/challenges#Web
1 簽到題
第一題比較簡單,直接查看源碼,發現flag就在源碼里
nctf{flag_admiaanaaaaaaaaaaa},有人會問,你怎么就知道是這個,而不是admiaanaaaaaaaaaaa或者flag_admiaanaaaaaaaaaaa呢,答案很簡單,直接填入答題欄驗證就好了_(:з」∠)_
2 md5 collision
關鍵在于紅色框中的這句,我們要傳入一個a的值,讓這個值≠QNKCDZO,又要二者的md5值相等。
這里涉及到的漏洞是php的hash漏洞“Magic Hash”
漏洞描述
??PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0。
解法
??我們先求出給定字符串“QNKCDZO”的md5值:“0e830400451993494058024219903391”
??這里推薦一個編碼轉換的網站https://web2hack.org/xssee/
??然后我們可以直接百度0e開頭的md5值,隨便選一個
上面這個工具就是傳說中的神器Hackbar
奪旗成功~
3 簽到2
讓輸入口令,那我們直接輸入就可以得到flag啦(要是這么簡單就好了)
查看源代碼,發現在前端做了輸入長度的限制
前端限制可以通過抓包后修改繞過,這里我們輸入“zhimakaimen”,用burpsuite抓取Request數據包(或者直接修改前端代碼也行,把限制去掉或者改成更大的數)
可以看到我們提交的長度為11的字符串被截斷為10個字符,我們直接補全,然后放行數據包。
成功獲取flag
4 這題不是WEB
第一反應還是查看源碼,沒什么信息,但是觀察到有個gif,下載下來看看,右鍵記事本打開
??這里有個小知識,簡單說一下,php的文件上傳漏洞,如果限制上傳類型為圖片格式,我們可以上傳一個圖片木馬上去,但是如果服務器端有檢測文件內容的函數getimagesize(),這個函數會判斷目標文件中是否真的有一張圖片,我們可以在圖片木馬的前面添加一個“GIF89a”就可以繞過這個函數的檢測。
??跑題了,用記事本打開gif之后,在里面看看能不能找到flag
還真就找到了囧,感覺這道題意義不大,打CTF的目標是奪旗,但是不能只為了奪旗呀。。。
5.層層遞進
老規矩先看源碼
發現一個可疑分子“SO.html”,點進去看看
嗯?又有個S0.html(出題人挺皮的,這里是數字0,不是大寫字母O),再點進去,又有個SO.htm,好吧,繼續,flag應該就藏在這里了,不然不會沒事搞這么多頁面,一步一步點進去,最后有個404.html(其實我自己做的時候是直接burpsuite抓包,然后直接找到了這個文件-_-||)
flag就在這里
6 AAencode
這題我直接404了,連題目都看不到,找了別人的解法看了看,說是打開后一堆亂碼,首先想到編碼轉換,轉換為Unicode,然后扔到控制臺里跑一下就出來了
7 單身二十年
他說可以靠手速
點擊超鏈接之后,眼神好使的可以看到一個網頁跳轉(我截圖真截不出來,先是跳轉到search_key.php,然后又很快跳到no_key_is_here_forever.php),他的意圖就是隱藏這個search_key.php文件,flag多半就在這里。
我們可以抓包
抓到之后放到Repeater模塊中重放一下,就可以得到flag了
另一種方法是直接查看題目的源碼
訪問一下這個search_key.php,直接就出結果了
可以看到是一個重定向<script>window.location="./no_key_is_here_forever.php"; </script>
8 php decode
一段php代碼
大體意思就是CLsI()是個加密方法,傳進來的字符串先base64解碼,然后再一頓操作。。。反正代碼也有了,不妨拿出來跑一下
直接出結果~
9 文件包含
提示了是LFI,本地文件包含漏洞,RFI是遠程文件包含
不讓點也要點一下
看到包含了show.php,我們可以嘗試包含服務器本地的其他文件,但是不知道文件名呀,從已知入手,肯定存在的就是index.php唄,讀一下源碼看看
payload:http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
解釋一下,因為前端無法直接顯示php文件內容,因此把文件內容先轉換為base64編碼,讀出之后解碼即可。這里的php://是一個偽協議,和http/file等協議一樣可以傳輸和訪問本地文件,php偽協議是用來傳輸php文件的
得到index.php的源碼
答案直接給出來了。
這里看到紅色框中他做的前端限制,禁止使用相對路徑訪問上一層的文件,也禁止訪問同一文件夾下,文件名中含有“tp、input、data”等關鍵字的文件。
10 單身一百年也沒用
看題目應該和前面單身二十年那道題差不太多,還是查看源碼,然后跟著超鏈接點進去,沒什么信息,一般沒頭緒的時候抓包就完事了
抓到包還是重放一下,看一看response
啊這。。。。果然還是重定向(注意這里http狀態碼是302)
不過這一次的重定向不會在視覺上像前面那道題一樣,看到有在文件間跳轉的痕跡,原因就是將重定向代碼直接寫在response中了,不需要訪問一個文件再執行代碼
11 Download~!
這題又掛了。。。
12 COOKIE
直接點進題目
提示是cookie的問題,那就抓個包試試
看到Cookie:Login=0,提示里寫的0==not,那就把0改成1,讓包通行
13 MySQL
??Do I know?I don’t know…
??百度了一下,robots.txt是一種存放于網站根目錄下的ASCII編碼的文本文件,它會告訴爬蟲這個網站的哪些內容可以被獲取和不可以被獲取,爬蟲訪問一個站點的時候會先檢查根目錄下的robot.txt,如果存在,爬蟲就會按照該文件的內容來確定訪問的范圍。簡單來說,如果你希望你的網站上的某些內容不可以被爬蟲爬取,就可以使用robots.txt來限制爬蟲的爬取范圍
??那我們就看一下robots.txt中的內容
??它提示我們sql.php這文件中有這樣一段代碼,是數據庫相關的代碼,我首先想到的是SQL注入
??但是繼續向下看,發現
??實際上就是讓我們傳入一個id,如果在數據庫中查詢到這個id就返回它對應的content,然后檢查這個id是否等于1024,這里就可以猜測1024這個id對應的content很有可能是我們想要的flag,但是我們傳入1024又無法獲取content的值,再仔細看一下代碼
??intval()取整函數,那我們傳入一個整數部分為1024的小數就可以了唄
??搞定了
??然后突然想到這里能不能進行SQL注入,感覺可以實驗一下,先用sqlmap簡單掃了一下,沒掃到,這里挖個坑,有時間可以試試能不能注入
14 GBK Injection
??看題目就知道是寬字節注入了,簡單介紹一下寬字節注入的原理
寬字節注入
??我們在做SQL注入的時候,會遇到payload中特殊字符被轉義導致失效的情況,這是由于在動態構造SQL語句前調用了轉義函數的緣故,有一種轉義函數addslash()可以在特殊字符前加上一個“\”,我們想要繞過這個限制,可以使用寬字節注入。
??GBK編碼采用雙字節編碼方案,編碼范圍為8140-FEFE,轉義字符\的編碼是5c,我們可以在提交引號前,再提交一個字符,使這個字符與5c連起來,正好在GBK編碼的范圍內,吃掉這個轉義字符,讓引號得以獨立出來,通常是在引號前加“%df”(反正只要“\”和這個字節放在一起剛好在GBK編碼范圍內就可以了)
看一下題目的提示:
把SQL語句都告訴我們了,連注入點都不用判斷了
先試試正常的單引號閉合 payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1’ --+
使用寬字節注入:
構造payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df’
成功閉合單引號,因為網頁有回顯(第二行),所以可以使用聯合查詢注入
首先order by判斷一下總共有幾列數據,我猜兩列(別問我怎么猜的)
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df’ order by 2–+
??http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df’ order by 3–+ 兩列正常,三列報錯,所以是兩列
接下來判斷回顯在哪一列
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df’ union select 1,2–+
確定了是第二列,下面就是常規操作了
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df’ union select 1,version()–+ 獲取數據庫版本
Mysql版本5.0以上,所以有information_shcema元數據庫
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df’ union select 1,database()–+ 獲取使用的數據庫名
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7361652d6368696e616c6f766572–+ 獲取數據庫中所有的表名
??發現好多表,一個一個試吧,這里信息量挺大的,找到了好多個flag,估計是后面一些題的答案,最終發現我們要的flag在ctf4這張表里
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df’ union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634–+ 查看ctf4這張表里的列名
只有兩列,索性就都輸出吧
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df’ union select 1,group_concat(id ,0,flag) from ctf4 --+ id和flag中間最好用一個字符隔開,因為這道題里特殊字符都會被轉義,因此我用的0
搞定了
??這道題用Sqlmap也可以,url要寫成http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df’ ,但是sqlmap不知道為什么掃出來說只能用布爾盲注和延時注入
15 /x00
這題還是404,但是看題目,和00截斷有關系,從別人那復制了一張截圖
??ereg()就是檢測字符串是否符合某種模式規則。strpos()是查看字符串中是否含有某子串,因此我們既要保證nctf傳入的字符串符合正則規則,又要含有子串“#biubiubiu”,就需要00截斷 nctf=1%00#biubiubiu即可
16 bypass again
??這道題和第一道題一樣,直接構造兩個md5值為0e開頭的字符串即可
搞定
17 變量覆蓋
變量覆蓋漏洞,得看php代碼
??紅框里給了php代碼的鏈接,有用的部分
??看到了extract()函數,變量覆蓋沒有懸念了
??我們想要的是輸出$theflag,就需要讓上面的if條件都成立
??第一個,要求提交的數據是post形式,因此我們不能直接通過url+?提交參數
??第二個,要求pass變量的值和thepassword_123里面的值相等,就需要用到變量覆蓋,pass是我們輸入的密碼,我們需要把thepassword_123變量的值通過變量覆蓋修改成和pass變量相等的值
??payload:pass=1&thepassword_123=1
提交之后
拼音就過分了吧。。。
18 PHP是世界上最好的語言
我這里這道題又掛了看不見_(:з」∠)_
從別人那里截過來的源碼
??要求傳入的id值不能為hackerDJ,而且url解碼之后的id值為hackerDJ,可以只對第一個字母h編碼,h的url編碼是%68,再編碼一次就是%2568。所以令id=%2568ackerDJ
??就可以得到flag。另外,
C++才是世界上最好的語言!
19 偽裝者
要求本地登錄,就是請求來源來自本地嘛。。。這題是我的知識盲區了,參考了別人的解法
??服務器端驗證客戶端IP有幾個途徑,http請求頭中的X-Forwarded-For/Client-IP以及nginx與客戶端建立TCP連接的時候使用的變量remoteaddr(只列出幾個,不全,感興趣的同學可以自己百度一下),其中remote_addr(只列出幾個,不全,感興趣的同學可以自己百度一下),其中remotea?ddr(只列出幾個,不全,感興趣的同學可以自己百度一下),其中remote_addr無法被偽造,那我們嘗試偽造前兩個
??payload1:X-Forwarded-For: 127.0.0.1????payload2:Client-IP:127.0.0.1 使用方法就是抓包然后在request里面添加payload就可以
??我看別人用payload1就成功了,我試了幾次都不行,就用的payload2
20 Header
??鏈接又掛了,看別人說是flag就在請求頭里,那抓包就可以了
21 上傳繞過
??鏈接雙掛了,但是文件上傳漏洞挺重要的,找來別人的解法參考一下
??思路就是00截斷,題目要求只能上傳jpg,gif,png類型的文件,又要求只有成功上傳.php文件才能得到flag,所以要繞過上傳限制,它是根據./uploads目錄下的basename進行識別的,因此我們上傳一個文件命名為1.php.jpg,然后抓包,找到/upload,改為/upload/1.php+,在16進制編碼中將+的16進制編碼“2b”改為“00”,即可獲取flag
22 SQL注入1
盲猜是SQL注入題
有個source,看來給了后臺源碼,先看一看
??紅框是注入點,單引號閉合,我們可以直接在user處閉合(也要注意閉合括號),后面注釋掉,這樣SQL語句就不會查詢密碼了,然后看下面,用戶名要求是admin,那我們直接構造user=admin’ ) #
flag有點挑釁啊,你也會sql?
23 pass check
題目里給了源碼,看一下
??post方式傳遞一個變量pass,然后檢查pass=pass1,相等才能獲取flag,。
??首先考慮了變量覆蓋漏洞,發現沒有能夠產生變量覆蓋的函數,然后看到了strcmp()函數,查了一下,php5.3以前的版本中這個函數有一個漏洞:
要求傳入兩個字符串,但是如果其中一個為非字符串,函數會報錯,但是返回值為“0”,即判斷相等
那就好辦了,只要我們post一個非字符串變量就可以了,比如數組:pass[]=12345(變量的值隨便寫什么都行)
hackbar執行一下
成功獲取flag
學到了,不過php版本怎么查看呢。。。。轉念一想,連后臺代碼都拿到了,查看php版本也不是什么問題了吧哈哈
24 起名字真難
給了源碼,意思就是需要傳入一個變量值等于54975581388,但是這個變量中又不能出現數字,那什么編碼是可以將數字轉換為純字母的呢。。。
試了幾種,發現就是10進制轉16進制-_-||
GET方式傳入key=0xccccccccc
25 密碼重置
這題挺神奇的,我先自己做了一遍,做出結果之后準備截圖寫博客,結果頁面報400.。。
用文字簡單描述一下吧
??題目要求修改admin賬戶的密碼,然后給了一個找回密碼的頁面,上面用戶名是寫死的“ctfuser”,有一個輸入框讓填新密碼,還有一個輸入框讓寫驗證碼。
??查看了一下源碼,是上傳數據是用POST方式,用戶名寫死了,又讓修改admin賬戶的密碼,第一想法是抓包。抓出來的包:
先嘗試改了一下最下面POST表單里的user,改為admin,重放一下沒成功,說明修改位置錯了唄,然后注意到request包開頭有個
兄弟你看起來有點眼熟。。。base64解碼一下,果然
看來服務器端判斷用戶名時還要驗證這個標記,把user1的值改為admin的base64編碼,再執行一下,獲取成功
總結
以上是生活随笔為你收集整理的南邮CTF Web类writeup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机课教学档案,档案专业计算机课改革项
- 下一篇: 2014山东春季高考计算机,山东春季高考