Այսօր մենք վերլուծելու ենք շատ հետաքրքիր վեբ-խոցելիություն, որը կապված է արտաքին սուբյեկտների XML փաստաթղթերի ներդրման հետ-XXE
Ինչ է xxe- ն?
XXE (XML արտաքին սուբյեկտ, XML- ի արտաքին էության ներդրումը) վեբ անվտանգության խոցելիությունն է, որը տեղի է ունենում այն ժամանակ, երբ դիմումը մշակում է XML-Vedas- ը `առանց պատշաճ ստուգման կամ մաքրման: Այս խոցելիության էությունը հարձակվողի ունակությունն է `XML փաստաթղթի ներսում արտաքին օբյեկտներ (ֆայլեր կամ առարկաներ փոխանցված ֆայլեր կամ առարկաներ փոխանցվող ֆայլեր կամ առարկաներ) վերբեռնելու համար.
Մի քիչ XML- ի մասին
XXE- ի ուսումնասիրությունը սկսելուց առաջ անհրաժեշտ է հասկանալ, թե որն է xml- ը.
XML (ընդարձակ նշման լեզու) բառացիորեն նշանակում է «ընդարձակ նշման լեզու»: XML- ը այնպիսի լեզու է, որը նախատեսված է պահեստավորման եւ տվյալների փոխանցման համար: HTML- ի նման, XML- ն օգտագործում է պիտակների եւ տվյալների ծառի կառուցվածքը: Ի տարբերություն HTML- ի, XML- ը չի օգտագործում կանխորոշված պիտակներ, ուստի պիտակները կարող են տրվել ցանկացած անուն, տվյալները նկարագրելու համար (այդ իսկ պատճառով նշման լեզուն կոչվում է ընդլայնել): Նախկինում XML- ը հանրաճանաչ էր որպես տվյալների փոխանցման ձեւաչափ («Աջաքս» -ում «XML») նշանակում է «XML»), բայց այժմ նրա ժողովրդականությունը նվազել է հօգուտ JSON ձեւաչափի.
Ավելի լավ հասկանալու համար մտածեք XML- ի մասին, որպես HTML- ի նման տվյալների կառուցվածքի մեթոդ, բայց ավելի մեծ ճկունությամբ.
XML օգտագործող օբյեկտի նկարագրության օրինակ է տրված ստորեւ:
<?xml version="1.0" encoding="UTF-8"?> <car> <brand>Mazda</brand> <model>Axela</model> <type>Sedan</type> <color>Red</color> </car>
Այստեղ մենք նկարագրեցինք XML- ը, որը նկարագրեց Mazda Axela Car- ը կարմիր սեմանի հետեւի մասում.
Այս պահին մենք մոտավորապես հասկացանք, թե որն է XML: Այժմ դուք պետք է պարզեք, թե որն է էությունն է էությունը.
Սուբյեկտներ XML- ում
XML- ի սուբյեկտները XML փաստաթղթում տվյալների տարրը ներկայացնելու միջոց են `իրենք իրենց տվյալներն օգտագործելու փոխարեն: Այս հոդվածում մենք կխոսենք ընդհանուր (ընդհանուր) սուբյեկտների մասին: Կան նաեւ պարամետրային սուբյեկտներ, բայց ես այս հարցը կթողնեմ ընտրովի ուսումնասիրության մեջ: Տարբեր սուբյեկտներ արդեն կառուցված են XML լեզվով ճշգրտման մեջ, բայց սուբյեկտների «ցուցակը» չի ավարտվում այնտեղ: Օրինակ, եթե մենք խոսում ենք կառուցված սուբյեկտների մասին, ապա նախագծերը <եւ> ներկայացնում են <եւ>: Սրանք MetasimVols են, որոնք օգտագործվում են XML Tags նախագծելու համար, եւ, հետեւաբար, որպես կանոն, դրանք պետք է ներկայացվեն իրենց սուբյեկտների օգտագործմամբ, երբ խոսքը վերաբերում է փաստաթղթերի տվյալների ներկայության մասին: Հակառակ դեպքում, փաստաթուղթը մշակելիս XML պրոցեսորը թողարկելու է սխալի հաղորդագրություն.
Մի փոքր DTD- ի մասին
XML փաստաթղթի տիպի սահմանումը (DTD) պարունակում է հրահանգներ, որոնք կարող են որոշել XML փաստաթղթի կառուցվածքը, տվյալների արժեքների տեսակները, որոնք կարող են պարունակել եւ այլ տարրեր: DTD- ը հայտարարվում է կամընտիր տարրի մեջ DOCTYPE XML փաստաթղթի սկզբում: DTD- ը կարող է լիովին ինքնավար լինել փաստաթղթի ներսում ինքնին, կարող է բեռնվել մեկ այլ վայրից (արտաքին DDD) կամ կարող է հիբրիդ լինել.
XML- ը թույլ է տալիս որոշել օգտագործողների սուբյեկտները DTD- ում: Ես օրինակ կտամ:
<!DOCTYPE test [<!ENTITY entity_name "entity_value">]>
Այս տողը նշանակում է, որ էության հղման ցանկացած օգտագործումը &entity_name; XML փաստաթղթում կփոխարինվի որոշակի արժեքով: "entity_value".
XML- ամվագների օգտագործումը
Այսպիսով, մեր սուբյեկտները օգտագործելու համար մենք պետք է օգտագործենք տեսակի ձեւավորում:
<!ENTITY entity_name "entity_value">
Նորից, օրինակ մեր մեքենայի հետ:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE test [<!ENTITY mazda "Mazda" >]> <car> <brand>&mazda;</brand> <model>Axela</model> <type>Sedan</type> <color>Red</color> </car>
Այստեղ մենք որոշեցինք ներքին էությունը եւ դրանում հիշատակեցինք brand. Հեշտ է կռահել, որ XML լարը մշակելիս <brand>&mazda;</brand> կփոխարինվի <brand>Mazda</brand>.
Ներքին եւ արտաքին սուբյեկտներ
Պայմանական (ընդհանուր) սուբյեկտները բաժանված են երկու տեսակի, ներքին եւ արտաքին.
Ներքին (ինտերնետ) սուբյեկտները համարվել են ավելի բարձր (օրինակ մեքենայի հետ): Նրանք աշխատում են միայն այն արժեքներով, որոնք նկարագրված են փաստաթղթի ներսում.
Արտաքին սուբյեկտները անհրաժեշտ են XML- ում մեկ այլ ֆայլում պահվող տվյալները օգտագործելու համար: Այսինքն, արտաքին XML-Suction- ը անհատական սուբյեկտների տեսակ է, որի սահմանումն այն սահմանում է, որում դրանք հայտարարվում են.
Արտաքին օբյեկտի հայտարարությունը օգտագործում է համակարգի հիմնաբառ եւ պետք է նշի URL- ն, որից պետք է բեռնվի օբյեկտի արժեքը: Օրինակ:
<!DOCTYPE test [<!ENTITY xxe SYSTEM "http://example.com">]>
URL- ն կարող է օգտագործել Uri schema ֆայլ://, Հետեւաբար, արտաքին օբյեկտները կարող են բեռնվել նաեւ ֆայլից:
<!DOCTYPE test [<!ENTITY xxe SYSTEM "file://path/to/file">]>
XML- ի արտաքին օբյեկտները ճշգրիտ ապահովում են հիմնական միջոցներ, որոնց միջոցով ծագում է XXE հարձակումը.
Ամփոփելով, մենք հասկանում ենք, որ XML փաստաթղթերը կարող են պարունակել հղումներ դեպի արտաքին ռեսուրսներ (ֆայլեր կամ URL): Գործողության ընթացքում XXE հարձակվողը կարող է ներառել հղումներ այս օբյեկտների հետ XML- ում եւ այդպիսով շահարկել դիմումը դրանց վերամշակման ընթացքում: Երբ խոցելի դիմումը մշակում է XML փաստաթուղթը առանց դրա համապատասխան ստուգման, այն կարող է ինքնաբերաբար լուծել հղումները արտաքին օբյեկտների հետ եւ բեռնավորել այս առարկաները: Սա կարող է հանգեցնել տարբեր տեսակի խոցելիության, ինչպիսիք են սերվերից կամայական ֆայլեր կարդալու համար (արբիտրաժային ֆայլ կարդում է), սկանավորելով ներքին ցանցը (որը դրսից մուտք չունի), օգտագործելով SSRF կամ գործարկելիս, «Հրաժարում է»».
Այսօր մենք կանդրադառնանք XXE- ի միջոցով ֆայլեր կարդալու հնարավորության մասին եւ հաշվի առեք գործնական օրինակ.
Ֆայլերը կարդալով XXE- ի միջոցով
Պատկերացրեք, որ դուք XML փաստաթուղթ եք ուղարկում XXE- ի նկատմամբ խոցելի դիմումի: Այս XML ֆայլում դուք ներառում եք գաղտնի ֆայլի հղում, ինչպիսիք են գաղտնաբառը: Txt, որը պահվում է սերվերի վրա եւ ուղղակիորեն մատչելի չէ: Եթե դիմումը կուրորեն վերամշակում է XML- ը եւ թույլ է տալիս հղում արտաքին օբյեկտի հետ, ապա դա կարող է անխուսափելիորեն տրամադրել հարձակվողին գաղտնաբառի բովանդակությամբ:.
Պրակտիկա
Որպես օրինակ, մենք համարում ենք իմ կողմից զարգացածը եւ @Սիդնյոբ Լաբորատոր, հասանելի է հրապարակավ այստեղ.
Նշված URL- ին անցնելիս մեզ դիմավորում են թույլտվության պարզ ձեւով:
Ժամանակն է սկսել Burp Proxy- ը եւ ուսումնասիրել, թե ինչպես է գործում թույլտվության մեխանիզմը.
Նախեւառաջ մենք կփորձենք մուտք գործել պատահական անուն եւ գաղտնաբառ (իմ դեպքում user:pass):
Դե, մենք ձախողվեցինք: Մենք գնում ենք HTTP History Burp Proxy- ի եւ ուսումնասիրելու ուղարկված հարցումը:
Ես անմիջապես տեղադրել եմ կրկնողի խնդրանք, որպեսզի շարունակեմ աշխատել նրա հետ: Հարցումը վերլուծելիս մենք տեսնում ենք, որ մենք ունենք էջ / Dologin, որը մշակում է հարցումը: Միեւնույն ժամանակ, մեզ համար վերադարձվում է նաեւ կոդով ծածկագիր եւ հաղորդագրությունների դաշտ պարունակող XML փաստաթուղթ: Հաղորդագրության դաշտում մենք գտնում ենք իմաստը user, Պիտակով փոխանցվող արժեքի հետ համընկնում username Հայցել: Ստուգեք, արդյոք դա այդպես է, փոխարինելով պատահական գիծ:
Հիանալի Մեր կողմից փոխանցվող իմաստը ցուցադրվում է գործառույթի գործառույթի արդյունքում: Ուղարկված XML հարցումը ձեւավորվում է հաճախորդի կողմից, եկեք ուսումնասիրենք նրա սերնդի մեխանիզմը: Եկեք դիտարկենք էջի մեկնարկային ծածկագիրը եւ գտնենք HTML DICK, որը պատասխանատու է «Մուտք կոճակի ելքի համար":
Այս պիտակը ունի OnClick իրադարձության պրոցեսոր, որն առաջացնում է Dologin () JS գործառույթ: Մենք դա ավելի մանրամասն ուսումնասիրելու ենք:
Այս ծածկագիրը JavaScript գործառույթ է, որն իրականացնում է հետեւյալ գործողությունները:
- Ստանում է դաշտային արժեքներ "
username" Մի քանազոր "password" HTML տարրերից `համապատասխան նույնականացուցիչներով; - Ստուգում է, որ երկու դաշտերը պարունակում են արժեքներ (ոչ դատարկ): Եթե դաշտերից մեկը դատարկ է, ապա այն ցուցադրում է նախազգուշացում փոփ-պատուհանի տեսքով եւ դադարում է գործառույթը կատարել;
- Փոխում է տարրի տեքստի պարունակությունը նույնացուցիչի հետ "
flag" գծի վրա "Another fucking login form? Are you kidding me?"; - Փոփոխական է ստեղծում
data, Պարունակում է XML հաշվետվության տվյալներ, որոնք բաղկացած են պիտակներից<user>,<username>,<password>, որի արժեքը վերցված է ներդրված արժեքներից; - Ստեղծում է նոր օբյեկտ
XMLHttpRequest(Ajax-Հայց) օգտագործելով դիզայներXMLHttpRequest(); - Բացվում է սերվերի հետ կապը փոստով եւ նշում է մուտքի կետը (
/doLogin); - Բովանդակության տիպի հայցի վերնագիրը սահմանում է արժեքի "
application/xml;charset=utf-8", Նշեք սերվերին, որ տվյալներն ուղարկվում են XML ձեւաչափով; - Հարցում է ուղարկում սերվերին, փոխանցելով տվյալները
data; - Սահմանում է հակառակ զանգի գործառույթը
onreadystatechange, որը կառաջադրվի խնդրանքի պահանջը փոխելիս; - Սերվերից պատասխանը ստանալուց հետո պատասխան պետություն
readyStateհավասար4Եւ պատասխանի կարգավիճակըstatusհավասար200:
- Ստեղծում է օբյեկտի օրինակ
DOMParser, որը կարող է օգտագործվել XML լարը փաստաթղթի օբյեկտների վերլուծության համար; - Օգտագործում է մեթոդը
parseFromString()օրինակDOMParser, Արձագանքման XML տողը օբյեկտին դարձնելու համարxmlDoc; - Հեռացնում է պիտակների արժեքները
<code>,<message>,<flag>ՕբյեկտիցxmlDoc. - Կախված պիտակի արժեքից
<code>Dis ուցադրում է սխալի հաղորդագրություն կամ հաջող մուտքագրում եւ թարմացնում է տարրերի բովանդակությունը նույնացուցիչներով "message" Մի քանազոր "flag".
Նաեւ գործառույթից ներքեւ մենք տեսնում ենք, որ մշակողների թողած մեկնաբանությունը, որը նշում է, հնարավոր է, զգայուն ֆայլ, որը հավանաբար կարող է լինել սերվերում.
Այս բոլոր տեղեկությունները (արդյունքում ստացված խնդրանքով պիտակի ցուցադրումը, XML- ի օգտագործումը, կրեդիտներով ֆայլ) հուշում է, որ դուք պետք է գործեք xxe! Եկեք դա անենք.
Սկզբնապես մենք պետք է որոշենք արտաքին էությունը, ապա ինտեգրվել ցանկալի հարցման պիտակի մեջ: Վերջնական բեռը հետեւյալն է:
Մենք օգտագործում ենք պիտակը username Արտաքին էությունը ներդնելու համար, քանի որ դրա բովանդակությունը ցուցադրվում է սերվերի ի պատասխան: Ուղարկեք այս խնդրանքը եւ տեսեք, թե ինչ է մեզ կպատասխանի սերվերը:
Սերվերի ի պատասխան, ստացանք Credss.txt ֆայլի բովանդակությունը, օգտագործելով օգտվողի անունը եւ գաղտնաբառը դիմումից:
Youwillneverguessthisu53rn4m3: Butp @ ssw0rdisverystr0ng
Ստացված հաշվապահական հաշվառման տվյալների տակ մուտք գործելով, մենք հաջողությամբ ստանում ենք դրոշը:
Մենք հանձնում ենք դրոշը, ստանում ենք 350 միավոր եւ լուծում ենք առաջադրանքը!
Բայց այն, ինչ նման էր թույլտվության, հավատարիմ վարկերի հետ »կուլիսների հետեւում":
Եզրափակում
XML- ի օգտագործումը չի սահմանափակվում հոդվածում տրված օրինակներով: Փաստորեն, դրա կիրառման շրջանակը շատ ավելի լայն է: XML- ն օգտագործվում է տարբեր տեխնոլոգիաների եւ արձանագրությունների տվյալների փոխանցման համար: Ահա մի քանի օրինակ, որտեղ XML- ն լայնորեն օգտագործվում է:
- Օճառ (Հասարակ օբյեկտի մուտքի արձանագրություն). Օճառը կառուցվածքային հաղորդագրությունների արձանագրություն է, որը հիմնված է XML- ի վրա, որն օգտագործվում է վեբ ծառայությունների միջեւ տվյալների փոխանակման համար;
- 2. Հանգիստ (ներկայացուցչական պետական փոխանցում). Հանգստացնող վեբ ծառայությունները կարող են օգտագործել XML, հաճախորդների հետ շփվելիս տվյալներ կամ պահանջներ ներկայացնելու համար;
- SAML (Անվտանգության հավաստման նշման լեզու). SAML- ը նշող լեզու է, որն օգտագործվում է մեկ վավերացման համակարգերի միջեւ վավերացման եւ թույլտվության փոխանակման համար (SSO);
- RSS (Իսկապես պարզ սինդիկացիա). RSS- ը ձեւաչափ է կայքի բովանդակությունը համաժամեցնելու համար, որը XML- ն օգտագործում է XML- ը `լրատվամիջոցների ժապավենները եւ թարմացումները ներկայացնելու համար;
- SVG (Մատելի վեկտորի գրաֆիկա). SVG- ն XML ձեւաչափ է վեկտորային գրաֆիկան նկարագրելու համար, ինչը թույլ է տալիս ստեղծել եւ շահարկել վեկտորի պատկերները վեբ էջում;
- XSLT (Ընդարձակ ոճերի թերթի վերափոխումներ) XSLT- ը XML տրանսֆորմացիայի լեզուն է, որն օգտագործվում է XML փաստաթղթերը տարբեր ձեւաչափերի վերածելու համար, ինչպիսիք են HTML, տեքստը կամ այլ XML;
- XSD (XML Schema Definition). XSD- ը XML սխեմայի նկարագրության լեզուն է, որը թույլ է տալիս որոշել տվյալների կառուցվածքը եւ տեսակները, որոնք պետք է ներառվեն XML փաստաթղթում.
Սրանք XML- ի ընդամենը մի քանի օրինակ են: Ընդհանուր առմամբ, XML-Based մոտեցումը օգտագործվում է կառուցվածքային տվյալների եւ տեղեկատվության փոխանակման համար բազմաթիվ համակարգերում եւ ծրագրերում.