0

クエリを使用して SQL インジェクションのデモを試みていUNIONますが、結果が得られません。

これは C# コードで、データベースは SQL Server 2008 R2 です。

        SqlConnection conn = new SqlConnection(cString);
        conn.Open();

        string sql = "select * from Users where UserName='" + userName 
                   + "' and Password='" + password + "'";
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = sql;

        SqlDataReader reader = cmd.ExecuteReader();

        StringBuilder sb = new StringBuilder(1024);

        while (reader.Read())
        {
            for (int i = 0; i < reader.FieldCount; i++)
            {
                sb.Append(" " + reader.GetName(i));
                sb.Append(": ");
                sb.Append(reader[i]);
            }
            sb.Append("<br />");
        }
        dataLabel.Text = sb.ToString();

ユーザー名とパスワードのテキスト ボックスがあり、入力はこのメソッドに渡されます。
私は次のことを試しましたが、結果はありませんでした:

'UNION SELECT * FROM products --

UsersテーブルとテーブルのProducts列の型が同じです ( int, nvarchar, nvarchar)。

誰か助けてくれませんか?私は何が欠けていますか?

4

2 に答える 2

2

' UNION SELECT * FROM Productsパラメータを渡す場合、クエリは次のようになります(またはその他の有効または無効なユーザー名をにpassword入れたと仮定します)。foousername

SELECT * from Users 
  where UserName='foo' and Password='' 
UNION 
SELECT * FROM Products --'

そのwhere句に一致する行がない限りUsers(悪意のあるユーザーが推測することしかできない有効なユーザー名を使用している場合でも、確実に一致しない空白のパスワードが残っている)、なぜUsersテーブルから戻る行?

そして、この値をユーザー名に渡すと、次のようになります。

SELECT * from Users 
  where UserName='' 
UNION 
SELECT * FROM Products -- and Password='foo'

繰り返しますが、ユーザー名が空白のユーザー名を持っていない限り、なぜ行が必要になるのでしょうか。

とにかく、SQLインジェクションを説明する素晴らしい資料がたくさんあります。なぜあなたは車輪の再発明をしたいのですか?パラメータ化されたクエリを強制し、その理由の詳細について既存の資料を読んでもらうのはなぜですか?ここにいくつかの素晴らしいリソースがあります:

http://en.wikipedia.org/wiki/SQL_injection

http://www.unixwiz.net/techtips/sql-injection.html

http://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspx

http://weblogs.sqlteam.com/mladenp/archive/2011/02/16/sql-server-sql-injection-from-start-to-end.aspx

于 2013-01-13T02:04:39.587 に答える
2

私はアーロンに同意します:車輪を再発明するのではなく、そこにあるリソースを使用してください. ただし、自分のアプリケーションの脆弱性を示すことが非常に強力になることも理解しています。したがって、クエリを機能させるには、次を UserName と Password に渡す必要があります。

' OR 1=1;--

これは、クエリ内の Password と UserName の順序に関係なく機能します。すべてのユーザーのレコードが返されます。そこに製品テーブルを追加する必要はありません。

于 2013-01-13T02:29:08.587 に答える