XQuery инъекция
XQuery-инъекция является чрезвычайно опасным методом атак на XML приложения. Своего рода это SQL-инъекция только в XML. Как и в SQL, основной задачей инъекции ялвяется нарушение логики запроса. Возникнуть это может в результате недостаточной фильтрации входящих данных от пользователя. Даже одна единственная ошибка может позволить злоумышленнику выполнять произвольные запросы и команды на сервере. Более подробную информацию про инъекции кода можно узнать в других статьях или же на форуме программистов http://www.cyberforum.ru/.
Для примера рассмотрим следующий XML-документ:
<?xml version="1.0" encoding="ISO-8859-1"?> <userlist> <user category="group1"> <uname>jpublic</uname> <fname>john</fname> <lname>public</lname> <status>good</status> </user> <user category="admin"> <uname>jdoe</uname> <fname>john</fname> <lname>doe</lname> <status>good</status> </user> <user category="group2"> <uname>mjane</uname> <fname>mary</fname> <lname>jane</lname> <status>good</status> </user> <user category="group1"> <uname>anormal</uname> <fname>abby</fname> <lname>normal</lname> <status>revoked</status> </user> </userlist>
Типичный XQuery запрос для данного документа может выглядеть так:
doc("users.xml")/userlist/user[uname="mjane"]
Результатом выполнения такого запроса будет:
<user category="group2"> <uname>mjane</uname> <fname>mary</fname> <lname>jane</lname> <status>good</status> </user>
Это может быть использовано при выводе информации в личном кабинете пользователя. Предполагается, что переменная uname получена от пользователя. При отсутствии фильтрации пользователь может ввести что-то типо:
something" or "1"="1
В итоге XQuery запрос превращается в:
doc("users.xml")/userlist/user[uname="something" or "1"="1"]
Так как конструкция запроса уже нарушена и 1 всегда равно 1, то запрос посчитает это условие истиной и вернет все строки таблицы. Опасность заключается в том, что находясь в своем личном кабинете, злоумышленник может просмотреть не только свой номер кредитной карты, но реквизиты других пользователей системы.
Защитится от данной уязвимости можно с помощью фильтрации переменных, приходящих от пользователя. Однако об этом в следующей статье.