Всем привет, есть такой скрипт, записывает логи. Недавно у знакомого слили через него сайт, но как обошли фильтр, мы не поняли(Оба знаем sql как прикладной язык). PHP: $crash = clear($_POST['crash']);$db->insert("INSERT INTO `crashlogs` (id,name,crash,time) VALUES (NULL,'$user','$crash','".time()."')");function clear($s1){ $s1 = str_replace("\\",'/',$s1); return str_replace(array("'",'"','\\','<','>','$','%'),'',$s1); } Функция insert в себе фильтрации не несёт Если кто сможет подсказать, буду очень благодарен. ps: $user ограничен по длине в 20 символов.
Почему решили, что именно этот код поспсобствовал сливу? Кто и для чего читает эти логи? Не видно что есть $user и т.д. Если не брать кучу неизвестных в расчёт, то возможно как-то так: Code: user=vasyans\ crash=,version(),1549180652)# Code: INSERT INTO `crashlogs` (id,name,crash,time) VALUES (NULL,'vasyans\',',version(),1549180652)#','1549180652')
Злоумышленники дропнули таблицу crashlogs. Тестировал sqlmap'ом дыру - он крутит как error based, stacked query, но потом говорит, что это ложноположительное срабатывание.. По логам было всё примерно так: 00:00 - Отправленно ~4000 запросов на данный скрипт. 0:15 - Зашли уже в pma, через pma залили шелл. 0:18 -Дропнули таблицу crashlogs. Сам сайт на dle(10.0), с pma и mysql понятно всё. Знакомый не обновляется, а база от root'а работала. Весь скрипт: PHP: <?phpdefine('INCLUDE_CHECK',true);include 'connect.php';if(!isset($_GET['user']) or !isset($_POST['crash'])) die();$user = clear($_GET['user']);if(strlen($user) >20) die();if(c($crash,"Pixel format not accelerated")){ echo "Игра не запустилась.\r\nОшибка при поиске видеокарты!\r\nПожалуйста, переустановите драйвера видеокарты!";}if(c($crash,"Cant load library")){ echo "Попробуйте отключить антивирус!";}if(c($crash,"Cant find dependent libraries")){ echo "Установите компоненты VisualC++.";}if(c($crash,"OutOfMemory")){ echo "Не хватает ОЗУ для игры!\r\nПожалуйста, выберите больше 768мб.";}if(strlen($crash)>100000) die();$db->insert("INSERT INTO `crashlogs` (id,name,crash,time) VALUES (NULL,'$user','$crash','".time()."')"); function clear($s1){ $s1 = str_replace("\\",'/',$s1); return str_replace(array("'",'"','\\','<','>','$','%'),'',$s1); } function c($s1,$s2){ if (strpos($s1,$s2) !== false) { return true; } return false; }?>
А где $crash = clear($_POST['crash']); ? В общем, если обе переменные проходят через clear, инъекции нет.
К сожалению у него не логируются ip, всё localhost, но видно отчётливо, что гоняли сайт acunetix'ом.. Было дело ещё в ноябре, но он там что-то сам пытался найти, но не вышло. PS: База у него от рута работала ещё, был pma, шелл точно через mysql влили. Логи за тот день: https://yadi.sk/d/KKBu4uj3y0fl6A Сам сайт на dle, 10 версия. Форум bullet energy, модули чистые, всё смотрели, всё экранируется..
Логи очень сильно засраны акунетиксом, сходу сказать сложно. По хорошему, нужно проводить аудит проекта. Если сервис профитный, наймите специалиста (пр. @winstrool), т.к. незванный гость мог оставить подарочков себе на будущее Я бы небыл так уверен, беглый осмотр логов показал наличие Directory Traversal в некоторых скриптах: Code: /viewskin.php?skin=../../../../../../../../../../../etc/hosts // true /viewskin.php?skin=../../../../../../../../../../../etc/hostsx // false /viewcloak.php?skin=../../../../../../../../../../../etc/hosts // true /viewcloak.php?skin=../../../../../../../../../../../etc/hostsx // false Так же phpmyadmin лежит не по старндартному пути, нафазить такое сложно, поэтому не факт что именно скуля послужила точкой проникновения.
Да. Вот меня тоже удивило.. В pma зашли и всё... Вот как знали прям) По поводу аудита, предложил ему, он возможно возьмёт) Там всё старое как дерьмо мамонта, pma - старый, mysql - старый.. Тем более база у него от рута работает