題目鏈接:https://cgctf.nuptsast.com/challenges#Web
簽到題
???? 查看網頁源碼找到flag
MD5? ?
?? ? 在PHP中md5()和sha1()函數都存在一個漏洞,當像函數中傳入數組時會無法處理返回同一值,即不同的數組通過md5(),sha1()處理后結果是一樣的。同時PHP在處理哈希字符串時,會利用”!=”或”==”來對哈希值進行比較,它把每一個以”0E”開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認為他們相同,都是0。傳一個a[]=240610708過去即可。常見payload如下:
QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a
sha1(str) sha1('aaroZmOk') sha1('aaK1STfY')
sha1('aaO8zKZF')? sha1('aa3OFF9m')
簽到題2
???? 用burpsuite修改包,發送完整指令拿到flag。或者F12修改maxlenght。
這題不是WEB
???? 下載網頁中GIF,notepad打開,搜索nctf即可找到flag。
層層遞進
???? 查看網頁源碼,發現一個so.html的鏈接,后面屬性值的長寬均為零比較詭異,點進去再看源碼依然有一個so.html,根據題名層層遞進,最后找到一個404.html,源碼中隱藏flag。
AAENCODE
???? win下chrome瀏覽器打開亂碼無法顯示(其他瀏覽器沒試過),linux下用curl命令獲取網頁內容,指令格式為curl url –silent。得到的JS顏文字加密密文,放到瀏覽瀏覽器的控制臺即console中跑一次(按回車)即可得到flag。
單身二十年
???? Burpsuite發包截包即可得到flag
Php decode
???? 下載明文密文,在明文中截取和密文同樣長度的字段,與密文異或運算后得到flag。一開始以為是要把密文補零再和明文異或結果flag只出來一半,很坑。
文件包含
? ? ?簡單的文件包含,當發現url中有?file=字樣時可以修改后面為?file=php://filter/convert.base64-encode/resource=xxx.php來查看對應文件源碼,此題好像是直接看index.php源碼即可拿到flag。這個語句拿到的源碼一般是base64加密的,可以找個在線網站解,也可以在python中用base64庫解,base64.b64decode()。
單生一百年
???? 同單生二十年,仍然可用Burpsuite截包得到flag
Download~!
????下載鏈接url=+文件名稱base64編碼,將download.php編碼后下載得到flag
COOKIE
????請求頭中有Cookie:login=0,改為1即可得到flag。
MYSQL
????根據提示查看robots.txt,提示向sql.php提交一個id, id=1024顯示再次嘗試,其它id均為msg,則可以用1024.1繞過php檢測,在mysql中查詢時1024.1因為精度問題按1024查詢,顯示flag
GBK INJECTION
????單引號會被/注掉,可以用%df吃掉/封閉id,再使用Union select逐步爆庫名表名字段名及字段。大概注入姿勢如下:?id=-1%df%27%20union%20select%201,database()%23,其中%27是單引號url編碼,%20是空格,%23是#用來注釋后面多余的語句。前面的查詢是id和title兩列,后面也應該是兩個,所以湊了個1,試了一下它會顯示兩列中的第二列,所以把database()放到后面,庫名就出來了是sae-chinalover。接著爆表名? -1%df%27%20union%20select%201,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=0x7361652d6368696e616c6f766572%23
這塊煩一點,group_concat是把查詢結果整合成一塊,為了湊兩列。information_schema這個表存著所有數據庫的相關信息,例如tables這個表里有所有表的信息,table_schema字段存著所屬數據庫,table_name存著對應表的名字。因為單引號會被轉義,所以使用16進制來表示,python下編碼為'sae-chinalover'.encode('hex')再加上0x即可。表名如下ctf,ctf2,ctf3,ctf4,news。然后就爆字段吧。用information_schema.columns這個表。
id=-1%df%27%20union%20select%201,group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=0x63746634%23(這個是爆ctf4這個表的,多試一下flag在這個表里)
出兩個字段id,flag,再爆flag即可。
id=-1%df%27%20union%20select%201,group_concat(flag)%20from%20ctf4%23
然后就出flag了。
/X00
????ereg()在匹配字串是檢測到%00會停止,而strpos()會繼續,故構造nctf=1%00%23biubiubiu即可得到flag
BYPASS AGAIN
????傳入值不想等的數組即可,a[]=1&b[]=2,之前提過的md5()sha1()漏洞
變量覆蓋
????register_global=ON時POST傳入數據值會覆蓋掉php中變量值,源碼中對post數據進行了extract()處理,extract()函數會將數組中的值賦給對應索引,故傳入pass=1&thepassword_123=1即可。post可以用firefox的hackbar插件實現,也可以用python的requests庫。
PHP是世界上最好的語言
????Php會對post的數據自動url解碼,網頁要求不能傳入hackerDJ,但ulr解碼后為hackerDJ才能得到flag,故對hackerDJ進行兩次url編碼上傳后得到flag(ps:python中的urllib.quote()以及php中的urlencode()不能對字母進行url編碼,可以手工把字母轉為ASCII碼然后加上%號,第二次再把%變為%25即可)
偽裝者
????要求本地賬戶登陸才行,故添加X-Forwarded-For為127.0.0.1,獲取flag失敗,估計題出問題了。
Header
????Flag在響應頭里
文件上傳
????要求繞過檢測上傳php文件,%00截斷用不了,仔細觀察回饋數據,發現basename為/uploads/后面的內容加上filename=后面的內容,filename為/uploads/后面的內容加上filename=后面‘.’前面的內容,’.’后面的內容被識別為文件類型,所以filename=后面必須填x.jpg。在/uploads/后面寫1.php%00截斷,發現不行,于是把%00替換為空格標記該位置,在16進制中找到對應的位置,把20(空格的16進制)改為00截斷,提交成功。
SQL1
????查看源碼,發現可以注釋掉SQL中user后面的內容,直接搜尋admin的內容即可登陸成功,在用戶名處注入如下admin’)#即可拿到falg。
Passcheck
????Strcmp漏洞為傳入不同類型的數據比較會報錯但同時返回相等的信息,故post pass[]=1即可。在python中執行 requests.post(‘url’,data={‘pass[]’:1}).text即可得到flag。
起名字真難
????根據代碼知要交一段等于‘54975581388‘的字符串,且每位不能為數字,故post其16進制即可,?key= 0xccccccccc得到flag
密碼重置
????頁面鏈接url=后為‘ctfuser’的base64編碼,改為admin,burpsuite截包再把用戶名框里的ctfuser改成admin得到flag。
密碼重置2
????根據提示查看源碼可以找到管理員郵箱,提交管理員郵箱和任意密碼后顯示fail,根據第二個提示非正常退出vi后會產生’.’+filename+’.swp’的文件,故查看.submit.php.swp文件,可看出當token長為10且為0時可得到flag,故輸入管理員郵箱+十個0即可得到flag。
file_get_content
? ? 很經典的一類題,傳一個文件名上去,要求文件中有某些數據。文件名傳‘php://input'這個文件里存著post的數據,同時再Post要求的數據即可拿到flag。即post meizijiu。
SQL2
????$query =
@mysql_fetch_array(mysql_query("select pw from ctf where
user='$user'")); 上為注入點,查詢結果將與輸入密碼md5加密后的結果進行比對,假設輸入密碼為1,則需要讓查詢結果為1的md5值,用戶名處輸入‘ UNION SELECT “c4ca4238a0b923820dcc509a6f75849b” #,先用空格加單引號使前面的查詢結果為空并封閉單引號,union select +md5(1)查詢結果為1的md5加密結果。再用#號注釋掉最后的’號即可拿到flag。
SQLinjection
????源碼對輸入進行了處理,htmlentities($str,
ENT_QUOTES);,單雙引號將被處理為html文本,即單引號變為',注入點在單引號內,則沒辦法添加單引號閉合,提示用/可以注釋單引號,則可以用/消滅掉一個單引號,query原本為WHERE
name=’$username’ AND pass=’$password’。Admin處填“/”則變為WHERE name=(’/’ AND
pass=’)$password’。再將$password寫為” or 1#”
則整個查詢語句變為SELECT
* FROM users WHERE name=(‘/’ AND pass=’) or 1。可知查詢結果為整個表,則$result不為空且查詢結果大于1,獲得flag。
綜合題
????根據aaencode不難看出為js加密,去掉漢字,放到console中跑一下得到一個php文件名稱,訪問之在消息頭得到tip,提示history of bash,查詢得知在用戶的~目錄下有一個.bash_history的文件,其中存放著500條左右的命令行命令,查看后發現一條壓縮命令,壓縮了一個叫flagbak.zip的文件,下載后解壓得到flag。