このエスケープ機能が失敗する場合がいくつかあります。最も明白なのは、一重引用符が使用されていない場合です:
string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index
この場合、二重引用符、バックティックを使用して「ブレイクアウト」できます。最後のケースでは、「抜け出す」ものは何もないので、1 union select password from users--
と書くだけです。 または攻撃者が望むSQLペイロード。
このエスケープ関数が失敗する次の条件は、文字列がエスケープされた後にサブ文字列が取得された場合です(そしてはい 私はこのような脆弱性を実際に見つけました):
string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";
この場合、abcdefgji'
のユーザー名 abcdefgji''
に変換されます エスケープ関数を使用して、abcdefgji'
に戻します。 サブストリングを取ることによって。これは、パスワード値を任意のSQLステートメント(この場合はor 1=1--
)に設定することで悪用できます。 sqlとして解釈され、ユーザー名はabcdefgji'' and password=
として解釈されます。 。結果のクエリは次のとおりです。
select * from users where name='abcdefgji'' and password=' or 1=1--
すでに述べたT-SQLおよびその他の高度なSQLインジェクション手法。 SQL Serverアプリケーションでの高度なSQLインジェクションは優れた論文であり、まだ読んでいない場合は読む必要があります。
最後の問題はUnicode攻撃です。このクラスの脆弱性は、エスケープ関数がマルチバイトエンコーディングを認識していないために発生します。これは、攻撃者がエスケープ文字を「消費」するために使用する可能性があります。文字列の前に「N」を付けると、文字列の後半にあるマルチバイト文字の値に影響を与えないため、役に立ちません。ただし、データベースはGBKユニコード文字列を受け入れるように構成する必要があるため、このタイプの攻撃は非常にまれです(MS-SQLがこれを実行できるかどうかはわかりません)。
二次コードインジェクションは引き続き可能です。この攻撃パターンは、攻撃者が制御するデータソースを信頼することによって作成されます。エスケープは、制御文字を文字リテラルとして表すために使用されます。開発者がselect
から取得した値をエスケープするのを忘れた場合 次に、この値を別のクエリで使用してから、 bam 攻撃者は、文字のリテラルの一重引用符を自由に使用できます。
すべてをテストし、何も信用しないでください。