ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |

13.09.2010, 20:15
|
|
Новичок
Регистрация: 12.08.2009
Сообщений: 0
Провел на форуме: 30996
Репутация:
0
|
|
Доброго времени суток!
Это первая статья из трех частей, которая посвящена базовым принцыпам автоматического поиска XSS уязвимостей в PHP коде.
Опишем суть проблемы.
Имеется некоторый PHP файл index.php, который потенциально уязвим. Начнем с простого
PHP код:
PHP: [COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]
[/COLOR][/COLOR]
Если в настройках указано register_globals = on, то переменная $bar открывает пасивную XSS уязвимость.
Это можно определить просто передав в нее некотрую последовательность символов,
таких как '"<> которые являются спец символами языка HTML и должны быть экранированны.
Таким образом изначальный код приведем к такому виду
PHP код:
PHP: [COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"] @@@'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$bar[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'@@@ name=bar template=\'"<> @@@'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$bar[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]$foo[/COLOR][COLOR="#007700"];
echo[/COLOR][COLOR="#DD0000"]"Test variable:"[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$bar[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]?>[/COLOR][/COLOR]
Мы выполнили поиск всех переменных и вставили их в начало скрипта.
Переменные все инициализированны текстовой строкой которая содержет в себе:
1. название самой переменной
2. и список уязвимых символов.
Результатом выполнения скрипта будет вывод:
Код:
Code:
Test variable: @@@ name=foo template='"<> @@@
Отстается выполнить парсинг вывода, его можно сделать например так:
PHP код:
PHP: [COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#FF8000"]// Предполагается, что $dump содержит
// текстовый вывод работы предыдущего скрипта
[/COLOR][COLOR="#0000BB"]preg_match_all[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'/@@@(.*?)@@@/s'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$dump[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$matches[/COLOR][COLOR="#007700"]);
for([/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"];[/COLOR][COLOR="#0000BB"]$i[/COLOR][COLOR="#007700"]'[/COLOR][COLOR="#007700"]{
[/COLOR][COLOR="#FF8000"]// Если вывод переменной равен изначальному шаблону, то найдена уязвимость
[/COLOR][COLOR="#007700"]echo[/COLOR][COLOR="#0000BB"]$attrs[/COLOR][COLOR="#007700"][[/COLOR][COLOR="#DD0000"]'name'[/COLOR][COLOR="#007700"]] .[/COLOR][COLOR="#DD0000"]' '[/COLOR][COLOR="#007700"];
}
}
[/COLOR][/COLOR]
В результате автоматически найдена пасивная уязвимость, которая заключается в передаче переменной $foo любого вредоносного кода:
Код:
Code:
index.php?foo=alert('Hello from hole')
Возможна ситуация, что экранируется часть символов, например \'\"<>
тогда подобное сравнение не будет подходить и нужно сравнивать посимвольно.
На этом пока всё, следующие статьи посвещу тому как можно обходить все ветвления программы,
а не идти по одной из веток if else операторов. О том как раскрывать циклы...
Пару дней назад нашей командой был открыт сервис поиска уязвимостей /thread229263.html
|
|
|

13.09.2010, 23:34
|
|
Постоянный
Регистрация: 26.07.2009
Сообщений: 321
Провел на форуме: 444589
Репутация:
123
|
|
или просто отключить register_globals и юзать htmlspecialchars
xD
|
|
|

13.09.2010, 23:37
|
|
Новичок
Регистрация: 12.08.2009
Сообщений: 0
Провел на форуме: 30996
Репутация:
0
|
|
Я старался описать саму идею, её небольшие модификации позволяют находить так-же SQL и PHP иньекции.
|
|
|

13.09.2010, 23:41
|
|
Участник форума
Регистрация: 12.01.2007
Сообщений: 117
Провел на форуме: 795261
Репутация:
28
|
|
Сам написал или с какой книги позаимствовал?
|
|
|

13.09.2010, 23:54
|
|
Постоянный
Регистрация: 26.07.2009
Сообщений: 321
Провел на форуме: 444589
Репутация:
123
|
|
со скулями посложнее будет))
Идея по доработке принципа:
собирать имена переменных GET и POST, но работать со скриптом не добавляя к нему свой код, а через curl.
имхо очень много нюансов и подводных камней нужно учесть чтобы сделать систему, которая с большой вероятностью найдет уязвимость, которая там есть. (уязвимость не только такую простую как та что в статье, а речь о проверке безопасности)
Например, регулярное выражение для проверки поля
if(preg_match('#[a-z0-9]{8,15}#uis' ...
Такие вещи трудно найти парсером кода...
* безопасное выражение '#^[a-z0-9]{8,15}$#uis'
|
|
|

14.09.2010, 00:02
|
|
Новичок
Регистрация: 12.08.2009
Сообщений: 0
Провел на форуме: 30996
Репутация:
0
|
|
В основном использовал статьи по формальным грамматикам и всяким лексическим анализаторам. Эта работа мне послужала дипломом
В ближайшее время планирую протестировать большинство известных скриптов интернет магазинов и CMS, расскажу что из этого получилось.
|
|
|

14.09.2010, 00:12
|
|
Новичок
Регистрация: 12.08.2009
Сообщений: 0
Провел на форуме: 30996
Репутация:
0
|
|
Если после проверки логина предпологается вывод его по типу
Код:
Code:
Привет %username%
или запись в базу, то по сути происходит следующее
1. Передача параметра ?login= на обработку скрипту
2. Проверка и фильтрация логина какими угодно способами
3. В итоге происходит вывод этого логина на экран либо запись переменной логина в базу.
И на сколько б не был сложный и запутанный 2й этап, если в вывод попадает неэкранированная переменная то уязвимость обнаружена.
|
|
|

19.09.2010, 02:46
|
|
Новичок
Регистрация: 12.08.2009
Сообщений: 0
Провел на форуме: 30996
Репутация:
0
|
|
|
|
|

19.09.2010, 19:09
|
|
Участник форума
Регистрация: 12.01.2007
Сообщений: 117
Провел на форуме: 795261
Репутация:
28
|
|
Видос это несомненно гуд, так сказать сначала почитать теорию, а потом наглядно посмотреть.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|