Короче давно была темка кто то писал не помню может гема. Фишка такая указываешь папку текст парситься на уязвимые функции. типо include( require( mysql_connect( system( exec( fopen( fwrite( и еще короче смысл понятен просто стоит щас задача перелопатить движок на 14 метров php кода. Всем спасибо.
Не бред, когда речь идёт о 14 мб кода. Только понятно что качество такой проверки будет куда ниже ручной. В любом случае эти сканнеры нужны лишь как вспомогательный инструмент. Такой скрипт былу у Raz0r'а: http://raz0r.name/releases/php-bug-scanner/
дело в удобстве имхо. к стати в утлите можно добовлять свои "узкие места" для того чтобю обращать на них пристальное внимание )
если в безопасности- то тут нужен опыт. PS узнаю "старую гвардию"- не понравился ответ- значит спишь на потолке... кросава
Есть отличная тулза в помощь ручному поиску багов - phpxref Собирает файлы из директорий и составляет отчёт в статичном хтмл, где перечислены все константы, функции и классы. Потрясная штука. Вот так например выглядит разобранный wordpress.
graudit - bash-скрипт, использующий grep по встроенной базе потенциально уязвимых функций. Набор функций в архиве довольно скромный, но его всегда можно расширить. http://www.justanotherhacker.com/2009/07/graudit-version-11-is-out.html
Вот вам мною написаная проверялка. Вообще она рекурсивно проверяет сразу все файлы в папке и позволяет сильно экономить время при разборе двига. Ищет злые функции и выдает 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($path, checkfile($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, $match, PREG_OFFSET_CAPTURE); //var_dump($match); foreach($match[0] as $m){ $line = substr_count(substr($content, 0, $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); } } } } ?>