這是一道HCTF2018的Web題
代碼審計(jì)類型
打開題目堕绩,一個(gè)滑稽。F12看下源代碼胡陪,發(fā)現(xiàn)source.php文件
訪問簿煌,發(fā)現(xiàn)是代碼審計(jì)。
代碼過長胎署,我們分段開始審計(jì)。
首先來分析這段代碼的邏輯流程。
我們可以看到在這里定義了一個(gè)名為emm的類辐马,行,先放著不管局义,我們繼續(xù)看后面的
這邊是一個(gè)if邏輯判斷喜爷,我們可以總結(jié)出需要的條件:
1.參數(shù)file需要傳入一個(gè)值,這里需要通過GET方式傳參//! empty($_REQUESTS['file'])
2.參數(shù)file傳入的值必須是字符串
3.將file參數(shù)帶入最開始定義的那個(gè)emm類里面進(jìn)行判斷
現(xiàn)在我們?cè)倩氐絼偛抛铋_始的那個(gè)emm類中去分析
我們看到將值帶入了變量page中萄唇,然后定義了一個(gè)白名單($whitelist)檩帐,并且進(jìn)行了一個(gè)if判斷,我們需要同時(shí)滿足page的值不為空另萤,且page的值必須是字符串才可以返回ture湃密。
這邊進(jìn)行了兩個(gè)操作,第一個(gè)是一個(gè)if判斷四敞,判斷page的值是否存在于$whitepage數(shù)組中泛源,如果存在就返回ture。第二個(gè)是對(duì)page進(jìn)行了一個(gè)截取操作忿危,在截取這里有兩個(gè)函數(shù)达箍,我在這里也講一下
1.mb_substr()的定義是返回字符串的一部分,也就是所說的截取铺厨。
2.mb_strpos()的定義是查找一個(gè)字符串在另外一個(gè)字符串首次出現(xiàn)的位置缎玫。
所以結(jié)合起來,這里就是在page中找到?這個(gè)符號(hào)解滓,并且將?之前的所有字符截取碘梢,這個(gè)時(shí)候page變量的新值就是截取出來的字符。
后面進(jìn)行了一次url解碼以及又進(jìn)行了于$whitelist對(duì)比的判斷伐蒂。
在hint.php文件中我們可以知道flag在的地方煞躬,所以構(gòu)造請(qǐng)求(對(duì)?進(jìn)行兩次url編碼,服務(wù)器端解碼一次,代碼里面又進(jìn)行一次解碼)
最終的請(qǐng)求:?file=hint.php%253f../../../../../ffffllllaaaagggg