DVWA靶场通关实战

这篇具有很好参考价值的文章主要介绍了DVWA靶场通关实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

截至2022.11.24,DVWA共有十四个模块,分别是:

Brute Force(暴力破解)
Command Injection(命令行注入)
CSRF(跨站请求伪造)
File Inclusion(文件包含)
File Upload(文件上传)
Insecure CAPTCHA (不安全的验证码)
SQL Injection(SQL注入)
SQL Injection(Blind)(SQL盲注)
Weak Session IDs (弱会话ID)
XSS (DOM) (DOM型跨站脚本)
XSS(Reflected)(反射型跨站脚本)
XSS(Stored)(存储型跨站脚本)
CSP Bypass (CSP绕过)
JavaScript

按我的思路就是,Low、Media、High是拿来攻击的,Impossible是来教你防御的
然后就是缩减了一下目录,本来攻击方式、源码审计、漏洞原理都加了标题,但是那样目录就太长太丑了,想想还是删了算了
直接开冲!

Brute Force(暴力破解)

暴力破解,又叫撞库、穷举,使用大量的字典逐个在认证接口尝试登录,理论上,只要字典足够强大,破解总是会成功的。
阻止暴力破解的最有效方式是设置复杂度高的密码(英文字母大小写、数字、符号混合)。

而如果你的字典是从某网站泄露出来的,你使用它试图登陆其他网站,就便是撞库。撞库攻击的成功率高于暴力破解,因为你在A网站的用户名、密码通常和B网站的用户名、密码一致。

Low

DVWA Security界面将难度设置为Low
dvwa靶场通关,打爆靶场,安全,数据库,网络
先看登录界面,填写账号密码后抓包
dvwa靶场通关,打爆靶场,安全,数据库,网络
bp抓包后转到intruder模块,给username和password加上tag§
type选择Cluster bomb
dvwa靶场通关,打爆靶场,安全,数据库,网络
对应位置插入字典后,点击右边的attack开始攻击
dvwa靶场通关,打爆靶场,安全,数据库,网络
也可以更改OptionsNumber of threads修改进程数,增加爆破效率
dvwa靶场通关,打爆靶场,安全,数据库,网络

根据响应包的大小以及响应体的内容判断是否成功,可以看到成功爆出一个用户admin/password,也是平台登录的默认账号
dvwa靶场通关,打爆靶场,安全,数据库,网络
马上停止爆破,点到为止,一千四百万条顶不住啊。

源码审计

<?php
if( isset( $_GET[ 'Login' ] ) ) {
   
	// Get username
	$user = $_GET[ 'username' ];
	// Get password
	$pass = $_GET[ 'password' ];
	$pass = md5( $pass );
	// Check the database
	$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

	if( $result && mysqli_num_rows( $result ) == 1 ) {
   
		// Get users details
		$row    = mysqli_fetch_assoc( $result );
		$avatar = $row["avatar"];

		// Login successful
		$html .= "<p>Welcome to the password protected area {
     $user}</p>";
		$html .= "<img src=\"{
     $avatar}\" />";
	}
	else {
   
		// Login failed
		$html .= "<pre><br />Username and/or password incorrect.</pre>";
	}
	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

username未过滤password只有一个md5加密,但是对实际的爆破过程毫无影响
首先很直观的就是一个万能密码(
由于限制了结果只能有一条,要加上limit 1
admin' or 1=1 limit 1#
dvwa靶场通关,打爆靶场,安全,数据库,网络

Medium

爆破过程同上,但是可以明显感觉到,爆破的速度慢了很多
为了方便演示,直接把admin/password放在前几条了,反正多跑无益,还浪费时间
dvwa靶场通关,打爆靶场,安全,数据库,网络
源码审计

<?php

if( isset( $_GET[ 'Login' ] ) ) {
   
	// Sanitise username input
	$user = $_GET[ 'username' ];
	$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

	// Sanitise password input
	$pass = $_GET[ 'password' ];
	$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
	$pass = md5( $pass );

	// Check the database
	$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

	if( $result && mysqli_num_rows( $result ) == 1 ) {
   
		// Get users details
		$row    = mysqli_fetch_assoc( $result );
		$avatar = $row["avatar"];

		// Login successful
		$html .= "<p>Welcome to the password protected area {
     $user}</p>";
		$html .= "<img src=\"{
     $avatar}\" />";
	}
	else {
   
		// Login failed
		sleep( 2 );
		$html .= "<pre><br />Username and/or password incorrect.</pre>";
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

用了mysqli_real_escape_string()函数转义输入的用户名密码,但是没有设置编码,在gbk编码的数据库上可以进行sql注入
登录失败后sleep(2)延迟两秒

High

抓包发现url栏多了一项user_token
bp抓包后发现,只有在token正确的情况下才能尝试登录,其他情况均为302重定向
dvwa靶场通关,打爆靶场,安全,数据库,网络
bp也是有带token爆破的功能的,首先转到intruder模块,选择Pitchfork模式
dvwa靶场通关,打爆靶场,安全,数据库,网络
payload1是密码位,正常插入密码字典
payload2是token位,选择Recursive grep
dvwa靶场通关,打爆靶场,安全,数据库,网络

然后去option里设置Grep-Extract
dvwa靶场通关,打爆靶场,安全,数据库,网络

设置Start和End,将数据留在中间,也可以直接用鼠标在下方拖动选取文字
PS:设置grep时建议刷新一次浏览器,填入最新的token,避免访问失效,下面框里没东西
dvwa靶场通关,打爆靶场,安全,数据库,网络设置完成后回到payload界面选中
dvwa靶场通关,打爆靶场,安全,数据库,网络
因为token不能复用,将option的线程设置为一,重定向选择always
dvwa靶场通关,打爆靶场,安全,数据库,网络
dvwa靶场通关,打爆靶场,安全,数据库,网络
开始爆破后即可根据响应包大小判断是否成功
dvwa靶场通关,打爆靶场,安全,数据库,网络
源码审计

<?php

if( isset( $_GET[ 'Login' ] ) ) {
   
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Sanitise username input
	$user = $_GET[ 'username' ];
	$user = stripslashes( $user );
	$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

	// Sanitise password input
	$pass = $_GET[ 'password' ];
	$pass = stripslashes( $pass );
	$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
	$pass = md5( $pass );

	// Check database
	$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

	if( $result && mysqli_num_rows( $result ) == 1 ) {
   
		// Get users details
		$row    = mysqli_fetch_assoc( $result );
		$avatar = $row["avatar"];

		// Login successful
		$html .= "<p>Welcome to the password protected area {
     $user}</p>";
		$html .= "<img src=\"{
     $avatar}\" />";
	}
	else {
   
		// Login failed
		sleep( rand( 0, 3 ) );
		$html .= "<pre><br />Username and/or password incorrect.</pre>";
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

// Generate Anti-CSRF token
generateSessionToken();

?>

开始后先校验tokencheckToken(),若token不匹配则重定向到登陆界面,不再进行判断
结束前生成新的tokengenerateSessionToken()
账号密码多用了一个stripslashes()函数删除反斜杠

Impossible

失败三次,锁定15分钟,没辙了,摆烂了
dvwa靶场通关,打爆靶场,安全,数据库,网络
源码审计

<?php

if( isset( $_POST[ 'Login' ] ) && isset ($_POST['username']) && isset ($_POST['password']) ) {
   
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Sanitise username input
	$user = $_POST[ 'username' ];
	$user = stripslashes( $user );
	$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

	// Sanitise password input
	$pass = $_POST[ 'password' ];
	$pass = stripslashes( $pass );
	$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
	$pass = md5( $pass );

	// Default values
	$total_failed_login = 3;
	$lockout_time       = 15;
	$account_locked     = false;

	// Check the database (Check user information)
	$data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' );
	$data->bindParam( ':user', $user, PDO::PARAM_STR );
	$data->execute();
	$row = $data->fetch();

	// Check to see if the user has been locked out.
	if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) )  {
   
		// User locked out.  Note, using this method would allow for user enumeration!
		//$html .= "<pre><br />This account has been locked due to too many incorrect logins.</pre>";

		// Calculate when the user would be allowed to login again
		$last_login = strtotime( $row[ 'last_login' ] );
		$timeout    = $last_login + ($lockout_time * 60);
		$timenow    = time();

		/*
		print "The last login was: " . date ("h:i:s", $last_login) . "<br />";
		print "The timenow is: " . date ("h:i:s", $timenow) . "<br />";
		print "The timeout is: " . date ("h:i:s", $timeout) . "<br />";
		*/

		// Check to see if enough time has passed, if it hasn't locked the account
		if( $timenow < $timeout ) {
   
			$account_locked = true;
			// print "The account is locked<br />";
		}
	}

	// Check the database (if username matches the password)
	$data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
	$data->bindParam( ':user', $user, PDO::PARAM_STR);
	$data->bindParam( ':password', $pass, PDO::PARAM_STR );
	$data->execute();
	$row = $data->fetch();

	// If its a valid login...
	if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) {
   
		// Get users details
		$avatar       = $row[ 'avatar' ];
		$failed_login = $row[ 'failed_login' ];
		$last_login   = $row[ 'last_login' ];

		// Login successful
		$html .= "<p>Welcome to the password protected area <em>{
     $user}</em></p>";
		$html .= "<img src=\"{
     $avatar}\" />";

		// Had the account been locked out since last login?
		if( $failed_login >= $total_failed_login ) {
   
			$html .= "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";
			$html .= "<p>Number of login attempts: <em>{
     $failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";
		}

		// Reset bad login count
		$data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' );
		$data->bindParam( ':user', $user, PDO::PARAM_STR );
		$data->execute();
	} else {
   
		// Login failed
		sleep( rand( 2, 4 ) );

		// Give the user some feedback
		$html .= "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {
     $lockout_time} minutes</em>.</pre>";

		// Update bad login count
		$data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' );
		$data->bindParam( ':user', $user, PDO::PARAM_STR );
		$data->execute();
	}

	// Set the last login time
	$data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' );
	$data->bindParam( ':user', $user, PDO::PARAM_STR );
	$data->execute();
}

// Generate Anti-CSRF token
generateSessionToken();

?>

代码行数直接比High多了一倍多,虽然注释挺多的
提交方式由GET改为POST
失败次数是写入数据库的,sql语句也改为参数化查询
不好说了,立体机动防御了
dvwa靶场通关,打爆靶场,安全,数据库,网络

Command Injection(命令行注入)

命令注入,是指在某些需要输入数据的位置,构造恶意代码破环原有的语句结构,而系统缺少有效的过滤,许多内容管理cms存在命令注入漏洞。

Low

简洁的界面
dvwa靶场通关,打爆靶场,安全,数据库,网络
象征性的ping一下,编码问题就不管了,影响不大
先来一个经典的ping
dvwa靶场通关,打爆靶场,安全,数据库,网络命令执行常用的方式为||&&管道符
更多的可以看看这个命令执行
还有一些过滤技巧CTF—命令执行总结
||当前项执行失败后执行后项
dvwa靶场通关,打爆靶场,安全,数据库,网络&&前项成功后执行后项
dvwa靶场通关,打爆靶场,安全,数据库,网络源码审计

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
   
	// Get input
	$target = $_REQUEST[ 'ip' ];

	// Determine OS and execute the ping command.
	if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
   
		// Windows
		$cmd = shell_exec( 'ping  ' . $target );
	}
	else {
   
		// *nix
		$cmd = shell_exec( 'ping  -c 4 ' . $target );
	}

	// Feedback for the end user
	$html .= "<pre>{
     $cmd}</pre>";
}

?>

没有过滤,简单判断一下操作系统就拼接执行了

Medium

再次尝试时发现&&被过滤了
dvwa靶场通关,打爆靶场,安全,数据库,网络||可以正常执行
dvwa靶场通关,打爆靶场,安全,数据库,网络
源码审计

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
   
	// Get input
	$target = $_REQUEST[ 'ip' ];

	// Set blacklist
	$substitutions = array(
		'&&' => '',
		';'  => '',
	);

	// Remove any of the charactars in the array (blacklist).
	$target = str_replace( array_keys( $substitutions ), $substitutions, $target );

	// Determine OS and execute the ping command.
	if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
   
		// Windows
		$cmd = shell_exec( 'ping  ' . $target );
	}
	else {
   
		// *nix
		$cmd = shell_exec( 'ping  -c 4 ' . $target );
	}

	// Feedback for the end user
	$html .= "<pre>{
     $cmd}</pre>";
}

?>

还多过滤了一个分号,其他没啥了

High

过滤了&||,但是剩了个|还在
dvwa靶场通关,打爆靶场,安全,数据库,网络源码审计

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
   
	// Get input
	$target = trim($_REQUEST[ 'ip' ]);

	// Set blacklist
	$substitutions = array(
		'&'  => '',
		';'  => '',
		'| ' => '',
		'-'  => '',
		'$'  => '',
		'('  => '',
		')'  => '',
		'`'  => '',
		'||' => '',
	);

	// Remove any of the characters in the array (blacklist).
	$target = str_replace( array_keys( $substitutions ), $substitutions, $target );

	// Determine OS and execute the ping command.
	if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
   
		// Windows
		$cmd = shell_exec( 'ping  ' . $target );
	}
	else {
   
		// *nix
		$cmd = shell_exec( 'ping  -c 4 ' . $target );
	}

	// Feedback for the end user
	$html .= "<pre>{
     $cmd}</pre>";
}

?>

还真就剩了个|,不知道为什么过滤'| ' => '','||' => '',
l后面是空格说明仅仅过滤了l+空格 没过滤单独的l,他好温柔,我哭死

Impossible

dvwa靶场通关,打爆靶场,安全,数据库,网络

打都不打,直接看源码
源码审计文章来源地址https://www.toymoban.com/news/detail-620487.html

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
   
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Get input
	$target = $_REQUEST[ 'ip' ];
	$target = stripslashes( $target );

	// Split the IP into 4 octects
	$octet = explode( ".", $target );

	// Check IF each octet is an integer
	if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof<

到了这里,关于DVWA靶场通关实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 信息安全入门——DVWA靶场搭建

    写在前面:作为刚接触信安的菜鸟,仅将自己的经验分享给大家。如有纰漏欢迎师傅们指正 DVWA搭建所需:                 PHP环境: W indows A pache M ysql P hp(不想自己弄也可直接用phpstudy)                 DVWA源代码(打包见文末) 本文以phpstudy为例 1.下载并安

    2024年02月13日
    浏览(41)
  • 网络安全技术新手入门:在docker上安装dvwa靶场

    准备工作:1.已经安装好kali linux 步骤总览:1.安装好docker     2.拖取镜像,安装dvwa 输入命令: sudo su 输入命令: curl  -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - 输入命令: echo \\\'deb https://download.docker.com/linux/debian stretch stable\\\' /etc/apt/sources.list.d/docker.list tips:此处

    2024年01月20日
    浏览(40)
  • [网络安全]XSS之Cookie外带攻击姿势及例题详析(基于DVWA靶场)

    本文仅分享XSS攻击知识,不承担任何法律责任。 本文涉及的软件等请读者自行安装,本文不再赘述。 XSS 的 Cookie 外带攻击就是一种针对 Web 应用程序中的 XSS(跨站脚本攻击)漏洞进行的攻击,攻击者通过在 XSS 攻击中注入恶意脚本,从而 窃取用户的 Cookie 信息 。 在使用XSS语

    2024年02月08日
    浏览(53)
  • dvwa xss通关

    选择难度: 直接用下面JS代码尝试: 通关成功: 直接下面代码尝试后失败 发现这段代码直接被输出: 尝试修改script标签的字母大小写,做大小写绕过: 通关成功:

    2024年02月10日
    浏览(37)
  • DVWA通关攻略之命令注入

    命令注入(Command Injection)漏洞也称为远程命令/代码执行漏洞(RCE,Remote Command/Code Exec),指应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数能被用户控制,就可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,属

    2024年02月11日
    浏览(39)
  • dvwa文件上传通关及代码分析

    查看源码:

    2024年02月10日
    浏览(35)
  • DVWA通关攻略零到一【全】

    DVWA(Damn Vulnerable Web Application)一个用来进行安全脆弱性鉴定的PHP/MySQL Web 应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。 DVWA 一共包含了十个攻击模块,分别是:Brute Force(暴力(破解))、Command Injec

    2023年04月08日
    浏览(32)
  • DVWA靶场-文件上传漏洞

           文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。 basename(str,name)       函数返回路

    2024年02月07日
    浏览(41)
  • 搭建本地DVWA靶场教程 及 靶场使用实例

    DVWA(Damn Vulnerable Web Application)一个用来进行安全脆弱性鉴定的PHP/MySQL Web 应用平台,旨在为网络安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。 DVWA还可以手动调整靶机源码的安全级别,分别为Low,Medium,High,Im

    2024年02月15日
    浏览(46)
  • 搭建本地DVWA靶场教程 及 靶场使用示例

    DVWA(Damn Vulnerable Web Application)一个用来进行安全脆弱性鉴定的PHP/MySQL Web 应用平台,旨在为网络安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。 DVWA还可以手动调整靶机源码的安全级别,分别为Low,Medium,High,Im

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包