Ablakok.  Vírusok.  Jegyzetfüzetek.  Internet.  hivatal.  Segédprogramok.  Drivers

A probléma lényegének leírásához el kell mondanom a HTML általános működését. Valószínűleg általánosságban képzelted el, de én mégis röviden áttekintem azokat a főbb pontokat, amelyek a megértéshez szükségesek lesznek. Ha valaki türelmetlen, azonnal térjen a lényegre.


A HTML egy hiperszöveg jelölőnyelv. Ahhoz, hogy ezt a nyelvet beszéld, követned kell a formátumát, különben az, aki elolvassa a leírtakat, nem fogja megérteni. Például a HTML-címkék attribútumokkal rendelkeznek:



Itt van az attribútum neve és értéke. A cikkben szögletes zárójeleket fogok használni a kód körül, hogy egyértelmű legyen, hol kezdődik és hol végződik. A nevet egy egyenlőségjel követi, majd az érték idézőjelek között. Az attribútum értéke közvetlenül az első idézőjel karakter után kezdődik, és közvetlenül a következő idézőjel előtt ér véget, bárhol is szerepel. Ez azt jelenti, hogy ha helyette , akkor az értéket név attribútum lesz , és az elemnek három másik attribútuma is lesz: [horns] , [and] és [hooves"."] , de értékek nélkül.


Ha ez nem az, amire számítottál, akkor valahogy módosítani kell az attribútum értékét, hogy ne tartalmazzon idézetet. A legegyszerűbb dolog az, hogy egyszerűen kivágja az idézőjeleket.


Ekkor a HTML elemző helyesen olvassa be az értéket, de az a baj, hogy más érték lesz. Akartad és megkaptad. Egyes esetekben ez a megkülönböztetés kritikus lehet.


Annak érdekében, hogy bármilyen karakterláncot megadhasson értékként, a formátumot HTML nyelv lehetőséget kínál az attribútumértékek elkerülésére. Az értéksorba idézőjel helyett írhatja be a ["] karaktersorozatot, és az elemző megérti, hogy ezen a helyen forrássor, amelyet az attribútum értékeként szeretne használni, egy idézet volt. Az ilyen sorozatokat HTML entitásoknak nevezzük.


Ugyanakkor, ha a forráskarakterláncban valóban volt egy karaktersorozat ["] , akkor továbbra is lehetősége van megírni úgy, hogy az elemző ne változtassa idézetté - ehhez ki kell cserélnie a [&] jelet. karaktersorozattal [&] , akkor ott ["] helyett nyers szövegben kell írni ["] .


Kiderült, hogy az eredeti karakterláncból a két idézőjel közé írandó karakterláncra történő átalakítás egyértelmű és visszafordítható. Ezeknek az átalakításoknak köszönhetően bármilyen karakterláncot írhat és olvashat egy HTML címke attribútumaként, anélkül, hogy belemenne a tartalmának lényegébe. Csak kövesse a formátumot, és minden működik.


Valójában a legtöbb formátum, amellyel találkozunk, így működik: van egy szintaxis, van egy módja annak, hogy a tartalmat elkerüljük ebből a szintaxisból, és egy módja annak, hogy elkerüljük az escape karaktereket, ha hirtelen ilyen sorozat fordul elő a forráskarakterláncban. A legtöbb, de nem...

Címke

A címkét más nyelven írt töredékek HTML-be ágyazására használják. Ma az esetek 99%-ában Javascript. A szkript közvetlenül a nyitó címke után kezdődik, és közvetlenül a záró címke előtt ér véget. HTML elemző nem néz bele a címkébe, számára ez csak egy szöveg, amit aztán megad a Javascript értelmezőnek.


A Javascript viszont egy független nyelv, saját szintaxissal, általánosságban elmondható, hogy semmilyen különleges módon nem arra tervezték, ami a HTML-be ágyazva lesz. Mint minden más nyelvnek, vannak karakterlánc-literáljai, amelyek bármit tartalmazhatnak. És amint azt sejteni lehetett, lehet egy olyan karaktersorozat, amely záró címkét jelent.


var s = "meglepetés!alert("hopp!")";

Itt az kell, hogy az s-hez egy ártalmatlan karakterláncot kell rendelni.


Mi történik itt valójában: Az s változót deklaráló szkript valójában így végződik: , ami szintaktikai hibát eredményez. Az utána lévő összes szöveget tiszta HTML-ként értelmezi, és bármilyen jelölés beágyazható. BAN BEN ez az eset megnyílik új címkeés rosszindulatú kód fut le.


Ugyanazt a hatást kaptuk, mint amikor az attribútum értékében idézőjel van. Az attribútumértékekkel ellentétben azonban a címkék nem hagyhatják el az eredeti tartalmat. A címkén belüli HTML entitások nem működnek, változatlan formában kerülnek át a Javascript értelmezőbe, vagyis vagy hibához vezetnek, vagy megváltoztatják a jelentését. A HTML szabvány kifejezetten kimondja, hogy a címke tartalma semmilyen formában nem tartalmazhat karaktersorozatot. A Javascript szabvány pedig nem tiltja, hogy egy ilyen szekvencia bárhol szerepeljen a string literálokban.


Kiderül egy paradox helyzet: ha egy érvényes Javascriptet teljesen érvényes eszközökkel beágyazunk egy érvényes HTML dokumentumba, érvénytelen eredményt kaphatunk.


Véleményem szerint ez egy HTML-jelölési sebezhetőség, amely valós alkalmazások sebezhetőségéhez vezet.

Hogyan használják ki a sebezhetőséget

Természetesen, amikor csak egy kódot ír, nehéz elképzelni, hogy mit írjon egy sorra, és ne vegye észre a problémákat. A szintaktikai kiemelés legalábbis tudatja Önnel, hogy a címke idő előtt bezáródott, legfeljebb az Ön által írt kód nem fut le, és sokáig fog keresni, hogy mi történt. De nem ez a sebezhetőség fő problémája. A probléma akkor jelentkezik, ha a HTML generálásakor bizonyos tartalmakat beágyaz a Javascript-be. Íme egy gyakori kódrészlet a szerveroldali rendereléssel rendelkező react alkalmazásokhoz:


ablak.__INITIAL_STATE__ = ;

A kezdeti állapot bárhol megjelenhet, ahol az adatok a felhasználótól vagy más rendszerektől származnak. A JSON.stringify nem változtatja meg az ilyen karakterláncokat a szerializálás során, mivel azok teljesen JSON és Javascript formátumúak, így csak elérik az oldalt, és lehetővé teszik a támadó számára, hogy tetszőleges Javascriptet hajtson végre a felhasználó böngészőjében.


Egy másik példa:


analytics.identify("", ...);

Itt a kiszolgálóhoz érkezett felhasználói azonosító és hivatkozó a megfelelő kihagyással ellátott sorokba kerül. És ha a user.id valószínűleg nem tartalmaz mást, mint számokat, akkor a támadó bármit beletömhet a hivatkozóba.


De a móka nem ér véget a zárócímkével. A nyitócímke is veszélyes, ha szimbólumok vannak [ sz
Nem igazán

Ebben a példában mi:

  • Belül elsőűrlapok:
    • Elküldve kettő rádiógombokkal ( ) a korlátozott számú opció valamelyikének kiválasztásához. Még egyszer vegye figyelembe, hogy az azonos űrlapon belüli választógombokhoz ugyanazt a nevet kell megadni, eltérő értékeket adtunk meg. Mert első checked , ami azt határozza meg, hogy az elemet előre ki kell választani az oldal betöltésekor (ebben az esetben egy yes értékű rádiógomb). Ezenkívül globális attribútumokat adtunk meg a választógombokhoz, amelyek egyedi azonosítót határoznak meg az elemhez.
    • Két elemet helyeztünk el, amelyek meghatározzák a szövegmezőink szövegcímkéit. Vegye figyelembe, hogy a for attribútumot használtuk annak meghatározására, hogy az aktuális címke melyik űrlapelemhez tartozik. A for attribútum értéke megfelel a számunkra szükséges választógomb globális attribútumának értékének.
  • Belül másodikűrlapok:
    • Elküldve kettő rádiógombokkal ( ) a korlátozott számú opció valamelyikének kiválasztásához. Mert második választógombon megadtuk az attribútumot
Leírás

A címke asszociációt hoz létre egy adott címke, amely általában szöveg, és egy űrlapelem ( , , ) között. Egy ilyen hivatkozás szükséges az űrlapelemek értékeinek megváltoztatásához, amikor az egérkurzor a szövegre kattint. Ezenkívül a segítségével beállíthatja a gyorsbillentyűket a billentyűzeten, és az aktív elemre, például hivatkozásokra ugorhat.

Egy objektum és egy címke társításának két módja van. Az első az id használata az űrlapelemen belül, és a címke for attribútumaként adja meg a nevét. A második módszernél az űrlapelemet egy tartályba helyezzük.

Szintaxis Szöveg Attribútumok Hozzáférés az űrlapelemekhez billentyűparancsok segítségével. A linkelni kívánt elem azonosítója. Záró címke

Kívánt.

HTML5 IE Cr Op Sa Fx

Címke címke

Lorem ipsum dolor sit amet...

Lorem
Ipsum
Dolor
Ülj amet

Böngészők

Az IE6 nem teszi lehetővé az űrlapmező aktiválását szövegkattintásra, ha a szövegmező egy címkén belül van.

Az IE a 8.0-s verzióig csak akkor működik megfelelően, ha van benne szöveg. Ha hozzáadsz egy képet ( ), akkor az űrlapmezőt a képre kattintva nem tudja aktiválni.

Ha hibát észlel, jelöljön ki egy szövegrészt, és nyomja meg a Ctrl + Enter billentyűket
OSSZA MEG: