ホームページ > 記事 > PHPフレームワーク > 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 サイトの他の関連記事を参照してください。