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

この記事の内容は、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 までご連絡ください。
PHPセッションに保存されているデータをどのように変更しますか?PHPセッションに保存されているデータをどのように変更しますか?Apr 27, 2025 am 12:23 AM

tomodifydatainaphpsession、starthessession withsession_start()、$ _sessiontoset、modify、orremovevariables.1)startthessession.2)

PHPセッションに配列を保存する例を示します。PHPセッションに配列を保存する例を示します。Apr 27, 2025 am 12:20 AM

配列はPHPセッションに保存できます。 1。セッションを開始し、session_start()を使用します。 2。配列を作成し、$ _Sessionで保存します。 3. $ _Sessionを介して配列を取得します。 4.セッションデータを最適化してパフォーマンスを向上させます。

Garbage CollectionはPHPセッションでどのように機能しますか?Garbage CollectionはPHPセッションでどのように機能しますか?Apr 27, 2025 am 12:19 AM

PHPセッションガベージコレクションは、有効期限が切れたセッションデータをクリーンアップするために確率メカニズムを通じてトリガーされます。 1)構成ファイルにトリガー確率とセッションのライフサイクルを設定します。 2)Cronタスクを使用して、高負荷アプリケーションを最適化できます。 3)データの損失を避けるために、ごみ収集の頻度とパフォーマンスのバランスを取る必要があります。

どのようにしてPHPでセッションアクティビティをトレースできますか?どのようにしてPHPでセッションアクティビティをトレースできますか?Apr 27, 2025 am 12:10 AM

PHPでのユーザーセッションアクティビティの追跡は、セッション管理を通じて実装されます。 1)SESSION_START()を使用してセッションを開始します。 2)$ _Sessionアレイを介してデータを保存およびアクセスします。 3)セッションを終了するには、session_destroy()を呼び出します。セッショントラッキングは、ユーザーの動作分析、セキュリティ監視、パフォーマンスの最適化に使用されます。

データベースを使用してPHPセッションデータを保存するにはどうすればよいですか?データベースを使用してPHPセッションデータを保存するにはどうすればよいですか?Apr 27, 2025 am 12:02 AM

データベースを使用してPHPセッションデータを保存すると、パフォーマンスとスケーラビリティが向上します。 1)MySQLを構成してセッションデータを保存します:PHP.iniまたはPHPコードでセッションプロセッサを設定します。 2)カスタムセッションプロセッサを実装します:データベースと対話するために、開いて、閉じ、読み取り、書き込み、その他の機能を定義します。 3)最適化とベストプラクティス:インデックス、キャッシュ、データ圧縮、分散ストレージを使用して、パフォーマンスを向上させます。

PHPセッションの概念を簡単に説明してください。PHPセッションの概念を簡単に説明してください。Apr 26, 2025 am 12:09 AM

phpssionsStrackuserdataacrossmultiplepagerequestsusingauniqueidstoredinacookie.here'showtomanageetheemefectively:1)Startassession withsession_start()andstoredatain $ _ session.2)RegeneratesseSsessidafterloginwithsession_id(the topreventes_id)

PHPセッションに保存されているすべての値をどのようにループしますか?PHPセッションに保存されているすべての値をどのようにループしますか?Apr 26, 2025 am 12:06 AM

PHPでは、次の手順を通じてセッションデータを繰り返すことができます。1。session_start()を使用してセッションを開始します。 2。$ _Sessionアレイのすべてのキー価値ペアを介してforeachループを反復します。 3.複雑なデータ構造を処理する場合、is_array()またはis_object()関数を使用し、print_r()を使用して詳細情報を出力します。 4.トラバーサルを最適化する場合、ページングを使用して、一度に大量のデータの処理を避けることができます。これにより、実際のプロジェクトでPHPセッションデータをより効率的に管理および使用するのに役立ちます。

ユーザー認証にセッションを使用する方法を説明します。ユーザー認証にセッションを使用する方法を説明します。Apr 26, 2025 am 12:04 AM

このセッションは、サーバー側の状態管理メカニズムを介してユーザー認証を実現します。 1)セッションの作成と一意のIDの生成、2)IDはCookieを介して渡されます。3)サーバーストアとIDを介してセッションデータにアクセスします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、