sql >> データベース >  >> RDS >> Sqlserver

一重引用符を回避する衛生状態は、SQL ServerのSQLインジェクションによってどのように打ち負かされますか?

    このエスケープ機能が失敗する場合がいくつかあります。最も明白なのは、一重引用符が使用されていない場合です:

    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 攻撃者は、文字のリテラルの一重引用符を自由に使用できます。

    すべてをテストし、何も信用しないでください。



    1. カラム側の暗黙的な変換はどれくらいの費用がかかりますか?

    2. SQL Server ODBCドライバーをアップグレードしましたが、パフォーマンスに悪影響がありました。私に何ができる?

    3. MariaDB JSON_SEARCH()の説明

    4. MySQLのselectステートメントとCASEまたはIFELSEIF?結果を得る方法がわからない