أفضل تعبير عادي للقبض على هجوم XSS (البرمجة النصية عبر المواقع) (في Java)؟

StackOverflow https://stackoverflow.com/questions/24723

  •  09-06-2019
  •  | 
  •  

سؤال

نشر جيف بالفعل عن هذا في تعقيم HTML.لكن مثاله موجود في C# وأنا مهتم أكثر بإصدار Java.هل لدى أي شخص نسخة أفضل لجافا؟هل مثاله جيد بما يكفي للتحويل مباشرة من C# إلى Java؟

[تحديث] لقد وضعت مكافأة على هذا السؤال لأن SO لم يكن شائعًا عندما طرحت السؤال كما هو اليوم (*).أما أي شيء متعلق بالأمن، فكلما تطلع الناس عليه، كان أفضل!

(*) في الواقع، أعتقد أنه لا يزال في مرحلة تجريبية مغلقة

هل كانت مفيدة؟

المحلول

لا تفعل هذا مع التعبيرات العادية.تذكر أنك لا تحمي فقط من HTML الصالح؛أنت تحمي من DOM الذي تنشئه متصفحات الويب.يمكن خداع المتصفحات لإنتاج DOM صالح من HTML غير صالح بسهولة تامة.

على سبيل المثال، راجع هذه القائمة من هجمات XSS المبهمة.هل أنت مستعد لتخصيص تعبير عادي لمنع هذا الهجوم الواقعي؟ ياهو وهوتميل على IE6/7/8؟

<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;">
</BODY></HTML>

ماذا عن هذا الهجوم الذي يعمل على IE6؟

<TABLE BACKGROUND="javascript:alert('XSS')">

ماذا عن الهجمات غير المدرجة في هذا الموقع؟المشكلة في النهج الذي يتبعه جيف هي أنه ليس قائمة بيضاء، كما يزعم.كشخص على تلك الصفحة يلاحظ ببراعة:

المشكلة في ذلك ، هي أن html يجب أن تكون نظيفة.هناك حالات حيث يمكنك تمرير HTML المخترق ، وهو كذلك لن يطابقها ، وفي هذه الحالة سوف إرجاع سلسلة HTML المخترقة كما هي لن يتطابق مع أي شيء لاستبداله.هذا ليست قائمة بيضاء بشكل صارم.

أود أن أقترح أداة مصممة لهذا الغرض مثل أنتيسامي.إنه يعمل عن طريق تحليل HTML فعليًا، ثم اجتياز DOM وإزالة أي شيء غير موجود في ملف DOM شكلي القائمة البيضاء.يتمثل الاختلاف الرئيسي في القدرة على التعامل بأمان مع HTML المشوه.

أفضل ما في الأمر هو أنه في الواقع يقوم باختبارات الوحدة لجميع هجمات XSS على الموقع أعلاه.بالإضافة إلى ذلك، ما الذي يمكن أن يكون أسهل من استدعاء واجهة برمجة التطبيقات (API) هذا:

public String toSafeHtml(String html) throws ScanException, PolicyException {

    Policy policy = Policy.getInstance(POLICY_FILE);
    AntiSamy antiSamy = new AntiSamy();
    CleanResults cleanResults = antiSamy.scan(html, policy);
    return cleanResults.getCleanHTML().trim();
}

نصائح أخرى

لست مقتنعًا بأن استخدام التعبير العادي هو أفضل طريقة للعثور على جميع الأكواد المشبوهة.من السهل جدًا خداع التعبيرات العادية خاصة عند التعامل مع HTML المعطل.على سبيل المثال، سيفشل التعبير العادي المدرج في رابط Sanitize HTML في إزالة جميع العناصر "a" التي لها سمة بين اسم العنصر والسمة "href":

< a alt="xss حقن" href="http://www.malicous.com/bad.php" >

هناك طريقة أكثر فعالية لإزالة التعليمات البرمجية الضارة وهي الاعتماد على محلل XML الذي يمكنه التعامل مع جميع أنواع مستندات HTML (Tidy وTagSoup وما إلى ذلك) وتحديد العناصر المراد إزالتها باستخدام تعبير XPath.بمجرد تحليل مستند HTML إلى مستند DOM، يمكن العثور على العناصر المراد إلغاؤها بسهولة وأمان.من السهل القيام بذلك باستخدام XSLT.

لقد استخرجت من NoScript أفضل ملحق Anti-XSS، وهنا Regex الخاص به:العمل لا تشوبه شائبة:

<[^\w<>]*(?:[^<>"'\s]*:)?[^\w<>]*(?:\W*s\W*c\W*r\W*i\W*p\W*t|\W*f\W*o\W*r\W*m|\W*s\W*t\W*y\W*l\W*e|\W*s\W*v\W*g|\W*m\W*a\W*r\W*q\W*u\W*e\W*e|(?:\W*l\W*i\W*n\W*k|\W*o\W*b\W*j\W*e\W*c\W*t|\W*e\W*m\W*b\W*e\W*d|\W*a\W*p\W*p\W*l\W*e\W*t|\W*p\W*a\W*r\W*a\W*m|\W*i?\W*f\W*r\W*a\W*m\W*e|\W*b\W*a\W*s\W*e|\W*b\W*o\W*d\W*y|\W*m\W*e\W*t\W*a|\W*i\W*m\W*a?\W*g\W*e?|\W*v\W*i\W*d\W*e\W*o|\W*a\W*u\W*d\W*i\W*o|\W*b\W*i\W*n\W*d\W*i\W*n\W*g\W*s|\W*s\W*e\W*t|\W*i\W*s\W*i\W*n\W*d\W*e\W*x|\W*a\W*n\W*i\W*m\W*a\W*t\W*e)[^>\w])|(?:<\w[\s\S]*[\s\0\/]|['"])(?:formaction|style|background|src|lowsrc|ping|on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)?|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|m(?:o(?:z(?:pointerlock(?:change|error)|(?:orientation|time)change|fullscreen(?:change|error)|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|u(?:ccess|spend|bmit)|peech(?:start|end)|ound(?:start|end)|croll|how)|b(?:e(?:for(?:e(?:(?:scriptexecu|activa)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|deactivate)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ime(?:update|out)|ransitionend|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)?|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom))[\s\0]*=

امتحان: http://regex101.com/r/rV7zK8

أعتقد أنه يحظر 99% من XSS لأنه جزء من NoScript، وهو ملحق يتم تحديثه بانتظام

^(\s|\w|\d|<br>)*?$ 

سيؤدي هذا إلى التحقق من صحة الأحرف والأرقام والمسافات البيضاء وأيضًا <br> بطاقة شعار.إذا كنت تريد المزيد من المخاطرة يمكنك إضافة المزيد من العلامات مثل

^(\s|\w|\d|<br>|<ul>|<\ul>)*?$

أكبر مشكلة في استخدام كود jeffs هي @ الذي لا يتوفر حاليًا.

من المحتمل أن آخذ التعبير العادي "الخام" من كود jeffs إذا كنت في حاجة إليه وألصقه فيه

http://www.cis.upenn.edu/~matuszek/general/RegexTester/regex-tester.html

وشاهد الأشياء التي تحتاج إلى الهروب يتم الهروب منها ثم استخدمها.


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

(ربما تكون هذه نصيحة جيدة جدًا لأي نسخ/لصق)

[\s\w\.]*.إذا لم يكن متطابقًا، فلديك XSS.ربما.لاحظ أن هذا التعبير يسمح فقط بالأحرف والأرقام والنقاط.إنه يتجنب كل الرموز، حتى المفيدة منها، خوفًا من XSS.بمجرد السماح &، لديك مخاوف.ومجرد استبدال جميع مثيلات & with &amp; لا يكفي.معقدة للغاية بحيث لا يمكن الثقة بها :P.من الواضح أن هذا لن يسمح بالكثير من النصوص الشرعية (يمكنك فقط استبدال كافة الأحرف غير المتطابقة بـ !أو شيء من هذا)، ولكن أعتقد أنه سيقتل XSS.

من المحتمل أن تكون فكرة تحليلها كـ html وإنشاء html جديد أفضل.

موضوع قديم ولكن ربما يكون مفيدًا للمستخدمين الآخرين.توجد أداة طبقة أمان تمت صيانتها لـ php: https://github.com/PHPIDS/ يعتمد على مجموعة من regex التي يمكنك العثور عليها هنا:

https://github.com/PHPIDS/PHPIDS/blob/master/lib/IDS/default_filter.xml

يوضح هذا السؤال بشكل مثالي تطبيقًا رائعًا لدراسة نظرية الحساب.نظرية الحساب هو مجال يركز على إنتاج تمثيلات رياضية لأجهزة الكمبيوتر.

بعض الأبحاث الأكثر عمقًا في نظرية الحساب هي البراهين التي توضح العلاقات بين اللغات المختلفة.

تتضمن بعض العلاقات اللغوية التي أثبتها منظرو الحساب ما يلي:

enter image description here

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

تعد JavaScript خالية من السياق على أقل تقدير، وبالتالي فإننا نعلم بيقين بنسبة مائة بالمائة أن تصميم تعبير عادي (regex) قادر على التقاط جميع XSS هو مهمة مستحيلة.

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