سؤال

خلفية

لقد تم التعاقد معي لتحليل موفر بيانات حالي وأعلم أن الكود التالي به خطأ؛ولكن لكي أشير إلى مدى سوء الأمر، أحتاج إلى إثبات أنه عرضة لحقن SQL.

سؤال

ما هي المعلمة "المفتاحية" التي يمكن أن تكسر ملف PrepareString وظيفة واسمحوا لي بتنفيذ أ DROP إفادة؟

مقتطف الكود

Public Shared Function GetRecord(ByVal Key As String) As Record
    Dim Sql As New StringBuilder()

    With Sql
        .Append("SELECT * FROM TableName")
        If String.IsNullOrEmpty(Agency) Then
            .Append(" ORDER BY DateAdded")
        Else
            .Append(" WHERE Key = '")
            .Append(PrepareString(Key))
            .Append("'")
        End If
    End With

    Return ExecuteQuery(Sql.ToString())
End Function

Public Shared Function PrepareString(ByVal Value As String) As String
    Return Value.Replace("''", "'") _
                .Replace("'", "''") _
                .Replace("`", "''") _
                .Replace("´", "''") _
                .Replace("--", "")
End Function
هل كانت مفيدة؟

المحلول

في الإجابة على السؤال المباشر: هل هذا الرمز منع حقن SQL: لا

وهنا الدليل - دفع هذه السلسلة من خلال طريقة PrepareString:

Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)

Console.WriteLine(input)
Console.WriteLine(output)

ولقد عدلت طريقة GetRecord قمت بنشرها بالعودة سلسلة SQL استعداد تام بدلا من الحصول على سجل من قاعدة البيانات:

Console.WriteLine(GetRecord(output))

وهذا هو الإخراج

Input  = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'

وإضافة 1 خط اضافي من التعليمات البرمجية:

My.Computer.Clipboard.SetText(input)

وكنت قد حصلت على سلسلة تحتاج نسخ الحق في الحافظة الخاصة بك للصق في حقل الإدخال على موقع لاستكمال حقن SQL الخاص بك:

'; Drop Table TableName; - -

[وإذ يلاحظ أن أحرف التحكم قد حذفت من إخراج المنصب من قبل ستاكوفيرفلوو، لذلك عليك أن تحذو حذو رمز لإنشاء الإخراج]

وبعد تشغيل طريقة PrepareString، سيكون لها نفس الإخراج المحدد - ومركز حقوق الانسان (8) رمز ASCII هو مسافة للخلف الذي سيزيل خارج "" أنك إلحاق لإزالة الألغام التي ستغلق سلسلة الخاص بك ثم أنا حرة لإضافة كل ما أريد في النهاية. PrepareString الخاص بك لا أرى - لأنني فعلا باستخدام - - مع حرف مسافة للخلف لإزالة المسافة

وشفرة SQL الناتج الذي كنت بناء وثم تنفيذ بياني إسقاط جدول دون عوائق وعلى الفور تجاهل بقية الاستعلام الخاص بك.

والشيء الممتع في ذلك هو أنه يمكنك استخدام أحرف غير القابلة للطباعة لتجاوز أساسا أي حرف الاختيار يمكنك ابتكار. لذلك فمن الأكثر أمانا لاستخدام استعلامات بمعلمات (وهي ليست ما طلبتم، ولكن هو السبيل الأفضل لتجنب ذلك).

نصائح أخرى

لإجابة السؤال مشكوك الخاص بك، بغض انها لن تنجح.

و.Replace("``", "''") ستمنع الاستفسارات الشرعية مع ' `'

و.Replace("´", "''") ستمنع الاستفسارات الشرعية مع '' '

و.Replace("--", "") من شأنه أن يمنع الاستفسارات الشرعية مع '-' فيها

سوف

و.Replace("''", "'") تعديل الاستفسارات الشرعية مع '' '' بشكل غير صحيح في نفوسهم

ووهلم جرا.

وعلاوة على ذلك، فإن مجموعة كاملة من أحرف الهروب يمكن أن تختلف من RDBMS واحد إلى آخر. استعلامات بمعلمات FTW.

وأعتقد أنه من unhackable إذا كنت مجرد استبدال 'مع' '. لقد سمعت أنه من الممكن لتغيير حرف الهروب الاقتباس، والتي يحتمل أن كسر هذا، ولكن لست متأكدا. أعتقد أنك آمن على الرغم من.

واعتقد انها آمنة (على الأقل في خادم SQL)، وأنا أيضا أعتقد أن الشيء الوحيد الذي تحتاجه فعلا القيام به هو s = s.Replace("'", "''"). بالطبع يجب عليك استخدام استعلامات بمعلمات، ولكن كنت تعرف ذلك.

هذا مقالة MSDN يغطي معظم الأشياء التي تحتاج إلى البحث عنها (أخشى أن أقول كل شيء عندما يتعلق الأمر بإدخال SQL).

لكنني سأردد مشاعر الجميع بشأن المعلمات المعلمات.

أما بالنسبة لمثالك، فهناك بعض الأخطاء [تحرير:تم تحديث هذه]:

  • ألن تسمح السلسلة "1 OR 1=1" للمستخدم باستعادة كل شيء

  • أو ما هو أسوأ "1؛إسقاط الجدول sometablename"

وفقًا للمقالة التي تريد التحقق منها:

;- محدد الاستعلام.

'- محدد سلسلة بيانات الأحرف.

-- - محدد التعليق.

/* ... / - محددات التعليق.نص بين / و */ لا يتم تقييمه بواسطة الخادم.

XP_ - المستخدمة في بداية اسم الإجراءات المخزنة التي تم تمديدها ، مثل XP_CMDSHELL.

وأنت تحاول قائمة الشخصيات السوداء لتنفيذ نسختك الخاصة من SQL الهروب. أود أن أقترح مراجعة هذا URL - SQL هروب ليست بالضرورة أسوأ خيار (أي بسرعة تحديد التطبيقات الحالية) ولكن لا بد من الحق في القيام به لتجنب نقاط الضعف.

وهذا URL روابط ل آخر الصفحة للهروب في SQL Server حيث يعطي المؤلف الاقتراحات التي تساعد على تجنب نقاط الضعف دون الحد من وظائف.

وإذا كان يساعد، والمواد تشير الهروب الأقواس جدا (وأدعو لهم الأقواس المربعة - ولكن [])

.

إذا حاولت استخدام التعليمات البرمجية بعض واحد يمكن أن تمر مفتاح (، حدد * من الجدول؛ والحصول على قائمة من أي وقت مضى الجدول يريدون

في التعليمات البرمجية الخاصة بك لا التحقق من منقوطة التي تمكنك من إنهاء عبارة SQL-ر والبدء في بعضها البعض.

واود ان اذهب مع استعلام معلمات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top