Основы безопасности: уязвимости «Внедрение кода» (RCE)
Внедрение кода (RCE) — это распространённая уязвимость в веб-приложениях, которая позволяет злоумышленнику получить контроль над всем сайтом от имени пользователя. Это возможно, потому что данные, которыми может манипулировать злоумышленник, ограничены только теми данными, к которым у него есть доступ через уязвимость.
Основная причина уязвимостей RCE заключается в том, что разработчики слишком доверяют данным, полученным от клиента, и не проверяют должным образом права доступа. Поэтому тестирование на RCE — это процесс, требующий особого внимания разработчиков.
Классификация
Перебор данных
Пример кода на PHP:
<?php
$id = @$_GET['id'];
$arr = array('1', '2', '3', '4', '5');
if(in_array($id, $arr, true))
echo "用户名:$id 密码:123456";
else
echo "信息出错";
Этот код сначала считывает значение ID из параметра URL, а затем сравнивает его с существующими значениями ID. Если совпадение найдено, то выводятся имя пользователя и пароль. В противном случае выводится сообщение об ошибке. Здесь ID — это информация, которую запрашивают, предполагается, что в системе всего пять ID. Поскольку здесь нет фильтрации, мы можем запросить любую информацию без каких-либо препятствий.
Перебор данных относится к горизонтальному внедрению кода, поскольку пользователь остаётся обычным пользователем, но становится другим обычным пользователем. Когда мы сталкиваемся со страницей, содержащей id=xxx
, мы должны обратить на неё внимание, так как здесь может быть уязвимость RCE. Мы можем протестировать её вручную, изменив id
на другое значение, или использовать функцию взлома Burp Suite для тестирования.
Скрытый бэкенд
Некоторые веб-сайты не имеют никакой проверки подлинности пользователей, вместо этого они скрывают свой бэкэнд. После скрытия в общедоступной части сайта нет ссылок на бэкэнд, но если ввести адрес напрямую, можно получить доступ к нему. Тогда мы сможем использовать сканер для обнаружения адреса бэкэнда и прямого доступа к нему.
Скрытый бэкэнд относится к вертикальному внедрению кода, так как личность пользователя не меняется, но он получает административные права.
«Обход» файлов cookie
Иногда мы можем обойти проверку файлов cookie и кода JavaScript для выполнения внедрения кода.
Рассмотрим следующий пример кода:
<!-- pass-cookie.php -->
<form action="" method="post">
<input type="text" name="name"/>
<input type="password" name="pass"/>
<input type="submit" value="登录"/>
</form>
<?php
$name=@$_POST['name'];
$pass=@$_POST['pass'];
if($name=="admin" && $pass=="admin123"){
setcookie('name','admin');
header("Location:user.php");
}
Этот фрагмент кода имитирует страницу входа, если имя пользователя — admin
, а пароль — admin123
, то файл cookie name
устанавливается в значение admin
, после чего происходит перенаправление на user.php
.
Теперь рассмотрим user.php
:
<?php
if (!isset($_COOKIE["name"])){
header("Location:past-cookie.php");
}else{
$name=$_COOKIE['name'];
echo "Welcome ".$name;
}
В этом фрагменте кода сначала проверяется наличие файла cookie name
, если его нет, происходит перенаправление обратно, иначе выводится его значение.
Проблема этого кода заключается в том, что проверка подлинности очень слабая, он просто получает значение name
, но не проверяет, кто является владельцем этого значения, и не использует базу данных для запроса. Это похоже на игру, где нам нужно нажать определённую клавишу, чтобы пройти, но мы можем пройти, нажав любую клавишу, даже случайную.
Поскольку файлы cookie контролируются пользователем, мы можем подделать одно из значений, и здесь мы будем использовать Burp Suite. Сначала настроим прокси-сервер в браузере на 127.0.0.1:8888
:
Далее откроем Burp, настроим прокси и включим режим перехвата:
Предположим, что мы не проходим через страницу входа и сразу переходим на user.php
, Burp должен показать перехваченный запрос:
Мы подделываем Cookie: name=xxx
и отправляем запрос дальше:
Успешно обошли проверку подлинности.
«Обход» JavaScript
«Обход» JavaScript означает, что все проверки выполняются на стороне клиента, например, содержимое user.php
можно изменить следующим образом:
<script>
function chkcookies()
{
var NameOfCookie="name";
var c = document.cookie.indexOf(NameOfCookie+"=");
if (c != -1)
{
return true;
alert("登录成功");
var str_html="<h1>欢迎登录本系统</h1>";
document.write(str_html);
}
else
{
alert("请不要非法访问");
location.href="past-js.php";
}
return false;
}
chkcookies();
</script>
Тогда нам не нужно изменять файлы cookie, мы просто получаем чистый текст с сервера, и после этого не интерпретируем JavaScript.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )