SQLインジェクションクエリは、以前使用していた別のキャラクタセットを使用して変装することがあります。しかし、これらの偽装モードでも、クエリ文字列には、unionやcast、varcharなどのよく知られた単語が含まれます。DisguiseでのSQLインジェクション
私の質問はこれです。
これらの言葉も偽装することは可能ですか?言い換えれば、「組合」や「キャスト」も偽装できますか?
SQLインジェクションクエリは、以前使用していた別のキャラクタセットを使用して変装することがあります。しかし、これらの偽装モードでも、クエリ文字列には、unionやcast、varcharなどのよく知られた単語が含まれます。DisguiseでのSQLインジェクション
私の質問はこれです。
これらの言葉も偽装することは可能ですか?言い換えれば、「組合」や「キャスト」も偽装できますか?
SQL標準では、キーワードがZまたはを通じてラテン文字のAを使用する必要がありますがz、0〜9の数字、および特殊な特殊文字が含まれます。 「SQL-99 Complete、Really」のSQL Language Elementsを参照してください。
つまり、個々の実装(Oracle、Microsoft SQL Server、MySQLなど)は標準に完全に準拠していない可能性があります。最良の方法は、使用するRDBMSのブランドとバージョンをテストすることです。あなたのコメントを再
:MySQLは/* */
コメントキーワードに埋め込むことができますが、データベースの他のブランドでは、インラインコメントは、多かれ少なかれ、空白のようなものです。
だからSEL/* */ECT
はSEL ECT
と似ていますが、もちろん有効なキーワードではないので失敗します。
私はコメント区切り文字もアスキー範囲の文字でなければならないと確信していますが、これは確かにテストしていません。実装によっては、RDBMSのブランドによって異なる可能性があります。答えはそれを考慮する必要があります(ヒント:使用しているデータベースのブランドを教えていない)。
「変装」の別のタイプはURLエンコードである可能性があります。つまり、個々の文字に対してHTMLエンティティまたはHTML 16進エンコーディングを使用します。 SQLはこれらを認識しませんが、デコードする前に生の入力をフィルタリングすると、何かがあなたの小切手を通過する可能性があります。
最終的には、ベストプラクティスのための私の方針は以下のとおりです。
は、ユーザー入力が(これも、あるいはデータベース自体からファイルから読み込んだ任意の信頼できないコンテンツに適用される)コードとして実行させないでください。 SQL文字列に直接コンテンツを補間するのではなく、パラメータ化または少なくとも信頼できるエスケープ関数を使用します。
ユーザー入力に基づいてSQLの他の部分を動的にしたい場合、パラメータ化は役立ちません。たとえば、ユーザーが自分の結果をソートする方法を選択させる:
SELECT * FROM MyTable ORDER BY $ColumnOfUsersChoice $AscVsDesc
すると、その場合、私の練習は、ホワイトリストを使用することですので、我々は代わりに、有効な選択肢の固定セットに対してユーザの入力を比較します正規表現とパターンマッチングを使用しようとしています。ホワイトリストの利点は、悪意のあるユーザーが何か賢い試みをした場合、その入力は無視されることです。
ホワイトリストの例については、私のプレゼンテーションSQL Injection Myths and Fallaciesまたは私の書籍SQL Antipatterns: Avoiding the Pitfalls of Database Programmingを参照してください。
ここでは、SQLインジェクション神話とフォラシーズのトークを紹介している私のビデオレコーディングです:http://marakana.com/forums/web_dev/general/210.htmlしかし、ビデオが作成されて以来、スライドを改善していますので、いくつかの違いがあります。
それを持って、それにビル。私は答えを受け入れることに注意を払う...私は答えを受け入れる必要があることを知らなかった。今私が知っている、私はそれをスキップすることはありません。しかし、このスレッドを閉じなければならないことを知っている人もいましたが、私の理解が正しいことを確認するために、私は自分のコメントとこれから学んだことを追加します。 –
あなたの答えはNOです。例として、CASTという言葉を実際に使わずにキャストすることはできません。 しかし、これを知ることは助けになりません。私は/ * * /(SQLコメント)を使用してCASTまたはSELECTを書く方法があると信じて、CASTという言葉をC/**/ASTのように変装します。確認してください。ただ好奇心が強い...私はいくつかの人々がそれをするのを見た。当然、最初に/ *と* /をorgから取り出すことができます。それがCASTという単語を含んでいるかどうかを確認してください。しかし、/ *と* /が間違って来るかどうかは次の質問になります。 –
ここから、ある種の言葉を求めていることは、何らかのブラックリストに載っていることを物事を見る悪い方法だと理解しています。GUFFAがそれを正しく疑っていたからです。彼は質問の目的を見ました。そしてMIKE SAMUELの非常に興味深いスニペットは、あなたが大混乱を引き起こすためにA-Zを必要としないことも証明しています。うわー!優れたスニペット、アイオープナー...私にこれを釘付けにしてくれてありがとう。あなたはすべてACCEPTに値します。しかし、私は1つしか選ぶことができないと思います...私は私の質問に直接答えを出すでしょう。あなたもそうです。しかし、私はマイクの返事から多くの利益を得ました... –
SQLインジェクションにキーワードを含める必要はありません。例えば
、DELETE FROM Table WHERE ID=<<<Injected Payload>>>
何の英数字が含まれていない注射したペイロードを意図したよりも行います。
''||''=''
間違った方向から問題に近づいています。 SQLインジェクションから守る唯一の信頼できる方法は、データを解析したり、正しくエスケープしたりして、コードとして実行されないようにすることです。
パラメータ化されたクエリを使用すると、エスケープ処理に役立ちます。正しく処理するのは難しいためです。
入力のキーワードを検索することは、完全に保護されていないひどく書かれたコードを保護するための第二の対策としてのみ行われます。
パラメータ化されたクエリを使用するだけであれば、この問題は完全に解決されます。 –
@Andrew:あまりにも真実ですが、ハニーポットを設定する際には知っておくと便利かもしれません。 – sarnold
@sarnold:もしあなたがハッカーを餌にしようとしているのであれば、恐らくあなたが何をやっているかについての手がかりがあるでしょう。 – NotMe