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=1763)

Demon1X 24.10.2011 09:39

Веб-кабинет
 
Доброго времени суток.

Товарищ решил в качестве дипломной работы написать биллинг на делфи. В веб-программирование он шарит на уровне <h1>Hello world!</h1>, по этому попросил меня написать ему веб-кабинет к его биллингу. Я кабинетов до этого не писал, по этому задача показалась интересной.

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


Скачать файл cabinet.zip

Файлы кабинета, с дампом БД MySQL. В БД три пользователя: 2 активированных (root и oldroot у обоих пароли 123456) и один не активированный, ключ для активации 777778888899999


UPD

Скачать файл cabinet-1.1.zip
Прикрутил защиту от XSRF и добавил проверку текущего пароля при смене пароля, плюс мелкие изменения по функционалу.

UPD
Скачать файл cabinet-1.3.zip
Пожалуй финальная версия. Добавлен функционал, некоторые моменты оптимизированы, плюс обработка всего вывода.

AKYLA 29.10.2011 18:33

Никаких уязвимостей нет, кроме как
1) не меняется идентификатор сессии, т.е. если иметь идентификатор, то потом можно водить не имея логина и пароля

2) index.php?email[]=1
Раскрытие путей

Нет защиты от брута входа в систему

ont 29.10.2011 19:26

Цитата:

Сообщение от AKYLA (Сообщение 21075)
Никаких уязвимостей нет, кроме как...

Врете, самую веселую пропустили -- CSRF (Cross Site Request Forgery).
Когда пользователю подсунут страничку с таким тегом:
PHP код:

<img src="http://cabinet_site.com/index.php?pass1=newpassword&pass2=newpassword&updpass=yes_change_me" /> 

... у него сменится пароль.

Нужно либо старый пароль спрашивать, либо делать секретное рандомное поле.

Через CSRF там еще много чем можно управлять. Ну и XSS наблюдаются:
PHP код:

    echo "Логин: ".$login."<br>"

Нужно использовать htmlspecialchars.

M_script 30.10.2011 14:17

Цитата:

Сообщение от ont
Нужно либо старый пароль спрашивать, либо делать секретное рандомное поле.

При смене пароля на новый должна быть обязательная проверка предыдущего. Не только для защиты от CSRF.

M@ZAX@KEP 30.10.2011 15:24

Вопрос от юного двигописателя...
Цитата:

не меняется идентификатор сессии, т.е. если иметь идентификатор, то потом можно водить не имея логина и пароля
Является ли привязка по ip достаточной мерой для защиты сессии? Есть ли смысл делать таймаут для сессии? (если да, то что принципиального это изменит?)

Demon1X 01.11.2011 09:47

Цитата:

Врете, самую веселую пропустили -- CSRF (Cross Site Request Forgery).
О XSRF уязвимостях плохо знал, по этому пропустил. Пришлось на днях подтянуть знания по этому типу уязвимостей, написал даже мини-эксплойт для кабинетика )))

Проверку старого пароля хотел изначально приделать, но решил пойти по пути большего юзерфрендли, как вижу ошибался не стоило этого делать.


Цитата:

Через CSRF там еще много чем можно управлять. Ну и XSS наблюдаются:
Код:

    echo "Логин: ".$login."<br>";

Логин выводится только собственно юзеру авторизованному, и не кому больше, по этому считаю дополнительную обработку через htmlspecialchars() излишней.


Цитата:

2) index.php?email[]=1
Раскрытие путей

Нет защиты от брута входа в систему
У меня так и не получилось получить раскрытие путей, к тому же раскрытие, если я правильно понимаю, устраняется отключением вывода ошибок в браузер пользователю, как собственно и будет настроен php в случае реальной работы кабинета, а не отладки.

В качестве защиты от брута — возможность установить в конфиге вход в кабинет только с IP юзера. Плюс установить длину пароля приемлемую там же.


Цитата:

Не меняется идентификатор сессии, т.е. если иметь идентификатор, то потом можно водить не имея логина и пароля.
Не совсем понял. Сессия на то и сессия, чтоб пользователь не вводил каждый раз свой логин и пароль для каждого действия. Уничтожается по закрытию браузера, или по нажатию «Выход» из кабинета. Как дополнительную защиту можно будет установить продолжительность жизни сессии в 5 минут.

M@ZAX@KEP 01.11.2011 12:17

Цитата:

У меня так и не получилось получить раскрытие путей, к тому же раскрытие, если я правильно понимаю, устраняется отключением вывода ошибок в браузер пользователю, как собственно и будет настроен php в случае реальной работы кабинета, а не отладки.
На что нужно рассчитывать в последнюю очередь, так это на конфигурацию серверов. Грамотный код должен быть неуязвим при любом раскладе конфигов.

BlackFan 01.11.2011 12:28

Цитата:

Сообщение от Demon1X (Сообщение 21139)
Логин выводится только собственно юзеру авторизованному, и не кому больше, по этому считаю дополнительную обработку через htmlspecialchars() излишней.

Бедный пользователь с ником <!-- , как же тяжко ему будет пользоваться этим кабинетом :(

tipsy 01.11.2011 13:38

Цитата:

Сообщение от BlackFan (Сообщение 21146)
Бедный пользователь с ником <!-- , как же тяжко ему будет пользоваться этим кабинетом :(

Даже больше.
1) Делаем пользователя с именем <script src=…>, в js делаем фэйк страницу авторизации.
2 Деавторизуем админа и делаем ему session fixation на нашего xss-пользователя.
3) Админ заходит в веб-кабинет
4) …
5) Profit!

M_script 01.11.2011 21:12

Цитата:

Сообщение от tipsy
2 Деавторизуем админа и делаем ему session fixation на нашего xss-пользователя.

Demon1X: "Логин выводится только собственно юзеру авторизованному, и не кому больше"

Как мы деавторизуем админа, если он не сможет увидеть страницу юзера?


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

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