南邮ctf nctf CG-CTF web题writeup
目錄
- **CG-CTF鏈接:**
- 0x01 簽到題
- 0x02 md5 collision
- 0x03 簽到2
- 0x04 這題不是WEB
- 0x05 層層遞進
- 0x06 AAencode
- 0x07 單身二十年
- 0x08 php decode
- 0x09 文件包含
- 0x0a 單身一百年也沒用
- 0x0b Download~!
- 0x0c COOKIE
- 0x0d MYSQL
- 0x0e GBK Injection
- 0x0f /x00
- 0x10 bypass again
- 0x11 變量覆蓋
- 0x12 PHP是世界上最好的語言
- 0x13 偽裝者
- 0x14 Header
- 0x15 上傳繞過
- 0x16 SQL注入1
- 0x17 pass check
- 0x18 起名字真難
- 0x19 密碼重置
- 0x1a php 反序列化(暫時無法做)
- 0x1b SQL Injection
CG-CTF鏈接:
https://cgctf.nuptsast.com/challenges#Web
0x01 簽到題
題目鏈接:http://chinalover.sinaapp.com/web1/
查看源碼可得到flag
flag:nctf{flag_admiaanaaaaaaaaaaa}
0x02 md5 collision
題目鏈接:http://chinalover.sinaapp.com/web19/
題目給了源碼
經分析,題目需要我們輸入一個a值,要求a的md5值與’QNKCDZO’的md5值相同
QNKCDZO的md5值為0e830400451993494058024219903391
要使a的md5值與給出的md5值相同進行強行爆破不太現實
仔細觀察給出的md5值發現 該值以0e開頭的
PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0e”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0e”開頭的,那么PHP將會認為他們相同,都是0
所以我們只需要找到md5值為0e開頭的值賦予a 則可以得到flag
以下幾個值作為參考
所以在url后面跟上?a=s878926199a 即可得到flag
flag:nctf{md5_collision_is_easy}
0x03 簽到2
題目鏈接:http://teamxlc.sinaapp.com/web1/02298884f0724c04293b4d8c0178615e/index.php
題目要求輸入口令,而口令在下方已經直接給出
但是我們直接輸入是不行的,因為輸入框限制了輸入的長度為10
我們按下F12,將輸入框限制輸入長度改為更長,這里我改成了20
修改完畢后,在輸入框中輸入下面的口令,即可得到flag
flag:nctf{follow_me_to_exploit}
0x04 這題不是WEB
題目鏈接:http://chinalover.sinaapp.com/web2/index.html
經分析后,flag一定跟圖片有關,將圖片另存為本地
將圖片用文本格式或者用WinHex打開
可以看到flag隱藏在文本的最后面
flag:nctf{photo_can_also_hid3_msg}
0x05 層層遞進
題目鏈接:http://chinalover.sinaapp.com/web3/
鏈接打開后是一個很正常的網頁
我們查看源碼,可以看到一個名為SO.html的網頁
題如其名,層層遞進,點開SO.html后還有S0.html、SO.htm、S0.htm
最后我們會找到一個叫404.html的網頁
在源碼中我們可以看到一串奇怪的js注釋,仔細觀察一下就可以得到flag
此外我們也可以使用burp 很快就能找到404.html
flag:nctf{this_is_a_fl4g}
0x06 AAencode
題目鏈接:http://homura.cc/CGfiles/aaencode.txt
鏈接打開后全是顏文字表情(o_o) 這里應該是Unicode編碼
右鍵另存為頁面到本地 aaencode.txt 保存后再打開 就可以得到正常的aaencode
復制下來 在瀏覽器中按F12 在控制臺中 粘貼這些顏文字 即可得到flag
flag:nctf{javascript_aaencode}
0x07 單身二十年
題目鏈接:http://chinalover.sinaapp.com/web8/
點開burp抓包,可以得到flag
flag:nctf{yougotit_script_now}
0x08 php decode
題目給出代碼:
<?php function CLsI($ZzvSWE) {$ZzvSWE = gzinflate(base64_decode($ZzvSWE));for ($i = 0; $i < strlen($ZzvSWE); $i++) {$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);}return $ZzvSWE;} eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==")); ?>直接放到php里面跑一遍
發現有語法錯誤,把eval改成echo,即可得到flag
flag:nctf{gzip_base64_hhhhhh}
0x09 文件包含
題目鏈接:http://4.chinalover.sinaapp.com/web7/index.php
點開鏈接后,有一個click me?no 點一下
此時url為
通過對url進行分析以及題目名稱文件包含來看,題目提示flag在index中,這里發送了file為key,show.php為value的GET請求
<?php$file = $_GET["file"];... ...include($file); ?>index.php大致內容如上,通過訪問index.php?file=show.php,則$file=show.php,也就是include(show.php),而對于php的include()函數,會獲取指定文件的內容,在執行前將代碼插入到index.php文件中。而如果被包含的文件中無有效的php代碼,則會直接輸出無效的文件內容。通常利用無效代碼這一點來將文件內容輸出。
通過以上分析,我們應該是需要獲取index.php文件的內容進行下一步分析,那么就需要利用include(),包含index.php,并且是無效代碼的index.php文件,嘗試使用php偽協議php://filter,以base64編碼格式讀取文件(因為base64編碼的index.php無法執行,將會被直接輸出),構造:
文件路徑這里采取相對路徑,相對于/web7/index.php文件所在目錄下的index.php文件,即…/index.php(當前目錄下的index.php文件)
得到
用base64解密,即可得到flag,解密結果如下
<html><title>asdf</title><?phperror_reporting(0);if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}$file=$_GET['file'];if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){echo "Oh no!";exit();}include($file); //flag:nctf{edulcni_elif_lacol_si_siht}?> </html>flag:nctf{edulcni_elif_lacol_si_siht}
0x0a 單身一百年也沒用
題目鏈接:http://chinalover.sinaapp.com/web9/
這道題跟0x07一樣,直接抓包,不過這題的flag在響應頭中
flag: nctf{this_is_302_redirect}
0x0b Download~!
題目鏈接:http://way.nuptzj.cn/web6/
好像失效了⊙﹏⊙‖∣
0x0c COOKIE
題目鏈接:http://chinalover.sinaapp.com/web10/index.php
題目描述中有一個tips:0==not
抓包看看
抓包結果結合題目cookie 以及tips,我們試試將Cookie:Login=0修改為1,得到flag
flag:nctf{cookie_is_different_from_session}
0x0d MYSQL
題目鏈接:http://chinalover.sinaapp.com/web11/
點擊這個鏈接,結果真的是百度百科,我還仔細把百科看了一遍⊙﹏⊙‖∣
看上面提示,得知應該存在一個robots.txt,打開看看
上面的字由于編碼原因看不起了,不過大概能知道有一個sql.php文件以及flag跟下面的代碼有關
分析后發現存在一個intval()函數,用于獲取變量的整數值
根據下面的if函數分析,只要輸入一個整數位為1024,小數位不為0的id,即可得到flag,這里我用的是1024.1
flag:nctf{query_in_mysql}
0x0e GBK Injection
題目鏈接:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
顯示了當前語句,很容易看出來是字符型注入
嘗試在id=1后面加上一個單引號’,發現’被轉義為反斜杠\,再結合題目GBK Injection,不難想到這是一道寬字節注入題,我們可以用%df%27來代替單引號’,后面發現空格和#也被過濾了,所以用%23代替#,注釋號/**/代替空格
接下來開始注入
id=-1’ union select 1,2#
可以知道回顯位為2
id=-1’ union select 1,database()#
可以得到數據庫名為sae-chinalover
?id=-1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7361652d6368696e616c6f766572#
這里數據庫名字用16進制表示
可以得到ctf,ctf2,ctf3,ctf4,gbksqli,news六張表
查詢每一張表的列,以gbksqli為例
?id=-1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=0x67626b73716c69#
可以得到gbksqli中有flag列(ctf4表中有個假flag)
查詢flag值
?id=-1 union select 1,flag from gbksqli#
可以得到flag
flag:nctf{gbk_3sqli}
0x0f /x00
題目鏈接:http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php
題目給出代碼
ereg()函數用指定的模式搜索一個字符串中指定的字符串,如果匹配成功返回true,否則,則返回false。搜索字母的字符是大小寫敏感的,這里限制變量nctf的必須為數字型
strpos() 函數查找字符串在另一字符串中第一次出現的位置,返回字符串在另一字符串中第一次出現的位置,如果沒有找到字符串則返回 FALSE,這里限制nctf中必須含有’#biubiubiu’
同時要求變量為數字型且含有字符串片段,這里我們有兩種方法
方法一:ereg(array)返回NULL,strpos(array)返回NULL而NULL與FALSE類型是不同的,所以我們可以考慮傳入nctf為一個數組
方法二:根據題目名稱,我們可以用%00截斷的方式來獲得flag
ereg()函數存在NULL截斷漏洞,導致了正則過濾被繞過,所以可以使用%00截斷正則匹配
這里#用%23代替
flag:nctf{use_00_to_jieduan}
0x10 bypass again
題目鏈接:http://chinalover.sinaapp.com/web17/index.php
題目給出代碼
這里要求傳入a,b要求a,b的值不相同,而a,b的md5值相同,我們就想到0x02中,md5()函數中存在0e截斷,所以我們只用傳入兩個md5值為0e開頭的a,b值即可
s878926199a0e545993274517709034328855841020s155964671a0e342768416822451524974117254469這里采用0x02的數據
?a=s878926199a&b=s155964671a
同時,md5(array)的值為NULL,所以我們也可以考慮傳入兩個數組
flag:nctf{php_is_so_cool}
0x11 變量覆蓋
題目鏈接:http://chinalover.sinaapp.com/web18/index.php
下面有個source.php,給出代碼
要求傳入一個pass值,使得pass值與thepassword_123相同,即可得到flag,但我們不知道thepassword_123是多少
extract() 函數從數組中將變量導入到當前的符號表,該函數使用數組鍵名作為變量名,使用數組鍵值作為變量值。針對數組中的每個元素,將在當前符號表中創建對應的一個變量。
extract(array,extract_rules,prefix)中第二個變量是檢查和符號表中已存在的變量名是否沖突,而在上面為默認值,若沒有另外指定,函數將覆蓋已有變量,故傳入任意pass和與之相等的thepassword_123即可獲取flag
抓包,post傳入
flag:nctf{bian_liang_fu_gai!}
0x12 PHP是世界上最好的語言
題目鏈接:http://way.nuptzj.cn/php/index.php
題目已崩,說明PHP不是世界上最好的語言
0x13 偽裝者
題目鏈接:http://chinalover.sinaapp.com/web4/xxx.php
理論上抓包,加上X-Forwarded-For為127.0.0.1就可以成功,這里可能是題目崩了
0x14 Header
題目鏈接:http://way.nuptzj.cn/web5/
崩
0x15 上傳繞過
題目鏈接:http://teamxlc.sinaapp.com/web5/21232f297a57a5a743894a0e4a801fc3/index.html
一道正經的上傳題,我們隨便上傳一個文件提示我們應該上傳圖片,上傳一張jpg圖片,提醒我們應該改為PHP后綴
抓包,嘗試將filename改成1.jpg.php,失敗了
我們采用%00截斷,將upload/后面加上1.php .jpg,php后面有一個空格,方便一會兒修改
在hex中找到這里,把空格的20改成00
得到flag
flag:nctf{welcome_to_hacks_world}
(這里嘗試過將filename改成1.php .jpg再截斷,結果失敗了)
0x16 SQL注入1
題目鏈接:http://chinalover.sinaapp.com/index.php
有個Source,代碼如下
分析下代碼,明顯的帶括號的字符型,這里僅判斷user=admin即可登錄成功,所以我們直接閉合user之后的語句并讓user=admin即可
抓包,post,得到flag
flag:nctf{ni_ye_hui_sql?}
0x17 pass check
題目鏈接:http://chinalover.sinaapp.com/web21/
題目給出代碼
strcmp(string1,string2)函數比較兩個字符串,若返回0則string1=string2,返回<0則string1<string2,返回>0則string1>string2
這里要求我們傳入一個pass值與未知的pass1相同,即可得到flag
同樣,strcmp(array)的值為NULL
不過這里,好像出現了點小問題,無論如何都不能傳入pass值,gg
0x18 起名字真難
題目鏈接:http://chinalover.sinaapp.com/web12/index.php
題目給出代碼
ord(string)是求string的ascii值
分析下代碼,題目要求我們傳入一個key其中不能含有數字,又要跟’54975581388’相同
一開始沒什么思路,不過把’54975581388’換成16進制,就知道了
54975581388=0xccccccccc
flag:nctf{follow_your_dream}
0x19 密碼重置
題目鏈接:http://nctf.nuptzj.cn/web13/index.php?user1=Y3RmdXNlcg==
題目要求我們重制管理員admin的密碼
我們將賬號欄改成admin,發現無法修改,驗證碼告訴了是1234
抓包
發現失敗了,我們再看一下url
發現有個user1=Y3RmdXNlcg==
看上去是個base64編碼,解碼后為ctfuser,為默認輸入的值,所以我們還需要將admin的base64值加到url的user1=后面
admin的base64值為YWRtaW4=
nctf{reset_password_often_have_vuln}
0x1a php 反序列化(暫時無法做)
題目鏈接:http://4.chinalover.sinaapp.com/web25/index.php
0x1b SQL Injection
題目鏈接:http://chinalover.sinaapp.com/web15/index.php
查看源碼可以得到提示
分析下代碼,clean()函數中stripslashes(string)函數的作用是去掉字符串string中的反斜杠\,htmlentities(string, ENT_QUOTES)的作用是將字符串中string的單引號和雙引號編碼
總結
以上是生活随笔為你收集整理的南邮ctf nctf CG-CTF web题writeup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用字节流和字符流向浏览器输出数据
- 下一篇: 自动延时关机电路分析