0x00
大佬在群里分享的一次外校的招新ctf賽,沒什么經(jīng)驗(yàn),第一次個(gè)人參加,做出了幾題,雖然挺開心的。但是還是有挺多題目做不出來。(萌新瑟瑟發(fā)抖...)
0x01
include me
題目給的提示是index,但是打開以后的界面是這樣的

結(jié)合題目,猜測是通過include函數(shù)去包含不同的php文件,這時(shí)想到通過php偽協(xié)議去讀取index頁面的源碼
構(gòu)造payload:
php://filter/read=convert.base64-encode/resource=index.php
通過burp抓包以后修改請求得到了返回了一段base64的字符串.

解碼以后得到了index.php的源碼:
<?php
if(isset($_GET["lang"])){
$lang=$_GET["lang"];
}else{
$lang="cn.php";
}
?>
<form>
<select style="width:60px;" name="lang">
<option value="cn.php"<?php echo $lang=="cn.php"?"selected":"";?>>Chinese</option>
<option value="en.php"<?php echo $lang=="en.php"?"selected":"";?>>English</option>
<option value="kr.php"<?php echo $lang=="kr.php"?"selected":"";?>>
Korean</option>
<option value="jp.php"<?php echo $lang=="jp.php"?"selected":"";?>>Japanese</option>
<option value="de.php"<?php echo $lang=="de.php"?"selected":"";?>>German</option>
<option value="fr.php"<?php echo $lang=="fr.php"?"selected":"";?>>French</option>
<input type="submit" value="change language">
</form>
<?php
$flag="SUCTF{ha_ha_ha_you_win}";
include $lang;
?>
一下就看到flag了。這道題也是相對簡單的,考察的是關(guān)于文件包含漏洞的相關(guān)知識,而php有一些內(nèi)置協(xié)議file://、php://、 data://等等可以做到更多的事情。
onepiece

作為海賊迷,我也相信onepiece是真的存在的,所以剛看到題目的時(shí)候我就想著一定要做出來,結(jié)果到最后都沒做出來, o(╥﹏╥)o

題目提示用了phpstorm,然后搜索了一下發(fā)現(xiàn)在phpstrom下面建項(xiàng)目是會建立.idea這個(gè)目錄的,所以直接輸入目錄看到了下面的3個(gè)文件,一個(gè)個(gè)點(diǎn)開終于在第三個(gè)文件中發(fā)現(xiàn)了東西。

仔細(xì)看了整個(gè)文件發(fā)現(xiàn)了這個(gè)項(xiàng)目還有另外的3個(gè)頁面,然后呢第一個(gè)UpL0ad.php頁面一開始不停上傳一句話木馬都沒反應(yīng)就放棄了

后來打開了README.html,看到了接下來的提示

根據(jù)提示,把onepiece.zip文件下載下來后得到一個(gè)php文件
<?php
if (!defined("BEBCEFCCAC")){define("BEBCEFCCAC", __FILE__);global $?$垟,$剶?$崒憢,$湊灋?$€搰殎?$帨櫀煍?$挐焾啌帥,$棞垑噭殕?$妵槗仜寫梾,$垨洊墭晸焾?$泙瀮媶墕崕挅,$唴檪搳殮搼晧?$?帊墤墛弽棖槦,$剢憸帢晳媭媴敐?$煓墴垬垰仈姁寔垕;function 暊($暊,$垟?""){global $?$垟,$剶?$崒憢,$湊灋?$€搰殎?$帨櫀煍?$....
打開這個(gè)php看到一串的亂碼,整個(gè)人都傻了,后來查到這是經(jīng)過了php混淆加密以后的文件,接下來就是去找解密的方法,一開始找到某個(gè)大佬的解密方法(http://sec2hack.com/web/phpjiami-decode.html),但是自己跟著弄了幾次都不行就放棄了....看來onepiece是看不到了。后來比賽方放出writeup的時(shí)候

跟著用了上面的解密網(wǎng)站一下就解密了文件...想當(dāng)時(shí)我用其他網(wǎng)站解密的時(shí)候各種問題,而且還要收費(fèi),雖然我沒花錢...
classic sql

這題一開始弄到手也不知道怎么做,因?yàn)榘l(fā)現(xiàn)黑名單過濾了很多常用的字符串,于是就一直搜,搜到了一題基本一樣的題目(https://github.com/hongriSec/PHP-Audit-Labs/blob/master/PHP-Audit-Labs%E9%A2%98%E8%A7%A3/Day13-16/files/README.md),是紅日安全-代碼審計(jì)小組的一道題目。
這題的思路是

詳細(xì)的解釋就是:

通過\去轉(zhuǎn)義user的一個(gè)單引號,使得user的值變成了
\' and pwd =
然后后面
||
實(shí)際上就是or的意思
另外REGEXP函數(shù)也有一些語法規(guī)則可以匹配特定的字符串,可自行搜索了解
xss1

這道題是關(guān)于xss的,根據(jù)js腳本可以看到只要輸入alert就會被替換,那要做的就是把a(bǔ)lert用其他方法表示出來。官方的writeup是根據(jù)jsfuck來做的,而我不是:

將alert字符串通過parseInt方法轉(zhuǎn)成一個(gè)整數(shù),然后把這個(gè)整數(shù)再通過toString方法轉(zhuǎn)回alert,這樣payload就是
eval((8680439).toString(30))(1)
就沒有alert這個(gè)字符串.但是這題還有一點(diǎn)要注意的是我們輸入的字符串被兩個(gè)雙引號包圍了,如果直接輸入payload也不能實(shí)現(xiàn)彈窗


在控制臺可以看到字符串被包圍了,那這時(shí)就需要逃脫雙引號,我們可以使用
" + "
前后兩個(gè)雙引號分別閉合原先代碼中的雙引號,這時(shí)payload就變成了
"+eval((8660439).toString(30))(1)+"
php is No.1

這題主要是關(guān)于php的弱等于的知識.

這是官方的writeup,這里說的is_numeric我還真不知道,不過我是用科學(xué)計(jì)數(shù)的表示去做的,
我的payload是:
time=3.888e6 & num=0e1
首先這兩個(gè)都是整數(shù)能通過is_numeric函數(shù),這時(shí)進(jìn)入到最里面的if-elseif-else語句,而要讓通過計(jì)算可以得到3.888*10^6是介于題目要求的兩個(gè)數(shù)之間,然后php中把一個(gè)變量強(qiáng)制轉(zhuǎn)換成int的時(shí)候,遇到字母就會截?cái)?例如
$ a = '123a.0123'
$ b = (int) $a ; //實(shí)際上b會等于123
那么這時(shí)我們大概等待4s就可以得到flag了。
0x10
這次實(shí)際上沒做出什么題目,但是挺開心,畢竟開始能看懂和自己弄懂一些題目了。另外這次比賽還有幾題比較難的,還沒有復(fù)現(xiàn)成功,鑒于題目要關(guān)掉了,還沒時(shí)間做,暫時(shí)就弄到這里吧。