Перейти к содержимому


Фотография

WEB хаккинг


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 05 January 2009 - 17:17

Когда-то товаристч ДасНик создал подобную тму для обсуждения проблем бед=зопасности. чтож, тема полезная для всех WEB девелоперов.

Первый вопрос: может здесь есть какой спец который посоветует что мне сделать:

есть допустим такая переменная ( $_REQUEST['r'] = 'someApp/SomeAlias/Id' ) которая идет в класс маршрутизатора где эксплойдится и т.п. и т.д. Как обезапасить себя от того чтобы некая сволочь не запихнула чего в эту доступную строку чтобы у меня скажем не произошла какаянить сказлажопина)
I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#2 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 05 January 2009 - 17:56

есть допустим такая переменная ( $_REQUEST['r'] = 'someApp/SomeAlias/Id' ) которая идет в класс маршрутизатора где эксплойдится и т.п. и т.д. Как обезапасить себя от того чтобы некая сволочь не запихнула чего в эту доступную строку чтобы у меня скажем не произошла какаянить сказлажопина)


Все очень просто: нужно так не делать.
Любые, абсолютно любые данные, пришедшие из untrusted source, должны восприниматься, как потенциально вредоносные.

http://xkcd.com/327/

Сообщение отредактировал listener: 05 January 2009 - 17:56

You think your day was surreal? Try mine.

#3 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 05 January 2009 - 18:17

Я про то и говорю) если скажем при инициализации главного лкасса парсить все входные данные? Тобиш удалять символы:
'
"
`
и т.п.)
I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#4 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 05 January 2009 - 18:24

Это, в общем случае, не поможет, т.к. очень часто кавычки и прочие спецсимволы нужны. Нужно более ответственно подходить к проектированию, перед любой критичной операцией, основанной на данных пользователя, проверять, кто и зачем ее делает и т.д.
You think your day was surreal? Try mine.

#5 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 05 January 2009 - 18:25

допустим в URI всееее знаки припенания кроме двоеточия и точки и еще 2-х 3-х знаков вестч нехорошая. В POST можно заменять символы на соответствующий HTML код... что еще надо?
I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#6 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 05 January 2009 - 18:57

В JS есть функция escape, которя автоматом заменяет на %-коды все, кроме + (если в строке могут действительно быть плюсы, его нужно обрабатывать отдельно). В параметрах, все такие замены обработаются автоматически. В самом php есть куча функций для преобразования спецсимволом, обработки кавычек и т.д.
You think your day was surreal? Try mine.

#7 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 05 January 2009 - 19:27

Обственно да, однако яваскрипт штука легко отключаемая, а PHP даже URL обрабатывает очень очень опасно... это все нулевые символы надо парсить и т.п. сейчас почитал пару статей, наибольшее беспокойство у меня вызывают нолевые символы) как их убивать то?

Сообщение отредактировал fesor: 05 January 2009 - 19:30

I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#8 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 05 January 2009 - 19:58

Уф-ф-ф-ф... Вернемся к началу. Знаешь, как выжить в эпицентре ядерного взрыва? Не попадать в него. Проблема здесь не в PHP и не в защите от пользоваталя, а в том, что строится модель, несекьюрная, by design, а потом выискивается, какими тряпками заткнуть в ней дыры. Правильный подход, начинается с построения защищенной модели. Что должна обеспечивать система? На какие компоненты она разбивается? Какие компоненты требуют взаимодействия с пользователем? Как данные пользователя могут повлиять на работу этих компонентов? Какие последствия это окажет на другие компоненты? Зачем передавать какие-то данные в URL? Максимум, что там надо - это несколько цифр ключа текущего состояния сессии, чтобы можно было bookmark поставить (соответственно, первым делом отрезаем первые несколько символов и проверяем их по регексу на валидность - не прошло? пользователь курит бамбук). Что может передавать пользователь приложению? Можно ли без этого обойтись? Если нельзя, как это будет использоваться в дальнейшем? Как можно преобразовать эти данные, чтобы уменьшить воздействие на другие компоненты системы? The greatest programming project of all took six days; on the seventh day the programmer rested. We've been trying to debug the !@#$%* thing ever since. Moral: design before you implement
You think your day was surreal? Try mine.

#9 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 05 January 2009 - 20:16

ну вот смотри как оно у меня сейчас происходит:

$request = strip_tags( $_REQUEST['r'] )
if( isset( $_REQUEST['page'] ) AND is_numeric( $_REQUEST['page'] ) ) $page=$_REQUEST['page'];

//сия функция на основе правил маршрутизации выесняет что надо запустить, проверяет данные на валидность и выдает массив переменных
//вализация идет по паттернам типа [A-Za-z0-9_\-]
$vars = router::match_route( $request ); 
//Загрузка аппликейшена
self::loadApp( $vars['app'] );
//вызов функции аппликейшена
self::run( $vars['method'], $vars['params'] );
... чесно говоря роутер единственный компонент системы который контактирует с данными из урла, а поскольку он независит от системы и все данные парсит перед передачей - думаю трудно чего-то плохого сделать через нее.

p.s. мой способ правда небольшие ограничения дает на возможные данные пересылаемые через УРЛ но посути ничего больше чем латиница и цыферки неодлжно передаваться...

Сообщение отредактировал fesor: 05 January 2009 - 20:22

I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#10 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 05 January 2009 - 20:44

Вот-вот. Я именно об этом. Зачем передвать страницу в параметрах? Почему бы просто не сделать на нее переход? (Вовсе не обязательно, чтобы это была реальная страница: это может быть что-угодно, начиная от mod_rewrite) Зачем матчить реквест по регексу, если можно поискать его в хэше (предварительно обрезав до нужного количества символов)? Любая дополнительная сущность - это потенциально уязвимое место.
You think your day was surreal? Try mine.

#11 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 07 January 2009 - 20:29

А как ты его в хэше поищеш? p.s. А почему именно через регэксп)) есть методы и поизвращеннее)
I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#12 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 07 January 2009 - 21:59

Очень просто: набор реквестов - конечное множество. При инициализации делаем хэш, сопоставляющий каждому регексу свой хэндлер. При разборе - просто получаем $handlers[$request]. Если не нашли - нам скормили какую-то лажу. А регексы - это наше все.
You think your day was surreal? Try mine.

#13 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 08 January 2009 - 05:34

видиш ли, у меня урлы типа 'modding/tools/OpenIV/relised-version-page-3.html' парсится посредствам эксплойдов и одного регекса для вызова функции show_post( 'relised_version', 3 ); которая вызывает показ поста с коментами на 3-ей странице... и парсить регексом такие ссылки было сложнова-то... тобиш я недолюбливаю регулярные выражения)) Поэтому несколько експлоудов и мааааленькая проверка на валидность... определяет за 0,0003 секунды что мне нормально. У меня лимит в 0,01... короче меня все устраивает) но я всеже пока недоверяю себе и какомунить доброму хацкеру надо будет проверить его на безопасность))
I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#14 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 08 January 2009 - 08:19

Предположительно, у нас несколько разные представления о сложных регексах.
Для меня, например, вот такой регекс имеет среднюю сложность:

$this->LONGREGEXP = 
"/(".
"\xa5\xa5.*?\xa5\xa5|".($this->object->GetConfigValue("allow_rawhtml")==1?"\<\#.*?\#\>|":"").
"\(\?(\S+?)([ \t]+([^\n]+?))?\?\)|".
($this->object->GetConfigValue("disable_bracketslinks")==1?"":
 "\[\[(\S+?)([ \t]+([^\n]+?))?\]\]|\(\((\S+?)([ \t]+([^\n]+?))?\)\)|"
).
"\^\^\S*?\^\^|vv\S*?vv|".
"\n[ \t]*>+[^\n]*|".
"<\[.*?\]>|".
"\+\+\S\+\+|\+\+(\S[^\n]*?\S)\+\+|".
"\b[[:alpha:]]+:\/\/\S+|mailto\:[[:alnum:]\-\_\.]+\@[[:alnum:]\-\_\.]+|\?\?\S\?\?|\?\?(\S.*?\S)\?\?|".
"\\\\\\\\[".$object->language["ALPHANUM_P"]."\-\_\\\!\.]+|".
"\*\*[^\n]*?\*\*|\#\#[^\n]*?\#\#|\№\№[^\n]*?\№\№|\'\'.*?\'\'|\!\!\S\!\!|\!\!(\S.*?\S)\!\!|__[^\n]*?__|".
"\xA4\xA4\S\xA4\xA4|\xA3\xA3\S\xA3\xA3|\xA4\xA4(\S.*?\S)\xA4\xA4|\xA3\xA3(\S.*?\S)\xA3\xA3|".
"\#\|\||\#\||\|\|\#|\|\#|\|\|.*?\|\||".
"<|>|\/\/[^\n]*?(?<!http:|https:|ftp:|file:|nntp:)\/\/|".
"\n[ \t]*=======.*?={2,7}|\n[ \t]*======.*?={2,7}|\n[ \t]*=====.*?={2,7}|\n[ \t]*====.*?={2,7}|\n[ \t]*===.*?={2,7}|\n[ \t]*==.*?={2,7}|".
"[-]{4,}|---\n?\s*|--\S--|--(\S.*?[^- \t\n\r])--|".
"\n(\t+|([ ]{2})+)((?:\[|\()([-= xX.+]|(%1?[0-9]{1,2}%))(?:\)|\]))[^\n$]*(?=\n|$)|". // |(1?[0-9]{1,2})
"\n(\t+|([ ]{2})+)(-|\*|([a-zA-Z]|([0-9]{1,3}))[\.\)](\#[0-9]{1,3})?)?|".
"\b[[:alnum:]]+[:][".$object->language["ALPHANUM_P"]."\!\.][".$object->language["ALPHANUM_P"]."\-\_\.\+\&\=\#]+|".
"~([^ \t\n]+)|".
($this->object->GetConfigValue("disable_tikilinks")==1?
 "":"\b(".$object->language["UPPER"].$object->language["LOWER"].$object->language["ALPHANUM"]."*\.".$object->language["ALPHA"].$object->language["ALPHANUM"]."+)\b|").
($this->object->GetConfigValue("disable_wikilinks")==1?
 "":"(~?)(?<=[^\.".$object->language["ALPHANUM_P"]."]|^)(((\.\.|!)?\/)?".$object->language["UPPER"].$object->language["LOWER"]."+".$object->language["UPPERNUM"].$object->language["ALPHANUM"]."*)\b|").
($this->object->GetConfigValue("disable_npjlinks")==1?
 "":"(~?)".$object->language["ALPHANUM"]."+\@".$object->language["ALPHA"]."*(?!".$object->language["ALPHANUM"]."*\.".$object->language["ALPHANUM"]."+)(\:".$object->language["ALPHANUM"]."*)?|".$object->language["ALPHANUM"]."+\:\:".$object->language["ALPHANUM"]."+|").
"\n)/sm";

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

В твоем же случае, перемешиваются страницы, ЧПУ и действия.
Обычно делается проще: внутри системы, странице назначается ID. Снаружи, она видна под некоторым путем (и может быть видна под ID). Соответствие пути и ID хранится в базе (или в любом другом хранилище данных).
Получив путь, мы получаем из базы id (предварительно, возможно, вытащив из него какую-либо дополнительную информацию, например, действие). Все укладывается в десять строчек (с запасом), при этом половина "криминальных" действий (например, зайти "куда-то не туда") невозможна в силу организации информации. Еще процентов десять всех атак проваливаются по той причине, что URL не имеет ничего общего с реальной организацией информации.
You think your day was surreal? Try mine.

#15 fesor

fesor

    Активный участник

  • Пользователи
  • PipPipPip
  • 70 сообщений
  • Пол:Мужчина
  • Город:Беларусь, Минск
  • Интересы:Девушки, Пиво, WEB програмирование, 3D и 2D графика, Музыка

Отправлено 09 January 2009 - 19:21

http://pastebin.ca/1304480 - это парвая версия моего примитивного роутера)) если хочеш можеш посмотреть))

p.s. единственное место в урле откуда я беру информацию - $_REQUEST['r']; Ничто больше неиспользуется.

------------------

а так вот структура приложения:

контроллер:
class PagesController
{
	
	function showPage($name)
	{
		if( ($data = model::execute( 'get_page', array('name'=>$name) ) ) !==false )
		{
			//Даем возможность шаблонизатору скомпилить кэш и указываем исключения
			view::setCacheable( array('views') );
			//view::setCacheLifeTime( '3600' );
			//Шаблонизатор парсит шаблон))
			view::make( 'page', $data );
			//Connect Comments
			core::loadAPP( 'comments' );
			//Запускаем функцию для вывода комментов где надо с 1-ой страницы
			core::run( 'show_comments', array( 'pages', $data['id']['val'], 1 ) );
		}
		else
		{
			view::error( 'No page found! Please, kill yourself against the wall!' );
		}
	}

}

поскольку нам ненадо ничего обрабатывать в этом приложении класса модели нету, хватит мэппера

модели или мэпперы
;get_page.ini

table = pages
resources = id, title, page, views, coms
[id]
system=true
[name]
system=true
value=ctrl.name

Сообщение отредактировал fesor: 09 January 2009 - 21:36

I am lexx! The the most powerful weapon of destruction in the universe and I have the power to destroy entire planets. © Lexx fesor's<dog>gmail.com

#16 Akmal

Akmal

    Активный участник

  • Пользователи
  • PipPipPip
  • 256 сообщений
  • Пол:Мужчина
  • Город:Kazakhstan\UKO

Отправлено 18 April 2009 - 19:18

можна ли както поставить себе запрет на пользование системой восстановление пассов на мейле?
Asus P5KC/Asus EN8800 GTS 512/2GB PQI 800Mhz/HDD500+400+120/BP 500W

#17 Akmal

Akmal

    Активный участник

  • Пользователи
  • PipPipPip
  • 256 сообщений
  • Пол:Мужчина
  • Город:Kazakhstan\UKO

Отправлено 01 January 2010 - 13:27

Чуваки,помогите мне выдрать емейлы из этого файла,плиз
http://ifolder.ru/15746221
Asus P5KC/Asus EN8800 GTS 512/2GB PQI 800Mhz/HDD500+400+120/BP 500W

#18 Akmal

Akmal

    Активный участник

  • Пользователи
  • PipPipPip
  • 256 сообщений
  • Пол:Мужчина
  • Город:Kazakhstan\UKO

Отправлено 25 April 2010 - 09:29

Слушайте,кто ставил ИПБ версии 3? У меня застревает установка на 10 шаге =install&section=install&do=acphelp,ошибка работа с базой данных,бла бла. Что идет после
=install&section=install&do=acphelp
?
Asus P5KC/Asus EN8800 GTS 512/2GB PQI 800Mhz/HDD500+400+120/BP 500W

#19 Lego

Lego

    Активный участник

  • Пользователи
  • PipPipPip
  • 343 сообщений
  • Пол:Не определился


Отправлено 25 April 2010 - 18:22

я ставил на локалхосте. хз, ща гляну...

case 'acphelp':
$this->_stepCount = 11;
$this->install_acphelp();
break;

case 'other':
$this->_stepCount = 12;
$this->install_other();
break;

case 'caches':
$this->_stepCount = 13;
$this->install_caches();
break;


а вообще, скорее всего у тебя криво сломанная версия просто. поищи другую что ли

Сообщение отредактировал Lego: 25 April 2010 - 18:24





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных