この記事の内容は、PHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性をどのように見つけることができるかについてです。一定の参考価値があります。困っている友人は参照できます。お役に立てれば幸いです。
1. 背景
著者はコンピュータに触れて以来、ネットワーク セキュリティに興味を持っていました。 PHPをやっています 開発後はWEBのセキュリティには細心の注意を払っていましたが、2016年に偶然Taint拡張機能を発見し、体験してみると非常に便利であることが分かりましたが、当時関連情報を確認したところ、 , この拡張機能に注目している人があまりいないことがわかりました。最近、コンピューターを変更したため、この拡張機能を再度インストールした後、この拡張機能を使用している人がまだ比較的少ないことがわかりました。そこで、インストール プロセスを記録し、テストしました結果を表示することで、その後の利用が容易になり、より多くの開発者が汚染を理解できるようになります。
2. 操作の概要
ソース コードのダウンロードとコンパイル
拡張構成とインストール
機能検査とテスト
##3. ソース コードのダウンロードとコンパイル
Taint 拡張機能 PHP 自体は、Linux または Mac システムでは作者が提供しません。ソース コードをダウンロードして自分でコンパイルし、インストールする必要があります。3.1 ソースコードのダウンロード
作者の開発環境は Mac システムなので、PHP の pecl 拡張 Web サイトにアクセスしてソース コードをダウンロードする必要があります。そのアドレスは次のとおりです。https://pecl.php.net/package/taint拡張機能 URL の最後には、以下に示すようにダウンロード アドレスの行が表示されます。
作者 適切なバージョンを選択する必要があります作者の開発環境はPHP7.1なので最新版を選択しました 対応するダウンロードアドレスは以下の通りです:
https://pecl.php.net/get/taint-2.0.4.tgzwgetを使用してソースコードをダウンロードします 参考コマンドは以下の通りです:
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: 320160303Makefileを生成し、コンパイルの次のステップの準備をします
./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['a']); $file_name = '/tmp' . $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使用
新建完成数据库之后,笔者需要将一些数据表结构以及初始化数据导入到数据库当中,在使用git下载下来之后,在其跟目录有一个doc的文件夹,笔者打开它之后,能看到有一个sql文件,如下图所示
打开此文件并将其里面的内容复制,将复制的内容到管理数据库的Navicat Premium当中,然后执行这些SQL语句,如下图所示
导入数据库完成之后,笔者修改数据库配置文件,让permeate能够连接次数据库,配置文件在根目录 conf/dbconfig.php
,里面的配置代码如下,将其地址账户以及密码和数据库名称一一对应填写
<?php !defined('DB_HOST') && define('DB_HOST','127.0.0.1'); !defined('DB_USER') && define('DB_USER','root'); !defined('DB_PASS') && define('DB_PASS','root'); !defined('DB_NAME') && define('DB_NAME','permeate'); !defined('DB_CHARSET') && define('DB_CHARSET','utf8'); $sex=array('保密','男','女'); $edu=array('保密','小学','初中','高中/中专','大专','本科','研究生','博士','博士后'); $admins=array('普通用户','管理员')
设置好数据库之后,笔者安装permeate便已经完成了,此时打开首页,看到的界面应该如下图所示:
如果在首页当中没有看到板块以及分区等信息,很有可能是数据库没有连接成功或者数据库没有正确导入数据所致。
下面开始进行测试,笔者点击第一个板块SQL注入
,并点击列表下发的下一页
按钮,此时看到的页面如下图所示:
在这个板块列表页中没看到任何问题,但是实际上taint已经给笔者发出了警告提醒。
笔者可以通过查看源代码时候来看到这些问题,如下图所示,taint提示在代码文件 /Users/song/mycode/safe/permeate/core/common.php
的50行,存在参数被污染的情况。
笔者找到对应的代码位置,发现代码内容如下:
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['m']) ? $_GET['m'] : 'index'; $action = !empty($_GET['a']) ? $_GET['a'] : 'index'; includeAction("$model","$action");
最后需要提醒大家,Taint在开发环境安装即可,不要安装到生产环境当中,否则可能会把网站的安全问题直接暴露给攻击者
相关推荐:
新しい PHP 脆弱性マイニングのデバッグによって引き起こされるセキュリティ脆弱性 (Edusoho)
PHPShop には複数のセキュリティ脆弱性があります_PHP チュートリアル
以上がPHP 拡張機能 Taint が Web サイト内の潜在的なセキュリティ脆弱性を検出する方法 (必読)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。