當前位置:
首頁 >
decode判断不为空拼接_空指针4月内部赛官方WP
發布時間:2024/10/12
49
豆豆
生活随笔
收集整理的這篇文章主要介紹了
decode判断不为空拼接_空指针4月内部赛官方WP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本次內部賽含WEB跟RE題目各一道,其中RE題目7人解出,WEB題目1人解出,恭喜以上選手。
下面放上本次內部賽的WP。
RE題目由于前幾次的空指針題目太難了,所以這次出了一道較為簡單的題(要不然每次都0解太難看了// 向期待高難度賽題的選手們說一聲抱歉,你們可以期待一下今年的N1CTF~這個程序實現的功能為從一張圖的0結點出發,向它的每一個相連的結點進行DFS,每到一個新的結點就再開啟一個線程繼續DFS,并記錄下當前的路徑長度,直到走到最后一個結點時判斷當前長度是否小于最小長度,若是則更新最小長度。不難看出這就是一個典型的使用DFS求最短路徑問題,但是路徑數量很多,DFS復雜度較高,而且多線程存在競爭,導致原程序幾乎不可能跑出正確的結果,所以把最短路算法重新實現一遍就行了。此題的圖是個DAG,所以可以先進行一次拓撲排序再按序進行松弛操作即可求得最短路徑。當然用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. 注冊3. 填寫信息4. 上傳、裁剪頭像。經過簡單的測試可以發現,登陸、注冊、填寫信息這幾處因為嚴格的輸入限制,基本問題不大。那么就要研究一下頭像上傳處的功能了。通過測試,發現上傳功能是把頭像存到OSS云存儲里了,OSS相當于一個第三方數據庫,通過API存取數據。通過查閱阿里云OSS文檔,我們了解工作原理就可以排除一些測試項。比如這里就不用考慮上傳webshell了,即使上傳了也是無法被解析的。正常上傳頭像后要求用戶裁剪,這里和正常的裁剪功能不同,沒有傳遞裁剪的坐標等信息。但是注意到有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不僅提供了存儲功能,還提供了一定的數據處理功能,這里使用的就是oss的圖片裁剪API。這里提供的功能是前端把裁剪后圖片按照oss裁剪API格式拼接好URL后,發送給后端,后端上傳到OSS中后返回用戶頭像的URL。0x0:猜想功能邏輯首先整體的功能邏輯大概就是后端獲取傳入的url,請求URL獲取裁剪后的圖片,獲取到數據后重新上傳,同時更新用戶頭像。1.parse_url首先進行一些測試,通過下面兩個數據包,我們可以發現后端對url進行了類似如下代碼的檢查。(下面偽代碼)$host = parse_url($ur)if( ’nu1l-avatar.oss-cn-hangzhou.aliyuncs.com’ in $host[‘host'] ) 進行下一步操作else 地址有誤內容驗證這里通過以下兩個數據包可以得知后端請求url后對數據格式進行了驗證。輸入url為//nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/../../../../../../../etc/passwd提示格式有誤,說明請求了,但格式錯誤。輸入url為data://nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIHWP4DwQACfsD/Qy7W+cAAAAASUVORK5CYII=提示成功,驗證我們的猜想,后端進行了格式驗證。2.ext參數通過修改ext參數,我們可以發現,程序拋出了異常。這里我們可以推測后端功能的大概偽代碼如下:
$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地址有誤這里貌似是一個任意文件寫的漏洞,通過簡單測試,我們發現我們的猜想是正確的。但嘗試向默認Web目錄寫shell,無法成功,可能的原因有路徑不對或沒有權限。無法獲取shell。但至此我們得到了一個有限條件的任意文件寫漏洞!3.條件競爭進一步思考,我們可以想到這里大概率會存在條件競爭(Race Condition)。我們可以開啟三個線程:線程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:請求自己的頭像(http://nu1l-avatar.oss-cn-hangzhou.aliyuncs.com/2c7428db4958221b3dfdc39d62df69ba%3Favatar)如果存在某個時刻,線程2剛好運行到$oss -> upload(xxxx)處,線程1剛好執行copy,把/etc/passwd的內容覆蓋了xxxx文件,那么線程2就會把/etc/passwd的內容上傳至云存儲!測試一下:至此,我們得到了一個任意文件讀漏洞!
4.獲取webshell通過競爭讀取源代碼、nginx配置文件我們發現,目標項目為單入口,即使寫入shell也無法訪問。這里通過閱讀framework.php,我們可以發現只需向web的Controller目錄寫入一個符合格式的Controller即可執行,這里不再贅述。0x02 結語對于題目有任何疑問或更好的想法,歡迎聯系undefined@Nu1L。嚴肅的分割線
空指針5月公開賽安排:
5月份我們將開啟三場公開賽,分別有Misc、Web、Pwn題目各一道,沒有邀請碼的選手請加油哦。
另外歡迎給我們投稿空指針題目,具體可以發郵件至npointer@163.com進行咨詢,這個圈子的持續力需要各位CTFer一起努力~
總結
以上是生活随笔為你收集整理的decode判断不为空拼接_空指针4月内部赛官方WP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4计算准确率_PyTorch实现,Git
- 下一篇: 怎么看到方法内引用方法的注释_网页内文字