ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP フレームワークの監査

ThinkPHP フレームワークの監査

藏色散人
藏色散人転載
2020-08-08 13:18:042686ブラウズ

以下は、ThinkPHP フレームワークの監査について紹介する thinkphp フレームワーク チュートリアル コラムです。困っている友人のお役に立てば幸いです。

ThinkPHP フレームワークの監査

ThinkPHP の概要

ThinkPHP はa これは、無料のオープン ソースで、高速かつシンプルなオブジェクト指向の軽量 PHP 開発フレームワークです。2006 年初頭に設立され、Apache2 オープン ソース契約に基づいてリリースされました。機敏な WEB アプリケーション開発と簡素化されたエンタープライズ アプリケーション開発のために生まれました。 ThinkPHP は誕生以来、シンプルで実用的な設計原則を堅持しており、優れたパフォーマンスと最小限のコードを維持しながら、使いやすさにも重点を置いています。独自の機能を多数備えており、コミュニティチームの積極的な参加により、使いやすさ、拡張性、パフォーマンスの面で継続的に最適化と改善が行われ、中国で最も有力かつ影響力のあるWEBアプリケーション開発フレームワークに成長しました。多くの典型的なケースにより、商用およびポータル レベルの開発に安定して使用できることが保証されます。

#脆弱性の概要

##ThinkPHP 5.0.x フレームワークは、パラメータ化されたクエリ方式を使用して動作しますが、しかし、挿入メソッドと更新メソッドでは、渡されるパラメータは制御可能であり、厳密にフィルタリングされていないため、最終的にこの SQL インジェクションの脆弱性の発生につながりました。

ThinkPHP フレームワーク 5.0.x SQL インジェクションの脆弱性を分析に使用する

thinkphp公式 Web サイトのバージョン 5.0.15 のダウンロード: http://www.thinkphp.cn/down/1125.html 。データベースをセットアップします。データベースは tp、テーブル名は user、2 つのフィールド id と username があります。

#application/config.php 内のデータベース構成情報 application/database.php を変更します。デバッグとトレースをオンにします。

#application/index/controller/Index.php の Index クラスにメソッドを追加します。

public  function testsql()
    {
        $username = input('get.username/a');
        db('user')->where(['id'=> 1])->insert(['username'=>$username]);
    }

今回のペイロードは次のとおりです:

#

http://127.0.0.1/thinkphp5.0.15/public/index.php/index/index/testsql?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1
説明は次のとおりです。

http://127.0.0.1/thinkphp/  public/        index.php/   index/   index/   index
       
域名       网站目录    对外访问目录    入口文件       前台     控制器    方法名

拡張子:

#Updatexml 関数について UPDATEXML (XML_document, XPath_string, new_value) );

#最初のパラメータ: XML_document は文字列形式であり、XML ドキュメント オブジェクトの名前です。テキストは Doc# です。

##2 番目のパラメータ: XPath_string (Xpath 形式の文字列) Xpath 構文がわからない場合は、インターネットでチュートリアルを見つけることができます。

#3 番目のパラメータ: new_value、文字列形式。条件を満たす見つかったデータを置き換えます。

関数: ドキュメント内の修飾ノードの値を変更します。

ペイロードにアクセスして脆弱性をトリガーします。

#脆弱性分析

首先,我们知道 insert 方法存在漏洞,那就查看 insert 方法的具体实现。

通过input获取到参数后,username变量情况如下:

跟入insert,thinkphp/library/think/db/Query.php

然后执行insert语句

$sql = $this->builder->insert($data, $options, $replace);

跟入 thinkphp/library/think/db/Builder.php

跟入parseData至 thinkphp/library/think/db/Builder.php

可以看出$val是数组,且根据$val[0]值为inc,会通过switch语句进入到’inc’:

此处的parseKey,即thinkphp/library/think/db/builder/Mysql.php

此处并未对传入的$key进行更多的过滤与检查,将其与前面经过parseKey的结果进行拼接后返回给result

至此注入成功。

漏洞修复

 https://github.com/top-think/framework/commit/363fd4d90312f2cfa427535b7ea01a097ca8db1b

在进行dec和inc操作之前对$val[1]的值进行了再次确认。

总结

第一次审计Thinkphp框架   ,结合Thinkphp5.0手册以及网上教程完成此次漏洞的审计。

以上がThinkPHP フレームワークの監査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。