PDA

Просмотр полной версии : Парсер уязвистей php.


pampom
07.09.2009, 10:09
Короче давно была темка кто то писал не помню может гема.
Фишка такая указываешь папку текст парситься на уязвимые функции.

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

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

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

m0Hze
07.09.2009, 15:44
Поверь мне,скрипт этого не сделает лучше человека.Так что это - полнейший бред.
Потрать 1 час времени на это,и незачем извращаться.

LzD
07.09.2009, 15:50
поиск по форуму ога? автор Razor
http://raz0r.name/releases/php-bug-scanner/

Qwazar
07.09.2009, 15:51
Поверь мне,скрипт этого не сделает лучше человека.Так что это - полнейший бред.
Потрать 1 час времени на это,и незачем извращаться. Не бред, когда речь идёт о 14 мб кода. :) Только понятно что качество такой проверки будет куда ниже ручной. В любом случае эти сканнеры нужны лишь как вспомогательный инструмент.

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

LzD
07.09.2009, 15:52
Не бред :) Когда речь идёт о 14 мб кода, только понятно что качество такой проверки будет куда ниже ручной.

Такой скрипт былу у Raz0r'а:
http://raz0r.name/releases/php-bug-scanner/
:( опаньки...

m0Hze
07.09.2009, 16:19
Не бред, когда речь идёт о 14 мб кода. :) Только понятно что качество такой проверки будет куда ниже ручной. В любом случае эти сканнеры нужны лишь как вспомогательный инструмент.

Такой скрипт былу у Raz0r'а:
http://raz0r.name/releases/php-bug-scanner/
Спорить с тобой конечно не намерен,но все-же,там 14м кода,но требуют проверки максимум 70%,из них - 50% функции и классы(судя по весу).Так что проверять там очень много не нужно.Если есть небольшой опыт работы с PHP и уязвимостями,которые встречаються наиболее часто.И лопатить придеться меньше,и будет намного надежнее щипать код руками =)
Но кто как конечно считает,если ТС удобно парсить скриптом - дело барина.

LzD
07.09.2009, 16:22
Спорить с тобой конечно не намерен,но все-же,там 14м кода,но требуют проверки максимум 70%,из них - 50% функции и классы(судя по весу).Так что проверять там очень много не нужно.Если есть небольшой опыт работы с PHP и уязвимостями,которые встречаються наиболее часто.И лопатить придеться меньше,и будет намного надежнее щипать код руками =)
Но кто как конечно считает,если ТС удобно парсить скриптом - дело барина.
дело в удобстве имхо. к стати в утлите можно добовлять свои "узкие места" для того чтобю обращать на них пристальное внимание )

m0Hze
07.09.2009, 16:23
дело в удобстве имхо.
Неудобно спать на потолке.Тут дело в безопасности.

LzD
07.09.2009, 16:27
Неудобно спать на потолке.Тут дело в безопасности.
если в безопасности- то тут нужен опыт. :D

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

antowen
08.09.2009, 19:41
Есть отличная тулза в помощь ручному поиску багов - phpxref (http://phpxref.sourceforge.net//)

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

Вот так (http://phpxref.ftwr.co.uk/wordpress/nav.html?xmlrpc.php.source.html) например выглядит разобранный wordpress.

[Raz0r]
08.09.2009, 20:19
graudit - bash-скрипт, использующий grep по встроенной базе потенциально уязвимых функций. Набор функций в архиве довольно скромный, но его всегда можно расширить.
http://www.justanotherhacker.com/2009/07/graudit-version-11-is-out.html

SQLHACK
11.09.2009, 02:05
Вот вам мною написаная проверялка.

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

<?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_SEPA RATOR);
}
}
}
}


?>