RDot

RDot (https://rdot.org/forum/index.php)
-   Аудит Web-приложений/Web Application Security Audit (https://rdot.org/forum/forumdisplay.php?f=27)
-   -   Аудит сайта на самописной системе управления (https://rdot.org/forum/showthread.php?t=1412)

CrazyPilot 19.04.2011 10:54

Аудит сайта на самописной системе управления
 
Добрый день! Прошу проверить безопасность сайта, сделан на самописном двжике.

До этого сайт выкладывался и был взломан, но тему закрыли из-за нарушения нектороых правил (не было ссылки на этот форум).

Некоторые дыры залатал и выложил на тестовом домене cph.su . Теперь ссылка на ваш форум есть - ломайте на здоровье :) Заранее спасибо за помощь.

it's my 19.04.2011 16:09

Код:

POST: manufacturer=(0)or(select(count(*))from(pers_catalog_items)group/*test*/by(concat((select(concat_ws(0x3a,login,password))from(pers_admins)),0x00,floor(rand(0)*2))))
пасс админа: asdklfju78o4ij

хахаха, так дела не делаются ))
PHP код:

public static function StopInjections(){
            
$get_ar array_values($_GET);
            
$c_a_g count($get_ar);
            for (
$i 0;$i $c_a_g;$i++){
                if(
eregi('union(.*)select',$get_ar[$i]))
                    
self::Err404();
                if(
eregi('order(.*)by',$get_ar[$i]))
                    
self::Err404();
            }
            
            
$post_ar array_values($_POST);
            
$c_a_p count($post_ar);
            for (
$i 0;$i $c_a_p;$i++){
                if(
eregi('union(.*)select',$post_ar[$i]))
                    
self::Err404();
                if(
eregi('order(.*)by',$post_ar[$i]))
                    
self::Err404();
            }
        } 


it's my 19.04.2011 16:30

Ах да, и в админке есть кнопка "Залить шелл", находится она в загрузке документов, я бы ограничил загрузку файлов с ненужным тебе расширением :)


и еще xss
http://cph.su/index.php?module=%3Cscript%3Ealert()%3C/script%3E

/* тут был кусок кода, и мне показалось что там бага, но дальше по функциям это поправляется, тупанул ) */

ну и на последок, в админке что не переменная то скуля :)
и думаю там еще много баг, код правда в некоторых местах странный, и коменты местами жгут )))

CrazyPilot 19.04.2011 17:25

По поводу инъекций, для фронтэнда достаточно было бы все переменные в sql-запросе заключить в апострофы + addslashes?
Вот как раз у manufacturer не было апострофов :(
Идея с регулярками совсем безнадежна? Нужно ведь что-то, чтобы подстраховаться от забытых кавычек.

nobody 19.04.2011 17:34

Цитата:

Сообщение от CrazyPilot (Сообщение 16115)
По поводу инъекций, для фронтэнда достаточно было бы все переменные в sql-запросе заключить в апострофы + addslashes?

не надо в тупую жарить аддслешес на всё, нормально проверяй переменные, инты - (int) или intval. стринги - mysql_real_escape_string((string)$var)

Цитата:

Сообщение от CrazyPilot (Сообщение 16115)
Идея с регулярками совсем безнадежна? Нужно ведь что-то, чтобы подстраховаться от забытых кавычек.

Может и не безнадежна, но совершенно глупая

Цитата:

Сообщение от Jokester (Сообщение 16119)
А по простому - не суй её в условия, для проверки.

+ в запросе оператор лимит всегда берем по модулю =)

Jokester 19.04.2011 17:59

CrazyPilot
Регулярки это зло однозначно. Если не знаешь все тонкости, даже не пытайся. Обработака переменных по типу, как написал nobody.
addslashes и строковые в кавычках спасут от скулей, если нет мультибайтовых кодировок:
http://raz0r.name/vulnerabilities/sql-inekcii-svyazannye-s-multibajtovymi-kodirovkami-i-addslashes/

Твои с eregi это вообще ниочём, они срубятся %00 даже если будут грамотно всё фильтровать.
+ в новых версиях пыха их вообще поубирали, будешь переписывать движок потом?

PS Кстати intval тоже имеет свои "тонкости" . Юзать только с полным осознанием логики работы :)
А по простому - не суй её в условия, для проверки.

CrazyPilot 19.04.2011 18:13

Спасибо большое! Сейчас буду исправлять.
Еще вопрос: перед mysql_real_escape_string критично приводить переменную к строковому типу?
Когда mysql_real_escape_string($var) пропустит скуль (что нужно в $var передать)?

Jokester 19.04.2011 18:26

http://www.php.ru/manual/function.mktime/function.mysql-real-escape-string.html

внизу есть пример работы
function quote_smart

nobody 19.04.2011 18:37

ну почти правильная функция =)
is_numeric пропускает и строки в хексе (0xc0d3 например), а функция при таком раскладе в кавычки не берет - не гуд
а приводить к стрингу всёравно надо, т.к. mysql_real_escape_string плюется ворнингами если передать в него массив или объект (?var[]=)

CrazyPilot 19.04.2011 18:46

То есть, правильнее будет использовать quote_smart() для строк, и простой intval() для интов?
Хотя можно просто убрать проверку на is_numeric() - все переменные заключать в кавычки - для интов это тоже не криминал.

Qwazar 19.04.2011 19:18

CrazyPilot, правильнее mysql_real_escape_string для строк. Для интов либо intval, либо используй приведение типов $id = (int)$_GET['id'];

З.Ы.
А error_reporting вообще выруби наглухо в .htaccess, когда отдебажишь.

Jokester 19.04.2011 19:50

Вспомнилось для int

$a = 0+$GLOBALS['a'];

PS Всерьёз не воспринимать, привет админу одного из хакфорумов :)

C3 ~ RET 20.04.2011 00:20

Одним из наиболее эффективных методов защиты считается использование параметризованных команд (prepared statements).
Фильтрация с помощью регулярок тоже допустима, но только если есть однозначное понимание кода. Само собой, символы a la . не должны присутствовать в фильтре. Как было указано выше - приведение типов не должно использоваться при формировании условий. В PHP > 5.0 эффективным является использование mysqli_prepare. В случае использования PEAR возможно использование DB_common::prepare() и DB_common::query()

Qwazar 20.04.2011 00:39

Jokester, кстати твой вариант вполне норм вариант.
C3 ~ RET, можно конечно перепилить всю архитектуру приложения целиком, но способ предложенный остальными проще и требует куда меньшего количества правок, чем твой.

C3 ~ RET 20.04.2011 00:49

Всё верно, камрад. Я не говорил о скорости, я говорил о результативности. Как пел Тальков - "скорость нужна при ловле блох".

P. S. если вчитаться внимательно в то, о чем я пишу, то можно понять, что упомянутое тобой "переписывание" у меня проходит как "в случае использования", а PHP 5 сейчас почти везде и функции, им реализуемые, соответственно, доступны без заморочек.

Qwazar 20.04.2011 00:54

Цитата:

Сообщение от C3 ~ RET (Сообщение 16152)
Всё верно, камрад. Я не говорил о скорости, я говорил о результативности. Как пел Тальков - "скорость нужна при ловле блох".

P. S. если вчитаться внимательно в то, о чем я пишу, то можно понять, что упомянутое тобой "переписывание" у меня проходит как "в случае использования", а PHP 5 сейчас почти везде и функции, им реализуемые, соответственно, доступны без заморочек.

Это всё клёво конечно, я бы тоже советовал использовать prepeared statements, если бы проект писался бы с нуля, но в данном случае куда проще и удобнее, исправить баги по старинке. В данном случае, никаких преимуществ использование PDO не даст. (А времени у программиста отнимет порядочно)

C3 ~ RET 20.04.2011 01:02

Если человек задается вопросом обеспечения безопасности, то он понимает, что главное - результат. А не процесс. Очевидно, что переход на 5ую ветку (а я уверен, что 5ая ветка там уже) не представляет собой особых проблем (если это не так, то во-первых нет никакого смысла думать о фильтрации при наличии множества других ошибок в самом PHP 4, а во-вторых сам процесс миграции детально описан здесь - http://www.php.ru/manual/function.include/faq.migration5.html) и замена множества действий, таких как объявление переменной, приведение типа значения, проверка условия, вставка в запрос явно длиннее, чем задание переменной и использование ее в prepared statement

Qwazar 20.04.2011 01:02

При чём тут миграция? Я о том, что ему куда больше правок придётся вносить в код, при отсутствии каких либо значимых преимуществ.

C3 ~ RET 20.04.2011 01:04

Цитата:

Сообщение от Qwazar (Сообщение 16156)
При чём тут миграция? Я о том, что ему куда больше правок придётся вносить в код, при отсутствии каких либо значимых преимуществ.

См. мой пост выше, пор фаворе. Там сопоставлено кол-во строк в коде для фильтрации твоим способом "по-старинке", и при помощи альтернативного современного способа prepared statement.

Qwazar 20.04.2011 01:09

Цитата:

Сообщение от C3 ~ RET (Сообщение 16157)
См. мой пост выше, пор фаворе. Там сопоставлено кол-во строк в коде для фильтрации твоим способом "по-старинке", и при помощи альтернативного современного способа prepared statement.

Ладно, проехали. Ты о чём то другом разговариваешь.

C3 ~ RET 20.04.2011 01:16

Цитата:

Сообщение от Qwazar (Сообщение 16158)
Ладно, проехали. Ты о чём то другом разговариваешь.

Почему же о другом? Очень даже не о другом. Есть 3 способа фикса ошибок:

1) Наложение костылей;
2) Изменение концепции;
3) Отказ от признания ошибки.

1 подход не результативен в силу появления ошибок в самих костылях - пример тому - Microsoft Windows со своими патчами. 2 подход тоже не без греха, однако в силу единства концепции подразумевает изначально меньшее число потенциальных ошибок. 3 подход очевиден - не умеешь признавать ошибки - и патчишь как тебе вздумается или вообще не патчишь. И то и другое - пагубно.

CrazyPilot 20.04.2011 13:46

Обновил сайт на http://cph.su.
Надеюсь, теперь взломать будет сложнее.
Оборону усилил, жду новых "набегов":) Заранее спасибо:)

Raz0r 20.04.2011 22:51

Судя по коду, админу в любом случае придется учиться писать грамотный код, поэтому советую ТС разобраться с PDO/DbSimple/etc и по мере возможности начать использовать в продакшне именно prepared statements.
Но сначала необходимо разобраться с типами данных, понять почему в той или иной ситуации возможны инъекции и как от них избавиться средствами чистого PHP.

CrazyPilot 21.04.2011 09:25

Вам удалось взломать? Если да, то прошу отписаться в личку, как вы это сделали)

CrazyPilot 21.04.2011 12:09

Цитата:

Сообщение от Raz0r (Сообщение 16202)
Судя по коду, админу в любом случае придется учиться писать грамотный код

Если речь идет о коде с eregi, который был выложен в самом начале темы, то он был размещен в движке прямо перед размещением ссылки на вашем форуме, в надежде хоть как-то защититься. С тем, что этот код совершенно бесполезный, я полностью убедился :)

Про prepared statements - согласен, нужно переходить на них, но это занимает много вермени, так уже достаточно много кода реализовано на обертках к стандартному mysql_query. Со временем перейду на mysqli.
Но сейчас все переменные фильтруются, Позаботился о том, чтобы в новых скриптах было тяжело забыть отфильтровать переменную ( из POST / GET запроса переменная берется с помощью специальной функции, добавил туда обязательным параметром метод фильтрации).

che 22.05.2011 23:11

Цитата:

Сообщение от Jokester (Сообщение 16128)
Вспомнилось для int

$a = 0+$GLOBALS['a'];

PS Всерьёз не воспринимать, привет админу одного из хакфорумов :)

а можно подробнее, чё то я не вкурил :(

Jokester 23.05.2011 00:38

Цитата:

Сообщение от che (Сообщение 16923)
а можно подробнее, чё то я не вкурил :(

Ну это приведение к инт. Вобщем-то обойти не удалось, так что безопасно, а стёб по поводу самой реализации )

che 23.05.2011 02:24

Цитата:

Сообщение от Jokester (Сообщение 16927)
Ну это приведение к инт. Вобщем-то обойти не удалось, так что безопасно, а стёб по поводу самой реализации )

блин я то думал что как то обходится, а такие костыли я встречал $league = $league *1; выглядит не очень но помогает

shaitanych 30.05.2011 18:19

Цитата:

$league = $league *1;
а вот такое действия защищает ли ?

che 05.06.2011 23:54

Цитата:

Сообщение от shaitanych (Сообщение 17130)
а вот такое действия защищает ли ?

а ты проверь и узнаешь, если получится дам ссылку где этот код стоит много трафа поимеешь :)

AKYLA 05.10.2011 19:57

При Пост запросе /users/profile/
Уязвим параметр куки add_link
Цитата:

add_link=134"/><script>alert(204389)</script>;
Вылазят ошибки и раскрытие путей, по поводу скули не знаю, крутиться или нет
Цитата:

http://cph.su/scripts/girls/girls_go.php?type='
http://cph.su/index.php?name%5B%5D=1


Часовой пояс GMT +3, время: 18:00.

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