实验二 CSFR漏洞、Insecure CAPTCHA漏洞、文件包含

实验二 CSFR漏洞、Insecure CAPTCHA漏洞、文件包含

一、实验目的

1、了解csrf漏洞定义及原理;
2、使学生掌握csrf漏洞利用,以及防御方法。
3、了解Insecure CAPTCHA漏洞定义及原理。
4、使学生掌握Insecure CAPTCHA漏洞利用,以及防御方法。
5、了解文件包含漏洞定义及原理;
6、使学生掌握文件包含漏洞利用,以及防御方法。

二、实验环境DVWA实验平台、php编辑器等。

三、实验内容及步骤:

1、XSS存储型漏洞低中高级别代码分析。
2、对漏洞进行利用造成弹窗。
3、Insecure CAPTCHA漏洞低中高级别代码分析。
4、对漏洞进行利用造成弹窗。
5、文件包含漏洞低中高级别代码分析。
6、获取服务器信息。

四、实验过程:

(一)、CSFR漏洞

1. 什么是存储型CSRF?CSRF全名是Cross Site Request Forgery,翻译成中文就是跨站点请求伪造。其通过利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作。它迫使最终用户在其当前通过社会工程(如通过电子邮件聊天发送链接)的少量帮助进行身份验证的web应用程序上执行不需要的操作。攻击者可能会强制web应用程序的用户执行攻击者选择的操作。如果目标最终用户是管理员账户,那么成功的CSRF攻击可能会危害最终用户的数据和操作,这可能会危害整个web应用程序。因为Web应用程序在用户进行敏感操作时,如修改账户密码、添加账户、转账等操作时,没有进行如检验表单Token、http请求头中的referer值等防御措施,从而导致恶意攻击者利用被攻击者的身份完成敏感操作。

CSRF攻击流程如下:攻击者发现CSRF漏洞——构造恶意代码——发送给受害人——受害人打开——受害人执行代码——完成攻击

2.本实验利用工具:Firefox、Firefox的hackbar插件。

3.实验难度Low级别。登录DVWA平台选择Low级别和CSRF模块,页面上是一个很平常的密码修改页面,并且只要求输入新密码即可并未验证原密码。代码中在获取了 p a s s n e w 和 pass_new和 passnewpass_conf这两个变量之后,利用mysql_real_escape_string()函数进行了过滤,这样虽然可以防止SQL注入,但却无法阻止CSRF攻击,之后这两个变量便被直接代入UPDATE语句中执行了数据库更新操作。那么我们就先用正常用户的方式进行修改密码,比如这里我将密码改为123。这里我们看见下面显示的Password Changed表示密码修改成功,同时我们通过HackBar分析此时的URL,发现在这段URL中我们输入的参数都包涵在了URL中,那么我们就猜想是不是可以直接通过修改URL的参数即可修改密码呢,然后我们就构造一个新的URL:http://127.0.0.1/DVWA-1.9/vulnerabilities/csrf/?password_new=12345&password_conf=12345&Change=Change#并在该浏览器的一个新的界面打开这个URL,我们发现密码同样被修改了。这里我们就实现了一次CSRF漏洞攻击,当然这里我们构造的URL就太明显了,因此我们可以将其包装一下。比如这里我们写一个CSRF.php文件,里面内容可以简单一点类似:<img src="http://127.0.0.1/DVWA-1.9/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#"/>然后我们将其放在PhpStudy的WWW目录下,接着我们在同一个浏览器打开127.0.0.1/CSRF.html,这时显示的是这样一个图像但是我们重新登陆DVWA时,发现实际上密码已经被修改了。接下来我们看一下Low级别的代码:<?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 = mysql_real_escape_string( $pass_new ); $pass_new = md5( $pass_new ); // Update the database $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $result = mysql_query( $insert ) or die( '

' . mysql_error() . '
' ); // Feedback for the user echo "
Password Changed.
"; } else { // Issue with passwords matching echo "
Passwords did not match.
"; } mysql_close();} ?> 这里仅仅对两次输入的密码是否相同进行了判断,没有做任何的防御。因此我们只需要用户在cookie还有效的时间内在相同的浏览器访问我们给定的url,即可实现攻击。

3.难度级别Medium级别。我们先把密码修改回之前的密码password,然后再在浏览器打开之前我们构造的网站:127.0.0.1/CSRF.html,然后重新登陆DVWA发现密码被修改成了123456,很显然我们攻击成功了。我们在来看一下Medium级别的代码分析一下,相比于Low级别哪里得到了提升。

<?php if( isset( $_GET[ 'Change' ] ) ) { // Checks to see where the request came from if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) { // 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 = mysql_real_escape_string( $pass_new ); $pass_new = md5( $pass_new ); // Update the database $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';"; $result = mysql_query( $insert ) or die( '
' . mysql_error() . '
' ); // Feedback for the user echo "
Password Changed.
"; } else { // Issue with passwords matching echo "
Passwords did not match.
"; } } else { // Didn't come from a trusted source echo "
That request didn't look correct.
"; } mysql_close();} ?>

可以看到这里在获取 p a s s n e w 和 pass_new和 passnewpass_conf这两个变量之前,先利用一个if语句来判断“$_SERVER[‘HTTP_REFERER’]”的值是否是127.0.0.1。这是一种基本的防御CSRF攻击的方法:验证HTTP Referer字段。我们发现这里用了eregi()函数对HTTP的referer进行了一个判断,由于我们构造的网站就是在本机上所以其Referer中就包含了DVWA平台的主机号,那如果是在另外的地方搭建的网站,我们也可以进行绕过,比如我们可以将构造的文件的名字更改为对方主机名即可,比如X.X.X.X.html我们可以再次使用之前的方法来实施CSRF攻击,可以发现已经不起作用了。下面就来解释一下这种防御方法的原理。根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。比如下面这个利用Burpsuite拦截到的数据包,数据要提交到的页面是upfile_Other.asp,而我们是通过Referer字段后的http://192.168.80.131/upload_Other.asp这个页面发起的请求。在通常情况下,访问一个安全受限页面的请求应来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallor,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。这时,该转帐请求的Referer值就会是转账按钮所在的页面的URL,通常是以bank.example域名开头的地址。而如果***要对银行网站实施CSRF攻击,他只能在他自己的网站构造请求,当用户通过攻击者的网站发送请求到银行时,该请求的Referer是指向攻击者自己的网站。因此,要防御CSRF攻击,银行网站只需要对于每一个转账请求验证其Referer值,如果是以bank.example开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果Referer是其他网站的话,则有可能是攻击者的CSRF攻击,拒绝该请求。在DVWA中,管理员是通过本地地址127.0.0.1来访问密码修改页面的,因而对于任何一个修改密码的请求,如果其Referer不是127.0.0.1,那么就判断为CSRF攻击,而予以拒绝。然而这种方法并非万无一失,由于Referer的值是由浏览器提供的,对于某些浏览器,可以利用一些方法来篡改Referer值。所以攻击者完全可以把用户浏览器的Referer值修改为需要的地址,这样就可以通过验证,从而进行 CSRF攻击。另外即使攻击者无法篡改Referer值,这种方

猜你喜欢

转载自blog.csdn.net/weixin_43510203/article/details/109266817