Сканер скриптов на уязвимости

Discussion in 'Уязвимости' started by gemaglabin, 17 Oct 2006.

  1. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Вот,накатал.База маленькая,дополнить можно самому )

    Естествено будут ложные срабатывания,ну вообще х3 , тестим

    PHP:
    <html>
    <head>
    <title>PHP source vulnerability scaner</title>
    <style>
    body {
    margin            : 0px;
        padding            : 0px;
        background-color    : #101010;
        font-family        : "Verdana";
        font-size        : 10px;
        color            : #CCCCCC;
    }
    .j {
    white-space:-moz-pre-wrap;
    white-space:-pre-wrap;
    white-space:-o-pre-wrap;
    ord-wrap:break-word;
    margin-top:4px;
    margin-bottom:4px;
    border:1px solid silver;
    background-color:#f5f5f5;
    font-family        : "Verdana";
    font-size        : 11px;
    padding:0.5em;
    width:85%;
    color:#222
    }
    .expl {
    font-size:small;
    margin-left:2em;
    margin-right:2em
    }
    .h {
    margin-top:1em;
    margin-bottom:0px
    }
    input,textarea,select { 
    font-family        : "Verdana";
    font-size        : 10px;
    color            : #CCCCCC; 
    border: 1px solid #404040; 
    BACKGROUND-COLOR: #222;
    Width: 190px;
    Heigth:46;
    }
    td {
    font-size: 12px;
    font-family: Verdana, "Trebuchet MS";
    text-align: left;
    }
    code{
    </style><hr>
    </head>

      <div style="align:center;">
      <form name="scan" method="post">
      <center>  
      <table border="0" cellpadding="2" cellspacing="0" style="">
      <tr>
      <td>Directory&nbsp;</td>
      <td colspan="2"><input name="dir" type="text" value=""/></td>
      <td colspan="2"><input type="submit" Value="Run"/></td>
      </tr>
      </table>
      </center>
        <hr>
      </div>
    </body>
    </html>

    <?php

    ini_set
    ("display_errors","0");

    function 
    _highlight()
    {
     global 
    $ftext;

     
    $phpteg    = array ("'&lt;\?php'si",
                         
    "'&lt;\?'si",
                         
    "'\?&gt;'si");
                         
     
    $fphpteg   = array ("<font color=#95001E>&lt;?php</font>",
                         
    "<font color=#95001E>&lt;?</font>",
                         
    "<font color=#95001E>&gt;</font>");
                         
     
    $strings   = array ("'(\"[^\"]*\")'si",
                         
    "'(\'[^\']*\')'si");
                         
     
    $fstrings  = array ("<font color=#DD0000>\\1</font>",
                         
    "<font color=#DD0000>\\1</font>");
                         
     
    $operator  = array ("'\,'si",
                         
    "'\-'si",
                         
    "'\+'si",
                         
    "'\('si",
                         
    "'\)'si",
                         
    "'\{'si",
                         
    "'\}'si");
                         
     
    $foperator = array ("<font color=#007700>,</font>",
                         
    "<font color=#007700>-</font>",
                         
    "<font color=#007700>+</font>",
                         
    "<font color=#007700>(</font>",
                         
    "<font color=#007700>)</font>",
                         
    "<font color=#007700>{</font>",
                         
    "<font color=#007700>}</font>");
                         
     
    $reserved  = array ("'(echo)'si",
                         
    "'(print)'si",
                         
    "'(while)'si",
                         
    "'(switch)'si",
                         
    "'(if)'si",
                         
    "'(else)'si",
                         
    "'(function)'si",
                         
    "'(array)'si",
                         
    "'(for)'si");
                         
     
    $freserved  array_fill (0,count($reserved),"<font color=#007700>\\1</font>");                    
                         
                         
     
    $comment   "'((?:#|//)[^\n]*|/\*.*?\*/)'si";
     
     
    $function  "'([\w]+)([\s]*)[\(]'si";
     
     
    $variable "'([\$]{1,2}[A-Za-z_]+)'si";

     
    $ftext str_replace("<""&lt;"$ftext);
     
    $ftext str_replace(">""&gt" $ftext); 
     
    $ftemp preg_replace ($phpteg  ,$fphpteg,$ftext);
     
    $ftemp preg_replace ($comment ,"<font color=#244ECC>\\1</font>",$ftemp);
     
    $ftemp preg_replace ($function,"<font color=#0000cc>\\1</font>\\2(",$ftemp);
     
    $ftemp preg_replace ($operator,$foperator,$ftemp);
     
    $ftemp preg_replace ($variable,"<font color=#0000BB>\\1</font>",$ftemp);
     
    $ftemp preg_replace ($strings ,$fstrings,$ftemp);
     
    $ftemp preg_replace ($reserved,$freserved,$ftemp);
     
     return 
    "<code>$ftemp</code>";
    }

    function 
    show_error ($title,$num,$text)
    {
     global 
    $filename;
     print (
    '<div class=h>');
     print (
    "<font size=2>$title in $filename at $num</font>");
     print (
    '<pre class=j>');
     print (
    $num);
     print (
    ':&nbsp;');
     print (
    '<font size=3>'._highlight("<?php\n".$text."?>").'</font>');
     print (
    '</div></pre>');
    }
      
    function 
    scan_file($file)
    {
     global 
    $ftext;
     global 
    $filename;
     
    $fileh file($file'r');
     for (
    $i=0;$i<=count($fileh);$i++)
     {
     
    # scan for sql errors
      
    if (preg_match('[mysql_query\(.*\$_(GET|POST|SESSION|COOKIE|REQUEST).*\)]'$fileh[$i],$res)    ||
          
    preg_match('[WHERE .*=\$_(GET|POST|SESSION|COOKIE|REQUEST)]'$fileh[$i],$res)              ||
          
    preg_match('[request.form|request.querystring ADODB.Connection]',$fileh[$i],$res)           ||
          
    preg_match('[query\(.*\$_(GET|POST|COOKIE|REQUEST).*\)]',$fileh[$i],$res) )
      {
         
    $ftext     .= $fileh[$i];
         
    $vuln       $vuln 1;
         echo 
    show_error('Possible SQL injection',$i,$ftext);
      } 
     
    # scan for php injections
     
    if (preg_match('[(include|require)(_once)\s*(\(|\s).*\$_(GET|POST|SESSION|COOKIE|REQUEST)]'$fileh[$i],$res) ||
         
    preg_match('[(eval)\(\$_(GET|POST|REQUEST|COOKIE)]'$fileh[$i],$res))
      {
         
    $ftext     .= $fileh[$i];
         
    $vuln       $vuln 1;
         echo 
    show_error('Possible PHP injection',$i,$ftext);
      }  
      
    # scan for xss bugs
     
    if (preg_match('[(echo|print).*\$_(GET|POST|SESSION|COOKIE|REQUEST)]'$fileh[$i],$res) ||
         
    preg_match("<(echo|print).*\$_SERVER\['PHP_SELF']>"$fileh[$i],$res))
      {
         
    $ftext     .= $fileh[$i];
         
    $vuln       $vuln 1;
         echo 
    show_error('Possible XSS bug',$i,$ftext);
      }  
       
    # dangerous code
     
    if (preg_match('[\s+eval\s*\(\s*\$_(GET|POST|SESSION|COOKIE|REQUEST)]'$fileh[$i],$res)             ||
         
    preg_match('[(system|popen|shell_exec|exec)\s*\(\$_(GET|POST|COOKIE|REQUEST).*\)]'$fileh[$i],$res)) 
      {
         
    $ftext     .= $fileh[$i];
         
    $vuln       $vuln 1;
         echo 
    show_error('Dangerous code',$i,$ftext);
      } 
      
    # HTTP response splitting
     
    if (preg_match('[header\s*\("Location:.*\$_(GET|POST|SESSION|COOKIE|REQUEST).*\)]'$fileh[$i],$res) ||
         
    preg_match('[header\s*\(.*\$_(GET|POST|SESSION|COOKIE|REQUEST).*\)]'$fileh[$i],$res))
      {
         
    $ftext     .= $fileh[$i];
         
    $vuln       $vuln 1;
         echo 
    show_error('HTTP response splitting',$i,$ftext);
      } 
     }
    }

    if (isset(
    $_POST['dir']))
    {
     
    $dir opendir($_POST['dir']);
     if (!
    $dir) die("<center><h1>Cannot open directory</h1></center>");
     else
     {
      while ((
    $ffile readdir($dir)) !== false $filez .= $ffile."\n";
      
    $filezexplode("\n",$filez);
      
    $vuln       0;
      for (
    $b=0;$b<=count($filez);$b++)
      {
       
    $filename $filez[$b];
       if (
    is_file($filename)) echo scan_file($filename);
      }   
      
    closedir ($dir);
     }
    }
    ?>

     
    16 people like this.
  2. ground_zero

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

    Joined:
    11 Oct 2006
    Messages:
    398
    Likes Received:
    85
    Reputations:
    5
    расскажи пожалуста по подробней как им пользоватса
     
  3. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Ничего сложного ; )

    Указываешь путь к папке где лежат нужные скрипты и ждешь результата

    [​IMG]
     
    1 person likes this.
  4. Koller

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

    Joined:
    25 Jul 2005
    Messages:
    402
    Likes Received:
    246
    Reputations:
    302
    Possible SQL injection in Scaner ot geb.php at 162

    162: preg_match('[request.form|request.querystring ADODB.Connection]',$fileh[$i],$res) ||

    Работает...
    gemaglabin как всегда нас порадовал...
    Лови +...
     
    1 person likes this.
  5. ground_zero

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

    Joined:
    11 Oct 2006
    Messages:
    398
    Likes Received:
    85
    Reputations:
    5
    тоже самое 162: preg_match('[request.form|request.querystring ADODB.Connection]',$fileh[$i],$res) ||
    ... единственное что удручает нужно знать точный путь к папке на сервере +
     
  6. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Это он у вас нашел уязвимости в моем же скрипте %)
     
    2 people like this.
  7. EXSlim

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

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    Молодец. Просто хороший скрипт для начинающих php кодеров...молодец
     
  8. ground_zero

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

    Joined:
    11 Oct 2006
    Messages:
    398
    Likes Received:
    85
    Reputations:
    5
    смотрим дальше у меня там ещё e107 есть чота должен показать ...
     
  9. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Надо конечноже расширять базу скрипта,одними регулярками тут не обойдешься.
     
    1 person likes this.
  10. ground_zero

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

    Joined:
    11 Oct 2006
    Messages:
    398
    Likes Received:
    85
    Reputations:
    5
    не показал даже возможности sql ни в e107 ни в php_nuke но всёравно респект сканер работает
     
  11. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    если после ввода имени папки он ничего не выдал - это означает что в скриптах нет уязвимостей? = )
    имхо, лучше побольше статей умных читать, чем полагаться на такой сканер
    но всё равно респект, обожаю самовыражение в php-коде =)
     
  12. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Сделал пару ошибок ( значительных ) никто и не заметил %)

    http://underwater.cup.su/pscan.rar
     
    1 person likes this.
  13. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Новые версии будут?
     
  14. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Новая версия много было улучшено и добавлено

    [ + ] Возможность выбирать на какой тип уязвимостей проводить аудит
    [ + ] Если выводимые данные фильтруются такой тип уязвимости будет незасчитан
    [ + ] Игнорирование закомментированных строк
    [ + ] Теперь проверяются нетолько суперглобальные переменные
    [ + ] Проверка наличия различных подозрительных комментариев к коду
    [ + ] Старые нерабочие условия проверки были заменены и добавлены новые
    [ + ] Немалая нагрузка на сервер во время сканирования

    Стресс тест он тоже прошел неплохо , нашел баги в php-nuke и некоторых других cms.

    Это всего лишь облегчение вашего труда,не стоит полагаться на его результаты - чтото серьезное он найдет врядли , да и xss scan лучше отключить

    http://www.mytempdir.com/1044423
     
    #14 gemaglabin, 7 Nov 2006
    Last edited: 7 Nov 2006
    3 people like this.
  15. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Только что вспомнил про HTTP_GET_VARS,HTTP_POST_VARS,HTTP_COOKIE_VARS и HTTP_SESSION_VARS потом допишу
     
  16. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    тоже по сабжу:
    http://forum.milw0rm.com/showthread.php?t=3222
     
  17. DIAgen

    DIAgen Banned Life!

    Joined:
    2 May 2006
    Messages:
    1,055
    Likes Received:
    376
    Reputations:
    460
    Сделал что бы проверялись вложеные папки http://rapidshare.com/files/2526868/www.rar.html , только идет сильная нагрузка на сервак(
     
    #17 DIAgen, 8 Nov 2006
    Last edited: 8 Nov 2006
    1 person likes this.
  18. Darkweider

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

    Joined:
    8 Feb 2007
    Messages:
    142
    Likes Received:
    13
    Reputations:
    0
    Принцип работы? Скрипт должен обязательно находится в на сервере вместе с проверяемыми файлами? Иначе ниче не выйдет? А можно сделать так чтобы можно было удаленно проверять... Или я туплю и этим можно ?
     
  19. n1†R0x

    n1†R0x Elder - Старейшина

    Joined:
    20 Jan 2007
    Messages:
    728
    Likes Received:
    376
    Reputations:
    235
    я так понял, он сорцы анализирует, а не делает пост/гет запросы в формах и т.д.
    так что удаленно наврядли получится проверить.
     
  20. eklips13

    eklips13 New Member

    Joined:
    2 Feb 2007
    Messages:
    11
    Likes Received:
    0
    Reputations:
    0
    А я чот непонял как его юзать :(
    Списую строку адресс сайта (http://zone.mel.local/forum/) один хер......
    Думал форум пхпбб потестить :D