На сегодняшний день широкой общественности известен единственный boolean-based метод обнаружения и эксплуатации XPath/XQuery injection. В то же время XPath и XQuery — самые распространенные языки для работы с данными в формате XML. Поэтому, чтобы исправить такую несправедливость, я расскажу о других техниках обнаружения и эксплуатации XPath/XQuery injection.

Уязвимости класса injection — одни из наиболее популярных и особо опасных. Об этом свидетельствует их упоминание во всех редакциях OWASP Top 10. XPath/XQuery injection служат характерными примерами таких уязвимостей. Их краткое описание доступно на сайте WASC в разделе Threat Classification.

Сегодня я ограничусь исследованием уязвимостей этого класса в области веб-приложений для баз данных, основанных на XQuery. Все рассматриваемые методы были найдены при анализе стандартов языков XPath и XQuery и проверены на существующих базах данных.

 

Union-based

Первый метод, о котором сегодня пойдет речь, получил свое название из-за использования операции объединения запросов |. Для его применения необходимо, чтобы результат уязвимого запроса от веб-приложения к базе данных отображался в браузере пользователя. В этом случае можно попытаться заменить данные, которые запрашивает веб-приложение, на другие. Например, на содержимое всех текстовых узлов XML-документа, с которым сейчас работает приложение. Ниже приведен листинг кода веб-приложения, уязвимого для данного метода.

<?php
ini_set('display_errors',0);

    # Подключение API базы данных BaseX
include("BaseXClient.php");

class DB {
    # Параметры подключения к базе данных
    protected $host        = 'localhost';
    protected $port        = '1984';
    protected $database    = 'tests';
    protected $user         = 'admin';
    protected $password     = 'admin';
    protected $session    = null;

    public function connect()
    {
        $this->session = new Session($this->host, $this->port, $this->user, $this->password);
        $this->session->execute("open ".$this->database);
    }

    public function select($param)
    {
        $input = 'for $i in doc("tests/news.xml")//News[@ID="'.$param.'"]'.
        '/info/text() return <h3> {$i} </h3>';

        $query = $this->session->query($input);
        while($query->more()) {
            print $query->next()."\n";
        }
        $query->close();
    }

    public function exit_db()
    {
        $this->session->close();
    }
}

# Получение пользовательских данных
if(($param = $_GET["id"]) == null)
{
     print "<h3>try use id parameter for access to info</h3>";
    exit;
}

$db = new DB();
$db->connect();
# Вызов уязвимой функции
$db->select($param);
$db->exit_db();
?>

Стоит заметить, что данный пример уязвим также для boolean-based метода. В нем отсутствует проверка входных данных для параметра id GET-запроса. В ходе выполнения кода вызывается функция select, которая содержит запрос к news.xml из базы данных tests. Содержимое news.xml приведено ниже:

<Root>
    <News ID="1">
        <info>British people are my only 'boss' on EU reform, says David Cameron</info>
    </News>
    <News ID="2">
        <info>BoE says part of banking payment system down</info>
    </News>
    …
</Root>

Эксплуатация union-based метода заключается во внедрении конструкции 0 and 1=0] | //* | /*[0. Для запроса, приведенного в примере, она будет иметь следующий вид: 0" and 1=0] | //* | /*["0. При подстановке в запрос этой конструкции он разобьется на три других запроса, из которых первый и последний не вернут ничего. Второй запрос, имеющий вид //*, вернет содержимое всех XML-документов, доступных пользователю, из-под которого приложение работает базой.

Результат эксплуатации union-based метода
Результат эксплуатации union-based метода
 

Time-based

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


1 комментарий

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Что можно сделать с iPhone, зная пасскод. Как сливают данные, уводят iCloud и блокируют остальные устройства

Последние несколько месяцев мы много писали о нововведениях в iOS 11. «Теперь-то заживем!»…