July 18, 2025

XPath ներարկում - կանխարգելման տեսակներ եւ մեթոդներ

Այս հոդվածում մենք կքննարկենք այս տեսակի խոցելիությունները վեբ ծրագրերում, ինչպես - XPath ներարկում.

Ամեն օր մենք լսում ենք հաղորդագրություններ կայքերի հաքերի մասին եւ սովորաբար կարծում են, որ հաջողության հասած հաքերը պետք է լինի աներեւակայելի խելացի: Սովորաբար, փաստորեն, հակառակը ճշմարիտ է: Վեբ կայքերը փչող հաքերների մեծ մասը նոր հակերներ են, ովքեր կատարում են այս գործողությունները հանուն ժողովրդականության: Վեբ դիզայներները կենտրոնանում են իրենց կայքերի զարգացման եւ հակերների շահագործման վրա.

Նշում. Այս հոդվածը նախատեսված է միայն կրթական նպատակներով: Լինել կառուցողական հասարակության մի մասը.

Վեբ ծրագրեր Պահպանեք տվյալները եւ հասանելիություն ձեռք բերեք նրանց տարբեր եղանակներով եւ ձեւերով, կախված դրանց օգտագործման ընտրանքներից: Պատմականորեն հարաբերական տվյալների բազաները հանրաճանաչ ընտրություն էին `մյուս տվյալների բազաների մեջ` մեծ քանակությամբ տվյալների պահպանման համար: Այնուամենայնիվ, տվյալների պահպանման համար XML օգտագործելու հակումն աճում է: XML օգտագործելիս տվյալները պահվում են ներդրված կառուցվածքում `ծառի տեսքով, եւ ոչ սյուներ եւ գծեր: Սա շատ թերություններ ունի, բայց այն կարող է օգտագործվել ստատիկ տվյալների համար, ինչպիսիք են կազմաձեւման պարամետրերը: Դա պայմանավորված է նրանով, որ նման ստատիկ տվյալները պահանջում են ավելի քիչ ընթերցման / ձայնագրման գործառնություններ, որոնք շատ դանդաղ են առաջանում XML տվյալների շտեմարաններում.

Վեբ հավելվածի աուդիտով դուք կարող եք հեշտությամբ կորցնել որոշակի տեսակի խոցելիության տեսողությունը, եթե դրանցից յուրաքանչյուրի համակարգված փորձարկում չկատարեք առանձին: Ներարկման շահագործումները հայտնի են, եւ, իրոք, նրանք առաջին տեղը գրավեցին OWASP Top 10 վարկանիշում. Այնուամենայնիվ, այս հոդվածում մենք կքննարկենք հարձակումը, որը շատ ավելի տարածված է, քան SQL, XPath եւ xquery ներդրումը.

Ինչ է xpath եւ xquery?

XPath- ը լեզու է, որը պահանջում է XML փաստաթուղթ `հատուկ ձեւանմուշին համապատասխան տեղեկատվության մի մաս գտնելու կամ ցանկալի հատկանիշ պարունակող: Եթե հաճախորդը մուտք ունի օգտագործված XPath հարցման մի մասի, եւ այս մուտքը զտված չէ, ապա հաճախորդը մուտք կգա ամբողջ XML փաստաթղթում, եթե նա կարողանա որոշել իր կառուցվածքը.

XML- ում պահվող տվյալները կարող են պահանջվել XPath- ի միջոցով, ինչը հայեցակարգային նման է SQL- ին: Այն նաեւ այն հարցումների լեզուն է, որն օգտագործվում է XML փաստաթղթում որոշակի տարրեր որոնելու համար: Մուտքի մակարդակի թույլտվություններ չկան, եւ դուք կարող եք անդրադառնալ XML փաստաթղթի գրեթե ցանկացած մասի, ի տարբերություն SQL- ի, ինչը թույլ է տալիս սահմանափակում տվյալների բազաների, սեղանների կամ սյուների համար.

Դա պայմանավորված է նրանով, որ XPath- ը տարբերվում է տվյալների բազայի այլ լեզուներից, քանի որ դրանում չկա մուտքի վերահսկում կամ օգտագործողի վավերացման տարրեր.

XQuery- ը XPath- ի ընդլայնված հավաքածու է, որն ավելացնում է SQL- ի նման շարահյուսությունը, ինչպես նաեւ փաստաթղթերի պահանջների որոշ օգտակար գործառույթներ.

Ինչ է XPath ներարկումը?

Խնդիրներ, որոնք կարող են առաջանալ XML- ի միջոցով տվյալների օգտագործման պահից, նման են նաեւ SQL- ում առաջացած խնդիրներին: XPath- ի իրականացումը հարձակման մի տեսակ է, որում վնասակար ներդրումը կարող է հանգեցնել գաղտնի տեղեկատվության չարտոնված մուտքի կամ բացահայտման, ինչպիսիք են XML փաստաթղթի կառուցվածքը եւ բովանդակությունը: Դա տեղի է ունենում այն ժամանակ, երբ օգտագործողը օգտագործվում է հարցման գիծ կառուցելու համար: Մեծ թվով մեթոդներ, որոնք կարող են օգտագործվել հարձակման մեջ, օգտագործելով SQL- պաշտպանություն, կախված են թիրախային տվյալների բազայի կողմից օգտագործված SQL բարբառի բնութագրերից, իսկ XPath- պաշտպանության միջոցով հարձակումները կարող են լինել շատ ավելի հարմարեցված եւ տարածված.

XPath- ի սկզբունքը: Հարձակման նպատակը նույնպես շատ նման է: Այս հարձակումների միակ տարբերությունն այն է, որ XPath- ի իրականացումը օգտագործում է XML ֆայլը տվյալների բազայի փոխարեն տվյալների պահելու համար: XML ֆայլից տվյալներ ստանալու միջոցներից մեկը պետք է օգտագործվի.

Որոշ դեպքերում օճառի մարմնում պարամետրերը ուղղակիորեն օգտագործվում են որպես XPath հարցման մուտքային տվյալներ: Եթե այս օգտագործողի մուտքը չի հաստատվում, հավանաբար հարձակվողը կարող է փոխել XPath հարցումը: Ամենավատ դեպքում հարձակվողը կկարողանա կարդալ ամբողջ հայցվող XML փաստաթուղթը.

  • Օճառ - Կառուցվածքային հաղորդագրությունների փոխանակման արձանագրություն բաշխված հաշվարկային միջավայրում: Սկզբնապես օճառը նախատեսված էր հիմնականում հեռավոր զանգերի իրականացման համար (RPC). Այժմ արձանագրությունն օգտագործվում է ձեւաչափով կամայական հաղորդագրություններ փոխանակելու համար Xml, Եւ ոչ միայն ընթացակարգերը զանգահարելու համար: Պաշտոնատար անձ բնութագրում Արձանագրության վերջին 1.2-րդ տարբերակը որեւէ կերպ չի վերծանում անունը օճառ: Օճառը արձանագրության ընդլայնումն է XML-RPC.

SQL ներարկման նման, XPath Inject- ի գրոհները տեղի են ունենում այն ժամանակ, երբ կայքը օգտագործում է օգտագործողի կողմից տրամադրված տեղեկատվությունը XML տվյալների XPath հարցում կառուցելու համար: Միտումնավոր խեղաթյուրված տեղեկատվություն կայք ուղարկելով կայքէջին, հարձակվողը կարող է պարզել, թե ինչպես են XML տվյալները կառուցված, կամ մուտք գործեք տվյալներ, որոնք նա սովորաբար մուտք չունի: Նրանք նույնիսկ կարող են կարողանան ավելացնել իրենց արտոնությունները կայքում, եթե XML տվյալներն օգտագործվում են նույնականացման համար (օրինակ, XML- ի հիման վրա օգտագործողի ֆայլ)).

XML- ի հայցը կատարվում է XPath- ի միջոցով, ինչպիսիք են պարզ նկարագրական օպերատորը, ինչը թույլ է տալիս XML խնդրանքը գտնել տեղեկատվության բեկոր: Ինչպես SQL- ում, համեմատության համար կարող եք նշել որոնման եւ ձեւանմուշների որոշակի հատկանիշներ: Կայքի համար XML օգտագործելիս նրանք սովորաբար հարցման գծում մուտքագրում են մուտքի որոշակի ձեւ, որպեսզի հայտնաբերվեն այն բովանդակությունը, որը անհրաժեշտ է գտնել եւ ցուցադրվել էջում: Այս մուտքը պետք է մշակվի, համոզվելու համար, որ այն չի փչացնում XPath հարցումը եւ չի վերադարձնում սխալ տվյալները.

XPath - ստանդարտ լեզու; Դրա նշումը / շարահյուսությունը միշտ կախված չէ իրականացումից, ինչը նշանակում է, որ հարձակումը կարող է ավտոմատացվել: Այլ բարբառներ չկան, ինչպես որ դեպքն է SQL տվյալների շտեմարաններին.

Քանի որ մուտքի վերահսկման մակարդակ չկա, կարող եք ստանալ ամբողջ փաստաթուղթը: Մենք չենք բախվի որեւէ սահմանափակումների, որոնք կարող են հայտնի լինել SQL-Defense օգտագործող հարձակումներից.

XPath ներարկման խոցելիության օրինակ

Օրինակների համար մենք կօգտագործենք այս հատվածի XML- ը:

<?xml version="1.0" encoding="utf-8"?>
<Employees>
   <Employee ID="1">
      <FirstName>Arnold</FirstName>
      <LastName>Baker</LastName>
      <UserName>ABaker</UserName>
      <Password>SoSecret</Password>
      <Type>Admin</Type>
   </Employee>
   <Employee ID="2">
      <FirstName>Peter</FirstName>
      <LastName>Pan</LastName>
      <UserName>PPan</UserName>
      <Password>NotTelling</Password>
      <Type>User</Type>
   </Employee>
</Employees>

Ենթադրենք, մենք ունենք օգտվողի վավերացման համակարգ, վեբ էջում, որն օգտագործում է այնպիսի տվյալների ֆայլ, օգտագործողներին մուտքագրելու համար: Օգտագործող եւ գաղտնաբառ մուտք գործելուց հետո ծրագիրը կարող է օգտագործել XPath- ը `օգտագործողին որոնելու համար:

VB:
Dim FindUserXPath as String
FindUserXPath = "//Employee[UserName/text()='" & Request("Username") & "' And
        Password/text()='" & Request("Password") & "']"

C#:
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username") + "' And
        Password/text()='" + Request("Password") + "']";

Սովորական օգտվողի անունով եւ գաղտնաբառով այս XPATH- ը կաշխատի, բայց հարձակվողը կարող է ուղարկել սխալ օգտվողի անուն եւ գաղտնաբառ եւ ընտրել XML հանգույցը, առանց օգտագործողի կամ գաղտնաբառ իմանալու, օրինակ:

Username: blah' or 1=1 or 'a'='a
Password: blah

FindUserXPath becomes //Employee[UserName/text()='blah' or 1=1 or
        'a'='a' And Password/text()='blah']

Logically this is equivalent to:
        //Employee[(UserName/text()='blah' or 1=1) or
        ('a'='a' And Password/text()='blah')]

Այս դեպքում միայն XPath- ի առաջին մասը պետք է լինի ճշմարիտ: Գաղտնաբառի մի մասը դառնում է անտեղի, իսկ օգտվողի անուններից մի քանիսը մասի պատճառով կհամապատասխանեն բոլոր աշխատակիցներին «1 = 1».

Դիտարկենք հետեւյալ XML տվյալների պահպանումը:

<addressBook>
<address>
<firstName>William</firstName>
<surname>Gates</surname>
<password>MSRocks!</password>
<email>billyg@microsoft.com</email>
<ccard>5130 8190 3282 3515</ccard>
</address>
<address>
<firstName>Chris</firstName>
<surname>Dawes</surname>
<password>secret</password>
<email>cdawes@craftnet.de</email>
<ccard>3981 2491 3242 3121</ccard>
</address>
<address>
<firstName>James</firstName>
<surname>Hunter</surname>
<password>letmein</password>
<email>james.hunter@pookmail.com</email>
<ccard>8113 5320 8014 3313</ccard>
</address>
</addressBook>

Այս տվյալների պահուստից էլեկտրոնային հասցեները ստանալու համար XPath- ի պահանջը այսպիսին տեսք կունենա:

//address/email/text()

Dawes օգտագործողի մասին բոլոր տեղեկությունների վերադարձի հայտը նման կլինի:

//address[surname/text()=’Dawes’]

Որոշ ծրագրերում օգտագործողի կողմից տրամադրված տվյալները կարող են ուղղակիորեն կառուցվել XPath- ի խնդրանքների մեջ, եւ հարցման արդյունքները կարող են վերադարձվել դիմումի պատասխանին կամ օգտագործվել է հայտի վարքի որոշ ասպեկտներ որոշելու համար.

Տեսնենք, թե ինչպես կարող ենք այս օրինակի ներարկում իրականացնել: Այս ծածկագիրը գալիս է վեբ հավելվածից, որը տրամադրում է տեղեկատվություն վարկային քարտի մասին այն մուտքագրող օգտվողներին: XPath- ի խնդրանքը, որն արդյունավետորեն ստուգում է օգտագործողի կողմից տրամադրված հաշվապահական հաշվառման տվյալները եւ կարող է քաղվածքների քանակը տրամադրել համապատասխան վարկային քարտի քանակը, կարող է լինել:

//address[surname/text()=’Dawes’ and password/text()=’secret’]/ccard/text()

Ինչպես SQL կոդի ներդրման դեպքում, հարձակվողը կարող է ընդհատել դիմումի կիրառումը `գաղտնաբառ տրամադրելով հետեւյալ արժեքով:

‘ or ‘a’=’a

Սա կհանգեցնի XPath- ի հաջորդ խնդրանքին, որը քաղում է բոլոր օգտագործողների վարկային քարտերի տվյալները:

//address[surname/text()=’Dawes’ and password/text()=’’ or ‘a’=’a’]/ccard/text()

Հիշեք, որ ի տարբերություն SQL- ի խնդրանքների, XPath- ի խնդրանքների հիմնաբառերը զգայուն են գրանցամատյանում, ինչպես նաեւ XML փաստաթղթում գտնվող տարրերի անունները.

Շարունակելու համար դուք կարող եք օգտագործել XPath- ի իրականացման թերությունները `թիրախային XML փաստաթղթից կամայական տեղեկատվություն հանելու համար: Դա անելու լայնորեն կիրառվող եղանակներից մեկը `օգտագործելով նույն տեխնիկան, որը մենք տեսանք SQL- ի ներդրման ժամանակ, ստիպելով դիմումը այլ կերպ արձագանքելու համար, կախված հարձակվողի կողմից սահմանված պայմանից.

Հաջորդ երկու օպերատորներին հայտի գաղտնաբառի դաշտում ուղարկելը կհանգեցնի հայտի տարբեր պահվածքների: Արդյունքները վերադարձվում են առաջին դեպքում, բայց ոչ երկրորդում:

‘ or 1=1 and ‘a’=’a
‘ or 1=2 and ‘a’=’a

Վարքի այս տարբերությունը կարող է օգտագործվել ցանկացած սահմանված պայմանի ճշմարտացիությունը ստուգելու համար, հետեւաբար, միանգամից կամայական տեղեկատվություն հանելու համար: Ինչպես SQL- ի դեպքում, XPath- ի լեզուն պարունակում է կարգաբերման գործառույթը, որը կարող է օգտագործվել միանգամից մեկ նիշի գծի արժեքը ստուգելու համար: Օրինակ, հաջորդ օպերատորին տրամադրելը:

‘ or //address[surname/text()=’Thomas’ and substring(password/text(),1,1)=‘S’] and ‘a’=’a

Սա հանգեցնում է հաջորդ խնդրանքի:

//address[surname/text()=’Mel’ and password/text()=’’ or //address[surname/text()=’Thomas’ and substring(password/text(),1,1)= ‘S’] and ‘a’=’a ‘]/ccard/text()

Որը վերադարձնում է արդյունքները, եթե Թոմասի օգտագործողի առաջին խորհրդանիշը S.- ն է խորհրդանիշի յուրաքանչյուր դիրքի ցիկլային կիրարկմամբ եւ ստուգելով յուրաքանչյուր հնարավոր արժեքը, մենք կարող ենք արդյունահանել Thomas գաղտնաբառի ամբողջական արժեքը.

Խոցելի որոնում XPath ներարկում

Ենթադրենք, որ մշակողը XML ֆայլում պահում է վավերացման տվյալները հետեւյալ կառուցվածքով:

...
<user>
<name>UserName</UserName>
<password>Password</password>
</user>
...

Նույնականացման ընթացքում մշակողը կառուցում է XPath արտահայտությունը հետեւյալ կերպ:

string//user[name/text()='"txtUserName.Text"' and password/text()='" txtPassword.Text"'])

Txtusername- ի եւ TxtPassword- ի փոփոխականներն են ստանդարտ ASPX տեքստային դաշտերը: Երբ հարձակվողը մեջբերում է դրսեւորում `մեջբերումային մարժան (') տեքստի դաշտերից մեկի մեջ, նա լրացնում է գիծը եւ կարող է գրել իր սեփական արտահայտությունը xPath: Ինչպես ես ասացի վերեւում, սցենարը նման է SQL- ին:.

Այսպիսի խոցելիության հայտնաբերման առաջին մեթոդը ձեռքով ներդրման ժամանակ ինձ հայտնի է, մենք փորձում ենք փոխարինել հետեւյալ տվյալները:

  • 'Ինչ էլ որ լինի
  • Կաթիլ
  • Մի բան

Մուտքագրման / URL / եւ որեւէ այլ ոլորտներում: Եթե տեսնում եք ցանկացած սխալ, որը կապված է դասերի հետ, որոնք ASP.NET- ի մանիպուլյացիաները ապահովում են, հավանաբար գտել եք XPath ներարկման սպառնալիք.

Երկրորդ ճանապարհը օրենսգրքում խոցելիության որոնումն է: Կարող եք փնտրել հետեւյալ տողերը:

  • XPath - շատ դասեր, որոնք աշխատում են XPath- ի հետ, ունեն իրենց անվան մեջ գտնվող գիծ'
  • SELCESTINGLENODE () եւ SELECEDNODES () - XML ֆայլերից տվյալներ XPath- ի միջոցով տվյալներ ստանալու համար օգտագործվող մեթոդներ.

Գործնական օրինակ XPath ներարկում

Ձեւի աղբյուրի կոդը այսպիսին է:

$xml = simplexml_load_file("passwords/heroes.xml");
$result = $xml->xpath("/heroes/hero[login='" . $login . "' and password='" . $password . "']");

Մենք օգտագործում ենք հետեւյալ օգտակար բեռը:

blah' or id='2

ID- ի համար մենք օգտագործում ենք օգտագործողի պայմանական սերիական համարը համակարգում եւ փոխարինում ենք մուտքի եւ գաղտնաբառի տեսքով:

Փորձեք դասավորել ID- ները `նոր մուտքեր եւ օգտվողի գաղտնաբառեր ստանալու համար.

Հետեւյալ օրինակը որոնման ձեւն է:

URL- ի խնդրանքով փոխարինելով գնանշումը, մենք կարող ենք սխալ առաջացնել, որն ակնարկում է մեզ հետագա գործողությունների:

http://192.168.0.115/bWAPP/xmli_2.php?genre=action%27&action=search

Օգտագործողի գաղտնաբառերը ստանալու համար մենք օգտագործում ենք հետեւյալ օգտակար բեռը:

http://192.168.0.115/bWAPP/xmli_2.php?genre=horror%27)]/password%20|%20a[contains(a,%27&action=search

Ինչու օգտագործել XML փոխարեն տվյալների բազաների?

Շատ XML ծրագրեր են օգտագործում XML дампы տվյալների բազաների. Գաղափարը сосотоит այն է,որ կարելի է ինչ-ՈՐ ԲԱՆ տեղադրել, XML և հետո օգտագործել ծրագիրը կամ որոշակի կոդ համար парсинга այն տվյալների, որոնք ձեզ հարկավոր են (Հաճախ XML բազայի կիրառվում են բեռնաթափման զբաղված SQL server. Ձեւավորելով дампы կարելի է խնդիրը տեղափոխել ստանալու համար անհրաժեշտ տվյալների հետ բարդ եւ ծանր SQL հարցումների ֆայլի համակարգ եւ պարզ ընթերցումը XML ֆայլերը.) Խնդիրն այն է, որ ոչ մի վերահսկողություն չկա մակարդակից մրցույթ եւ եթե ձեր դիմումը կամ կոդ կարդում XML փաստաթուղթը, որ կա հնարավորություն, որ ՑԱՆԿԱՑԱԾ տվյալներ, այն կարող է դիտվել.

Եթե ձեր կայքը օգտագործում է XML փաստաթղթերը տվյալների պահպանման և մաքսային մուտքագրում օգտագործվում է կառուցման հարցում, ապա հնարավոր է, որ նա խոցելի է XPath ներարկման.

XPath ներարկման պաշտպանություն

  • Անհրաժեշտ է օգտագործել պարամետրացված XPath ինտերֆեյսը, եթե այն հասանելի լինի, կամ օգտագործողի մուտքից խուսափելը, որպեսզի այն ապահով կերպով ներառվի դինամիկ կերպով ստեղծված հարցումում.
  • Եթե դուք օգտագործում եք գնանշման նշաններ, դինամիկորեն ստեղծված XPath հարցման մեջ անվստահելի ներդրումը լրացնելու համար հարկավոր է նկարահանել այս մեջբերումը ոչ հուսալի ներդրման մեջ, որպեսզի այդ մեջբերված համատեքստից չկարողանան խուսափել.

Հաջորդ օրինակով մեկ մեջբերումներ (') օգտագործվում են օգտագործողի եւ գաղտնաբառի անվան պարամետրերը լրացնելու համար: Այսպիսով, մենք պետք է փոխարինենք բոլոր նիշերը այս խորհրդանիշի այս խորհրդանիշի այս մուտքային տարբերակում, կոդավորող XML- ում, այսինքն, « ’».

VB:
Dim FindUserXPath as String
FindUserXPath = "//Employee[UserName/text()='" & Request("Username").Replace("'", "'") & "' And
        Password/text()='" & Request("Password").Replace("'", "'") & "']"

C#:
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username").Replace("'", "'") + "' And
        Password/text()='" + Request("Password").Replace("'", "'") + "']";
  • Օգտագործելով նախապես `XPath1: Նախնական տեղորոշված XPath հարցումները արդեն սահմանված են այնքան ժամանակ, մինչեւ ծրագիրը կատարվի, եւ չի ստեղծվում թռիչքի վրա, օգտագործողի մուտքը լրացված է: Սա լավագույն միջոցն է, քանի որ ձեզ հարկավոր չէ անհանգստանալ խորհրդանիշի բացակայության մասին, որը պետք է պաշտպանվի.
  • Օգտագործողի մուտքը կարող է զտվել, օրինակ, մեջբերում (') կարող է փոխարինվել «» »-ով: Ստուգումը պետք է ավելացվի ինչպես հաճախորդի կողքին, այնպես էլ սերվերի կողմից.
  • Պարամետրացված հարցումների օգտագործումը (օրինակ, SQL- ում պատրաստված օպերատորներ), որոնցում հայցերը նախապես օգտագործվում են, եւ օգտագործողի մուտքը փոխանցվում է որպես պարամետրեր, այլ ոչ թե արտահայտություն.
"//users[LoginID/text()= $LoginID and passwd/text()= $password]"

Սխալների արտադրանքի ճիշտ էջերի օգտագործումը, որը չի բացահայտում որեւէ տեղեկատվություն, որը կարող է օգտագործվել հարձակվողի կողմից.