decode判断不为空拼接_空指针4月内部赛官方WP
生活随笔
收集整理的這篇文章主要介紹了
decode判断不为空拼接_空指针4月内部赛官方WP
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本次內(nèi)部賽含WEB跟RE題目各一道,其中RE題目7人解出,WEB題目1人解出,恭喜以上選手。
下面放上本次內(nèi)部賽的WP。
RE題目由于前幾次的空指針題目太難了,所以這次出了一道較為簡(jiǎn)單的題(要不然每次都0解太難看了// 向期待高難度賽題的選手們說(shuō)一聲抱歉,你們可以期待一下今年的N1CTF~這個(gè)程序?qū)崿F(xiàn)的功能為從一張圖的0結(jié)點(diǎn)出發(fā),向它的每一個(gè)相連的結(jié)點(diǎn)進(jìn)行DFS,每到一個(gè)新的結(jié)點(diǎn)就再開(kāi)啟一個(gè)線程繼續(xù)DFS,并記錄下當(dāng)前的路徑長(zhǎng)度,直到走到最后一個(gè)結(jié)點(diǎn)時(shí)判斷當(dāng)前長(zhǎng)度是否小于最小長(zhǎng)度,若是則更新最小長(zhǎng)度。不難看出這就是一個(gè)典型的使用DFS求最短路徑問(wèn)題,但是路徑數(shù)量很多,DFS復(fù)雜度較高,而且多線程存在競(jìng)爭(zhēng),導(dǎo)致原程序幾乎不可能跑出正確的結(jié)果,所以把最短路算法重新實(shí)現(xiàn)一遍就行了。此題的圖是個(gè)DAG,所以可以先進(jìn)行一次拓?fù)渑判蛟侔葱蜻M(jìn)行松弛操作即可求得最短路徑。當(dāng)然用Dijkstra Floyd SPFA之類的一把梭也行解題腳本:#include #include #include #include "data.h" // 提取出的鄰接矩陣using namespace std;long long d[1002];int topo[1111] = {0};int flag[1111] = {0};long long m[1000][1000];int main() { for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { m[i][j] = map[i][j]; } } int cur = 0; while (cur < 1000) { // printf("%d\n", cur); for (int i = 0; i < 1000; i++) { if (!flag[i]) { int x = 0; for (int j = 0; j < 1000; j++) { if (m[j][i]) { x++; } } if (!x) { topo[cur++] = i; flag[i] = 1; for (int j = 0; j < 1000; j++) { m[i][j] = 0; } } } } } for (int i = 0; i < 1000; i++) { d[i] = 0x3f3f3f3f3f3f3f3fll; } d[0] = 0; for (int u = 0; u < 1000; u++) { int uu = topo[u]; for (int v = 0; v < 1000; v++) { if (map[uu][v]) { if (d[v] > d[uu] + map[uu][v]) { // printf("%d %d %lld\n", uu, v, map[uu][v]); d[v] = d[uu] + map[uu][v]; } } } } printf("npointer{%lld}\n", d[999]);}WEB題目首先觀察題目功能:?1. 登陸2. 注冊(cè)3. 填寫(xiě)信息4. 上傳、裁剪頭像。經(jīng)過(guò)簡(jiǎn)單的測(cè)試可以發(fā)現(xiàn),登陸、注冊(cè)、填寫(xiě)信息這幾處因?yàn)閲?yán)格的輸入限制,基本問(wèn)題不大。那么就要研究一下頭像上傳處的功能了。通過(guò)測(cè)試,發(fā)現(xiàn)上傳功能是把頭像存到OSS云存儲(chǔ)里了,OSS相當(dāng)于一個(gè)第三方數(shù)據(jù)庫(kù),通過(guò)API存取數(shù)據(jù)。通過(guò)查閱阿里云OSS文檔,我們了解工作原理就可以排除一些測(cè)試項(xiàng)。比如這里就不用考慮上傳webshell了,即使上傳了也是無(wú)法被解析的。正常上傳頭像后要求用戶裁剪,這里和正常的裁剪功能不同,沒(méi)有傳遞裁剪的坐標(biāo)等信息。但是注意到有url:http://nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/user-avatar/test?x-oss-process=image/crop,x_51,y_213,w_259,h_146再次查閱文檔,了解到OSS不僅提供了存儲(chǔ)功能,還提供了一定的數(shù)據(jù)處理功能,這里使用的就是oss的圖片裁剪API。這里提供的功能是前端把裁剪后圖片按照oss裁剪API格式拼接好URL后,發(fā)送給后端,后端上傳到OSS中后返回用戶頭像的URL。0x0:猜想功能邏輯首先整體的功能邏輯大概就是后端獲取傳入的url,請(qǐng)求URL獲取裁剪后的圖片,獲取到數(shù)據(jù)后重新上傳,同時(shí)更新用戶頭像。1.parse_url首先進(jìn)行一些測(cè)試,通過(guò)下面兩個(gè)數(shù)據(jù)包,我們可以發(fā)現(xiàn)后端對(duì)url進(jìn)行了類似如下代碼的檢查。(下面?zhèn)未a)$host = parse_url($ur)if( ’nu1l-avatar.oss-cn-hangzhou.aliyuncs.com’ in $host[‘host'] ) 進(jìn)行下一步操作else 地址有誤內(nèi)容驗(yàn)證這里通過(guò)以下兩個(gè)數(shù)據(jù)包可以得知后端請(qǐng)求url后對(duì)數(shù)據(jù)格式進(jìn)行了驗(yàn)證。輸入url為//nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/../../../../../../../etc/passwd提示格式有誤,說(shuō)明請(qǐng)求了,但格式錯(cuò)誤。輸入url為data://nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIHWP4DwQACfsD/Qy7W+cAAAAASUVORK5CYII=提示成功,驗(yàn)證我們的猜想,后端進(jìn)行了格式驗(yàn)證。2.ext參數(shù)通過(guò)修改ext參數(shù),我們可以發(fā)現(xiàn),程序拋出了異常。這里我們可以推測(cè)后端功能的大概偽代碼如下:
$host = parse_url($ur)if( ’nu1l-avatar.oss-cn-hangzhou.aliyuncs.com’ in $host[‘host'] ) $target = xxxx . $_POST['ext']if (copy($url, $target)) if (checkFileType(xxxx) == 圖片 ) $oss -> upload(xxxx) else delete xxxx 格式有誤!else地址有誤這里貌似是一個(gè)任意文件寫(xiě)的漏洞,通過(guò)簡(jiǎn)單測(cè)試,我們發(fā)現(xiàn)我們的猜想是正確的。但嘗試向默認(rèn)Web目錄寫(xiě)shell,無(wú)法成功,可能的原因有路徑不對(duì)或沒(méi)有權(quán)限。無(wú)法獲取shell。但至此我們得到了一個(gè)有限條件的任意文件寫(xiě)漏洞!3.條件競(jìng)爭(zhēng)進(jìn)一步思考,我們可以想到這里大概率會(huì)存在條件競(jìng)爭(zhēng)(Race Condition)。我們可以開(kāi)啟三個(gè)線程:線程1:url輸入//nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/../../../../../../../etc/passwd線程2:url輸入data://nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIHWP4DwQACfsD/Qy7W+cAAAAASUVORK5CYII=線程3:請(qǐng)求自己的頭像(http://nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/2c7428db4958221b3dfdc39d62df69ba%3Favatar)如果存在某個(gè)時(shí)刻,線程2剛好運(yùn)行到$oss -> upload(xxxx)處,線程1剛好執(zhí)行copy,把/etc/passwd的內(nèi)容覆蓋了xxxx文件,那么線程2就會(huì)把/etc/passwd的內(nèi)容上傳至云存儲(chǔ)!測(cè)試一下:至此,我們得到了一個(gè)任意文件讀漏洞!
4.獲取webshell通過(guò)競(jìng)爭(zhēng)讀取源代碼、nginx配置文件我們發(fā)現(xiàn),目標(biāo)項(xiàng)目為單入口,即使寫(xiě)入shell也無(wú)法訪問(wèn)。這里通過(guò)閱讀framework.php,我們可以發(fā)現(xiàn)只需向web的Controller目錄寫(xiě)入一個(gè)符合格式的Controller即可執(zhí)行,這里不再贅述。0x02 結(jié)語(yǔ)對(duì)于題目有任何疑問(wèn)或更好的想法,歡迎聯(lián)系undefined@Nu1L。嚴(yán)肅的分割線
空指針5月公開(kāi)賽安排:
5月份我們將開(kāi)啟三場(chǎng)公開(kāi)賽,分別有Misc、Web、Pwn題目各一道,沒(méi)有邀請(qǐng)碼的選手請(qǐng)加油哦。
另外歡迎給我們投稿空指針題目,具體可以發(fā)郵件至npointer@163.com進(jìn)行咨詢,這個(gè)圈子的持續(xù)力需要各位CTFer一起努力~
總結(jié)
以上是生活随笔為你收集整理的decode判断不为空拼接_空指针4月内部赛官方WP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 4计算准确率_PyTorch实现,Git
- 下一篇: 雅马哈机器人左手右手系统_消防管件组装成