以下の thinkphp フレームワーク チュートリアルのコラムでは、ThinkPHP フレームワークの監査 (共有) について 1 分で紹介します。困っている友人のお役に立てれば幸いです。
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/ 内のデータベース構成情報 application/database.php を変更します。 config デバッグをオンにして、.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/thinkphp/public/index.php/index/index/index
ドメイン名 Web サイト ディレクトリ 外部アクセス ディレクトリ エントリ ファイル フロント デスク コントローラー メソッド名
拡張子:
##updatexml 関数について UPDATEXML (XML_document, XPath_string, new_value ) ;
#最初のパラメータ: XML_document は文字列形式であり、XML ドキュメント オブジェクトの名前です。テキストは Doc## です。
#2 番目のパラメータ: XPath_string (Xpath 形式の文字列) Xpath 構文がわからない場合は、インターネットでチュートリアルを見つけることができます。#3 番目のパラメータ: new_value、文字列形式。条件を満たす見つかったデータを置き換えます。
作用:改变文档中符合条件的节点的值 访问payload,就可以触发漏洞了。 漏洞分析 首先,我们知道 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手册以及网上教程完成此次漏洞的审计。
相关推荐:最新的10个thinkphp视频教程
以上がThinkPHP フレームワークの監査について 1 分で学ぶ (共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。