ホームページ >バックエンド開発 >PHPチュートリアル >PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)

PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)

不言
不言オリジナル
2018-08-17 10:58:461277ブラウズ

この記事の内容は、PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性をどのように見つけることができるかについてです。一定の参考価値があります。困っている友人は参照できます。お役に立てれば幸いです。

1. 背景

著者はコンピュータに触れて以来、ネットワーク セキュリティに興味を持っていました。 PHPをやっています 開発後はWEBのセキュリティには細心の注意を払っていましたが、2016年に偶然Taint拡張機能を発見し、体験してみると非常に便利であることが分かりましたが、当時関連情報を確認したところ、 , この拡張機能に注目している人があまりいないことがわかりました。最近、コンピューターを変更したため、この拡張機能を再度インストールした後、この拡張機能を使用している人がまだ比較的少ないことがわかりました。そこで、インストール プロセスを記録し、テストしました結果を表示することで、その後の利用が容易になり、より多くの開発者が汚染を理解できるようになります。

2. 操作の概要

  1. ソース コードのダウンロードとコンパイル

  2. 拡張構成とインストール

  3. 機能検査とテスト

##3. ソース コードのダウンロードとコンパイル

Taint 拡張機能 PHP 自体は、Linux または Mac システムでは作者が提供しません。ソース コードをダウンロードして自分でコンパイルし、インストールする必要があります。

3.1 ソースコードのダウンロード

作者の開発環境は Mac システムなので、PHP の pecl 拡張 Web サイトにアクセスしてソース コードをダウンロードする必要があります。そのアドレスは次のとおりです。

https://pecl.php.net/package/taint
拡張機能 URL の最後には、以下に示すようにダウンロード アドレスの行が表示されます。

PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)

作者 適切なバージョンを選択する必要があります作者の開発環境はPHP7.1なので最新版を選択しました 対応するダウンロードアドレスは以下の通りです:

https://pecl.php.net/get/taint-2.0.4.tgz
wgetを使用してソースコードをダウンロードします 参考コマンドは以下の通りです:

wget https://pecl.php.net/get/taint-2.0.4.tgz
ダウンロード後、解凍する必要があります。解凍コマンドのリファレンスは次のとおりです。

tar -zxvf taint-2.0.4.tgz
解凍後、ディレクトリに入ります。参考コマンドは次のとおりです。

cd taint-2.0.4

3.2 ソース コードのコンパイル

次に、ソース コードをコンパイルする必要があります。コンパイルする前に、phpze を使用して PHP 環境を検出できます。参照コマンドは次のとおりです:

phpize
返される結果は次のとおりです

Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
Makefileを生成し、コンパイルの次のステップの準備をします

./configure
結果を返します

checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no

creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
コンパイルとインストールを開始します

make && make install
(cd .libs && rm -f taint.la && ln -s ../taint.la taint.la)
/bin/sh /Users/song/taint-2.0.4/libtool --mode=install cp ./taint.la /Users/song/taint-2.0.4/modules
cp ./.libs/taint.so /Users/song/taint-2.0.4/modules/taint.so
cp ./.libs/taint.lai /Users/song/taint-2.0.4/modules/taint.la
----------------------------------------------------------------------
Libraries have been installed in:
   /Users/song/taint-2.0.4/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `DYLD_LIBRARY_PATH' environment variable
     during execution

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/local/Cellar/php71/7.1.14_25/lib/php/extensions/no-debug-non-zts-20160303/

4. 設定とインストール#拡張機能をコンパイルした後、作成者は指定された場所に Taint を配置し、それが有効になるように設定ファイルを変更する必要もあります

#4.1 taint の設定

作成者は、まず PHP について理解する必要があります。設定ファイルとは何ですか? 次に、設定ファイルの拡張子パスを確認することで、対応するファイルに so ファイルを置くことができます。設定ファイルの場所を確認するコマンドは次のとおりです。

php --ini
返される結果は次のとおりです

Configuration File (php.ini) Path: /usr/local/etc/php/7.1
Loaded Configuration File:         /usr/local/etc/php/7.1/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.1/conf.d
Additional .ini files parsed:      /usr/local/etc/php/7.1/conf.d/ext-opcache.ini
作者 php.ini が

/usr/local に配置されていることがわかります。 /etc/php/7.1/php.ini

設定ファイルを理解した後、作成者は拡張フォルダーの場所を見つける必要があります。次のコマンドを参照してください。

cat /usr/local/etc/php/7.1/php.ini | grep extension_dir
コマンドの実行結果は以下の通りで、拡張機能フォルダーの場所が

/usr/local/lib/php/pecl/20160303

extension_dir = "/usr/local/lib/php/pecl/20160303"
; extension_dir = "ext"
; Be sure to appropriately set the extension_dir directive.
;sqlite3.extension_dir =
であることがわかります。 extension

次に、拡張ファイルを PHP 拡張ファイルの場所にコピーする必要があります。参照コマンドは次のとおりです。

cp /usr/local/Cellar/php71/7.1.14_25/lib/php/extensions/no-debug-non-zts-20160303/taint.so /usr/local/lib/php/pecl/20160303/
コピーが完了したら、構成を編集する必要があります

vim /usr/local/etc/php/7.1/php.ini
に設定項目をコピーし、php.iniファイルにTainの設定項目を追加します参考設定は以下の通りです:

[taint]
extension=taint.so
taint.enable=1
taint.error_level=E_WARNING

4.3 インストール結果の確認

設定ファイルを保存して終了したら、作者のインストールが完了したことを意味します。有効にするために PHP を再起動する必要があります。参考コマンドは次のとおりです

brew services restart php@7.1
再起動が完了したら、現在の PHP 拡張機能に Taint があるかどうかを確認するコマンドを使用できます。参考コマンドは次のとおりです:

php -i | grep taint
返された結果に次の情報が表示された場合、インストールは完了しています基本的には成功しています。

taint
taint support => enabled
taint.enable => On => On
taint.error_level => 2 => 2

5. 機能の検査とテスト

上記の 2 段階の操作を完了すると、作成者はインストール段階を完了しました。次に、taint を使用して検証する必要があります。 3 つのパートに分かれており、最初に taint の作者のデモ コードを使用してテストし、次にペネトレーション テスト システム permeate を使用してテストし、最後に作者が普段開発しているコードを使用してテストします。

5.1 デモ ファイル テスト

デモ ファイルを使用したテストの目的は、作成者がインストールしたテイントが実際に有効かどうかを検証し、テイントが有効かどうかを確認することです。意味があります。

5.1.1 デモ コードをコピーします

作者の GitHub に次のデモ コードがありますので、これを Web ディレクトリにコピーしました。場所は次のとおりです。

/Users/song/mycode/safe/permeate
デモ コードの内容は次のとおりです。読者は実験時にコピーできます。

<?php $a = trim($_GET[&#39;a&#39;]);

$file_name = &#39;/tmp&#39; .  $a;
$output    = "Welcome, {$a} !!!";
$var       = "output";
$sql       = "Select *  from " . $a;
$sql      .= "ooxx";

echo $output;

print $$var;

include($file_name);

mysql_query($sql);

5.1.2 仮想ホストの構成

コード ファイルが保存されると、作成者はこのファイルにブラウザー アクセスするために、nginx 構成ファイルに仮想ホストを追加する必要があります。参照構成は次のとおりです:

    server {
        listen       80;
        server_name  test.localhost;
        root  /Users/song/mycode/safe/permeate;
        location / {
            index index.html index.htm index.php; 
        }

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }

5.1.3 ブラウザー アクセス

続行 作成者はブラウザを通じて対応するコード ファイルにアクセスします。URL アドレスは次のとおりです:

http://test.localhost/taintdemo.php?a=1
ブラウザがページにアクセスすると、作成者はページ上にいくつかの警告メッセージを確認できます。 、内容は次のとおりです:

Warning: main() [echo]: Attempt to echo a string that might be tainted in /Users/song/mycode/work/test/taintdemo.php on line 10
Welcome, 1 !!!
Warning: main() [print]: Attempt to print a string that might be tainted in /Users/song/mycode/work/test/taintdemo.php on line 12
Welcome, 1 !!!
Warning: main() [include]: File path contains data that might be tainted in /Users/song/mycode/work/test/taintdemo.php on line 14

Warning: include(/tmp1): failed to open stream: No such file or directory in /Users/song/mycode/work/test/taintdemo.php on line 14

Warning: include(): Failed opening '/tmp1' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.19/share/php@7.1/pear') in /Users/song/mycode/work/test/taintdemo.php on line 14

Fatal error: Uncaught Error: Call to undefined function mysql_query() in /Users/song/mycode/work/test/taintdemo.php:16 Stack trace: #0 {main} thrown in /Users/song/mycode/work/test/taintdemo.php on line 16

从警告信息当中可以看出,笔者的taint已经生效,给出了很多警告提示,提示参数可能受到污染,因为参数并没有经过任何过滤;

5.1.4 参数过滤测试

如果不想让taint给出警告提示,可以将demo代码中的第二行代码更改或增加一下过滤规则,参考代码如下:

$a = htmlspecialchars($_GET['a']);

再次回到浏览器当中,刷新当前页面,可以看到返回的信息已经发生了变化,返回内容如下

Welcome, 1 !!!Welcome, 1 !!!
Warning: include(/tmp1): failed to open stream: No such file or directory in /Users/song/mycode/work/test/taintdemo.php on line 15

Warning: include(): Failed opening '/tmp1' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.19/share/php@7.1/pear') in /Users/song/mycode/work/test/taintdemo.php on line 15

Fatal error: Uncaught Error: Call to undefined function mysql_query() in /Users/song/mycode/work/test/taintdemo.php:17 Stack trace: #0 {main} thrown in /Users/song/mycode/work/test/taintdemo.php on line 17

因为笔者在代码中增加了参数转义,此时再次刷新浏览器,会看到taint不再给发出警告提醒。

5.2 渗透测试系统验证

用demo系统验证taint扩展生效之后,现在笔者将用一个渗透测试系统来做一个实验,在这个系统中本身存在了很多安全问题,使用taint来找出这些问题,使用的渗透测试系统为 permeate渗透测试系统,地址如下

https://git.oschina.net/songboy/permeate

5.2.1 下载permeate

笔者通过git将其源码下载下来,参考命令如下

https://gitee.com/songboy/permeate.git

下载下来之后,同样创建一个虚拟主机,可以参考上面的nginx配置

5.2.2 导入数据库

因为这个系统会用到数据库,所以笔者下载之后需要新建数据库给permeate使用

PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)

新建完成数据库之后,笔者需要将一些数据表结构以及初始化数据导入到数据库当中,在使用git下载下来之后,在其跟目录有一个doc的文件夹,笔者打开它之后,能看到有一个sql文件,如下图所示

PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)

打开此文件并将其里面的内容复制,将复制的内容到管理数据库的Navicat Premium当中,然后执行这些SQL语句,如下图所示

PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)

5.2.3 修改配置文件

导入数据库完成之后,笔者修改数据库配置文件,让permeate能够连接次数据库,配置文件在根目录 conf/dbconfig.php,里面的配置代码如下,将其地址账户以及密码和数据库名称一一对应填写

<?php     !defined(&#39;DB_HOST&#39;) && define(&#39;DB_HOST&#39;,&#39;127.0.0.1&#39;);
    !defined(&#39;DB_USER&#39;) && define(&#39;DB_USER&#39;,&#39;root&#39;);
    !defined(&#39;DB_PASS&#39;) && define(&#39;DB_PASS&#39;,&#39;root&#39;);
    !defined(&#39;DB_NAME&#39;) && define(&#39;DB_NAME&#39;,&#39;permeate&#39;);
    !defined(&#39;DB_CHARSET&#39;) && define(&#39;DB_CHARSET&#39;,&#39;utf8&#39;);
    $sex=array(&#39;保密&#39;,&#39;男&#39;,&#39;女&#39;);
    $edu=array(&#39;保密&#39;,&#39;小学&#39;,&#39;初中&#39;,&#39;高中/中专&#39;,&#39;大专&#39;,&#39;本科&#39;,&#39;研究生&#39;,&#39;博士&#39;,&#39;博士后&#39;);
    $admins=array(&#39;普通用户&#39;,&#39;管理员&#39;)

5.2.4 验证安装结果

设置好数据库之后,笔者安装permeate便已经完成了,此时打开首页,看到的界面应该如下图所示:
PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)
如果在首页当中没有看到板块以及分区等信息,很有可能是数据库没有连接成功或者数据库没有正确导入数据所致。

5.2.5 挖掘漏洞

下面开始进行测试,笔者点击第一个板块SQL注入,并点击列表下发的下一页按钮,此时看到的页面如下图所示:
PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)
在这个板块列表页中没看到任何问题,但是实际上taint已经给笔者发出了警告提醒。

笔者可以通过查看源代码时候来看到这些问题,如下图所示,taint提示在代码文件 /Users/song/mycode/safe/permeate/core/common.php的50行,存在参数被污染的情况。

PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)

5.2.5 漏洞分析

笔者找到对应的代码位置,发现代码内容如下:

function includeAction($model, $action)
{
    //判断控制器是否存在
    $filePath = "./action/$model.php";
    if (is_readable($filePath)) {
        require_once $filePath;
        $class = new $model;
        if (is_callable(array($class, $action))) {
            $class->$action();
            return true;
        }
    }

在代码中笔者看到有一个require_once函数加载了文件,里面的参数使用了变量 $model$action ,通过最终变量来源,在代码文件/Users/song/mycode/safe/permeate/home/router.php发现这两个参数确实没有经过过滤,如下代码所示:

<?php require_once "/core/common.php";
$model = !empty($_GET[&#39;m&#39;]) ? $_GET[&#39;m&#39;] : &#39;index&#39;;
$action = !empty($_GET[&#39;a&#39;]) ? $_GET[&#39;a&#39;] : &#39;index&#39;;

includeAction("$model","$action");

最后需要提醒大家,Taint在开发环境安装即可,不要安装到生产环境当中,否则可能会把网站的安全问题直接暴露给攻击者

相关推荐:

PHP网站常见安全漏洞及相应防范措施总结,安全漏洞防范措施

新しい PHP 脆弱性マイニングのデバッグによって引き起こされるセキュリティ脆弱性 (Edusoho)

PHPShop には複数のセキュリティ脆弱性があります_PHP チュートリアル

以上がPHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。