Парсер уязвистей php.

Discussion in 'PHP' started by pampom, 7 Sep 2009.

  1. pampom

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

    Joined:
    23 Apr 2008
    Messages:
    33
    Likes Received:
    5
    Reputations:
    0
    Короче давно была темка кто то писал не помню может гема.
    Фишка такая указываешь папку текст парситься на уязвимые функции.

    типо
    include(
    require(
    mysql_connect(
    system(
    exec(
    fopen(
    fwrite(

    и еще короче смысл понятен просто стоит щас задача перелопатить движок на 14 метров php кода.

    В
    сем спасибо.
     
  2. LzD

    LzD Banned

    Joined:
    24 Jul 2009
    Messages:
    51
    Likes Received:
    12
    Reputations:
    2
    поиск по форуму ога? автор Razor
    http://raz0r.name/releases/php-bug-scanner/
     
    #2 LzD, 7 Sep 2009
    Last edited: 7 Sep 2009
    2 people like this.
  3. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Не бред, когда речь идёт о 14 мб кода. :) Только понятно что качество такой проверки будет куда ниже ручной. В любом случае эти сканнеры нужны лишь как вспомогательный инструмент.

    Такой скрипт былу у Raz0r'а:
    http://raz0r.name/releases/php-bug-scanner/
     
    3 people like this.
  4. LzD

    LzD Banned

    Joined:
    24 Jul 2009
    Messages:
    51
    Likes Received:
    12
    Reputations:
    2
    :( опаньки...
     
  5. LzD

    LzD Banned

    Joined:
    24 Jul 2009
    Messages:
    51
    Likes Received:
    12
    Reputations:
    2
    дело в удобстве имхо. к стати в утлите можно добовлять свои "узкие места" для того чтобю обращать на них пристальное внимание )
     
  6. LzD

    LzD Banned

    Joined:
    24 Jul 2009
    Messages:
    51
    Likes Received:
    12
    Reputations:
    2
    если в безопасности- то тут нужен опыт. :D

    PS узнаю "старую гвардию"- не понравился ответ- значит спишь на потолке... кросава :cool:
     
    1 person likes this.
  7. antowen

    antowen New Member

    Joined:
    8 Sep 2009
    Messages:
    4
    Likes Received:
    1
    Reputations:
    0
    Есть отличная тулза в помощь ручному поиску багов - phpxref

    Собирает файлы из директорий и составляет отчёт в статичном хтмл, где перечислены все константы, функции и классы. Потрясная штука.

    Вот так например выглядит разобранный wordpress.
     
    1 person likes this.
  8. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    graudit - bash-скрипт, использующий grep по встроенной базе потенциально уязвимых функций. Набор функций в архиве довольно скромный, но его всегда можно расширить.
    http://www.justanotherhacker.com/2009/07/graudit-version-11-is-out.html
     
  9. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    Вот вам мною написаная проверялка.

    Вообще она рекурсивно проверяет сразу все файлы в папке и позволяет сильно экономить время при разборе двига. Ищет злые функции и выдает HTML отчет. пользуясь им как картой можно быстро осмотреть весь двиг на простые косяки.

    PHP:
    <?php

    set_time_limit
    (0);

    $paths = array();
    $exttocheck = array("php""php3""php4""php5""php6""inc");
    $faults = array("codeexec""including""files""globalization""phpinfo");
    $dir "путь со слешом на конце до папки";
    read($dir);

    foreach(
    $paths as $path){
        
    $r strrpos($path".");
        
    $ext substr($path$r 1);
        if(
    in_array($ext$exttocheck)){
            
    GenerateHtmlOut($pathcheckfile($path));
        }
    }

    function 
    checkfile($path){
        global 
    $faults;
        
    $errors = array(
                        
    "codeexec" => array(
                                
    "#^.*?[^\w]array_map[\s]*\([^,]*\\$[^,],.+\)[\s]*;.*$#im",
                                
    "#^.*?([^\w]array_filter|[^\w]array_reduce|[^\w]array_walk)[\s]*\(.+?,.*\\$.+?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]assert[\s]*\([\s]*\\$.+?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w](call_user_func|call_user_func_array)[\s]*\([^,]*\\$.*?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]dl[\s]*\(.*?\)[\s]*;.*$#im",
                                
    "#^.*?([^\w]create_function|[^\w]eval|[^\w]exec|[^\w]passthru|[^\w]shell_exec|[^\w]system)[\s]*\([^,]*\\$.+?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]preg_replace[\s]*\(([\"'])(.)(.*)\\2([imxsu]*)e([imxsu]*)\\1[\d\D]+?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]preg_replace_callback[\s]*\(([\"'])(.)(.*)\\2(.*)\\1[^)]+\)[\s]*;.*$#im"
                            
    ),
                        
    "including" => array(
                                
    "#^.*?([^\w]include|[^\w]include_once|[^\w]require|[^\w]require_once|[^\w]virtual)[\s]*\([\s]*\\$.+?\)[\s]*;.*$#im"
                            
    ),
                        
    "files" => array(
                                
    "#^.*?[^\w]copy[\s]*\([^,]*\\$[^,]+,.*\\$.*?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]copy[\s]*\([^,]+,.*\\$.*?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]copy[\s]*\([^,]*\\$[^,]+,[^)]+\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]fsockopen[\s]*\([^,]+,.*\\$.*?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]curl_init[\s]*\(.*?\)[\s]*;.*$#im",
                                
    "#^.*?([^\w]file|[^\w]file_get_contents|[^\w]mkdir|[^\w]opendir|[^\w]rmdir|[^\w]readfile|[^\w]highlight_file|[^\w]unlink)[\s]*\(.*?\\$.+?\)[\s]*;.*$#im"
                            
    ), 
                        
    "globalization" => array(
                                
    "#^.*?[^\w]extract[\s]*\([^,]*\\$[^,]+(,((.*\\$.*?)|([\s]*EXTR_OVERWRITE[\s]*)))?\)[\s]*;.*$#im",
                                
    "#^.*?([^\w]parse_str|[^\w]mb_parse_str)[\s]*\([\s]*\\$.+?\)[\s]*;.*$#im",
                                
    "#^.*?[^\w]import_request_variables\([^)]*\)[\s]*;.*$#im"
                            
    ),
                        
    "phpinfo" => array(
                                
    "#^.*?[^\w]phpinfo\(\)[\s]*;.*$#im"
                            
    )
                        );
        
    $possible = array();
        
    $content file_get_contents($path);
        foreach(
    $faults as $fault){
            foreach(
    $errors[$fault] as $cd){
                
    preg_match_all($cd$content$matchPREG_OFFSET_CAPTURE);
                
    //var_dump($match);
                
    foreach($match[0] as $m){
                    
    $line substr_count(substr($content0$m[1]), "\n")+1;
                    
    $possible[$fault][] = array("line" => $line"str" => $m[0]);
                }
            }
        }
        
    //var_dump($possible);
        
    return $possible;

    }

    function 
    GenerateHtmlOut($path$possible){
        global 
    $faults;
        echo 
    "<html><body>\r\n";
        echo 
    "<table width='100%'><tr>\r\n";
        echo 
    "<td colspan='2' align='center' bgcolor='#BBBBFF'><b><strong>File: $path</strong></b></td></tr>\r\n";
        foreach(
    $faults as $fault){
        echo 
    "<td colspan='2' bgcolor='#CCCCFF'><b>Possible $fault danger place founds ".count($possible[$fault])."</b></td></tr>\r\n";
            if(
    count($possible[$fault])>0){
                foreach(
    $possible[$fault] as $mb){
                    echo 
    "<tr><td valign='top' bgcolor='#DDDDDD'>".$mb["line"].": </td><td bgcolor='#DDDDDD' valign='top'>".htmlspecialchars(nl2br($mb['str']))."</td></tr>\r\n";
                }
            }
        }
        echo 
    "</body></html>";
    }

    function 
    read($dir){
        global 
    $paths;
        
    $r opendir($dir);
        if(!
    r){
            return 
    false;
        }
        while(
    $item readdir($r)){
            if(
    $item != "." && $item != ".."){
                if(!
    is_dir($dir.DIRECTORY_SEPARATOR.$item)){
                    
    $paths[] = realpath($dir.DIRECTORY_SEPARATOR.$item);
                }else{
                    
    read($dir.DIRECTORY_SEPARATOR.$item.DIRECTORY_SEPARATOR);
                }
            }
        }
    }


    ?>
     
    _________________________
    8 people like this.