XPath Injection Attack

Инъекции бывают не только sql. На поле NoSQL тоже требуется гигиена. В частности, на поле XPath.

Допустим, данные о пользователях располагаются как-то так:

<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<username>user</username>
<password>pass</password>
<type>admin</type>
...
</user>
...
</users>

Тут plaintext password лишь для простоты, на самом деле там, разумеется, хэши. Обращение к юзеру через форму приводит к запросу:

FindUserXPath = "//User[UserName/text()='" & Request("Username") &
"' and Password/text()='" & Request("Password") & "']"

Атака

Если посетитель заполнил поля формы как-то так:

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

То запрос становится таким:

//User[(UserName/text()='blah' or 1=1) or
('a'='a' and Password/text()='blah')]

Всё, первая часть условия истинна, юзер с правами admin схвачен, атака успешна. Это уязвимость к XPath Injection.

Защита от XPath Injection

Рекомендации вполне обычные — параметризация и динамическое формирование запроса, эскейпинг и санация вводимых пользователем данных. Если бы в приведённом запросе было &apos; вместо апострофов, инъекции бы не случилось.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *