dvwa靶场

brute force

LOW

输入账号密码直接抓包就行


接着ctrl+i传输到intruder模块中

为需要爆破的加上 §,不爆破的不加

选择攻击类型为Cluster bomb,选择username和password的参数作为爆破点;

Cluter bomb是两个字典进行交叉枚举,适用于用户名密码的破解。

payload中选择字典,开始爆破,然后寻找长短不一样的账户,这些多半就是账号密码

MIDDLE

与low差不多

HIGH

输入账号密码开始抓包,发现有个user_token,

token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。

当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。

选择password和token作为爆破点,同时burp选择pitchfork模式

Pitchfork – 这一模式是使用多个payload组。对于定义的位置可以使用不同的payload组。攻击会同步迭代所有的payload组,把payload放入每个定义的位置中。比如:position中A处有a字典,B处有b字典,则a【1】将会对应b【1】进行attack处理,这种攻击类型非常适合那种不同位置中需要插入不同但相关的输入的情况。请求的数量应该是最小的payload组中的payload数量。

首先在option中

还有,这里要是1才行

payload1:普通字典即可

开始爆破

command injection(命令行注入)

Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的

常用连接符

&&:前一个指令执行成功,后面的指令才继续执行,就像进行与操作一样

||:前一个命令执行失败,后面的才继续执行,类似于或操作

&:直接连接多个命令,同时执行

|:管道符,将前一个命令的输出作为下一个命令的输入

;:直接连接多个命令,不管前面命令执行成功没有,后面的命令继续执行

常用命令:

ls :列出当前文件夹的内容;

sleep 5:观察是否存在时间差来检测是否存在漏洞;

whoami:当前的用户;

cat /etc/shadow:影子文件,存储linux中用户的密码信息

ls -alh /home/:查看用户

ls -alh /home/用户名/ : 查看具体用户的目录

usname -a:查看系统信息

LOW

可以使用127.0.0.1&&ipconfig直接开始搞

MIDDLE

绕过:

127.0.0.1&ipconfig
会把;改为空格:127.0.0.0&;&ipconfig
第一个执行失败,执行第二个:asdf||ipconfig

HIGH

过滤不严格,使用|绕过
127.0.0.1|ipconfig

CSRF

CSRF 跨站请求伪造介绍

跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或者 Session Riding ,通常缩写为CSRF,是一种对网站的恶意利用。通常利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害者不知情的情况下以受害者的身份向服务器发送请求,从而完成非法操作(改密)。CSRF与XSS最大的区别在于,CSRF并没有盗取cookie而是直接利用。

CSRF(low)
进入CSRF,修改密码为123

修改成功,可以看到链接为get请求,其中中包含了我们要修改的密码,当然我们可以更改其中的参数
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123&password_conf=123456&Change=Change#
更改新的密码为123456,在浏览器复制以下链接,直接将密码修改成123456
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

需要注意的是,必须使用之前登录的浏览器打开链接才能修改成功。所以CSRF攻击的前提是目标网站存在CSRF,而且受害者需要保持目标站点的登录活动状态,还需要点击钓鱼链接。

CSRF攻击的改进:
1、生成短链接
2、将CSRF代码嵌入其他网页

<img src="http://192.168.115.130:89/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change#" border="0" style="display:none;"/>
<h1>404<h1>
<h2>file not found.<h2>

代码分析:low级别的CSRF源码,利用mysql_real_escape_string()函数对$pass_new和$pass_conf变量进行了过滤,可以防止SQL注入,但无法阻止CSRF攻击。

<?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);
}

?> 

CSRF(medium)

代码分析:
medium级别的CSRF源码,在获取$pass_new和$pass_conf两个变量之前,先利用if语句以及eregi()函数来判断"$_SERVER['HTTP_REFERER']"的值是否是主机ip。
stripos()函数查找字符串在另一个字符串中第一次出现的位置(不区分大小写),如何没有找到返回false。

<?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);
}

?> 

小笔记:HTTP头中的Referer字段,记录了该HTTP请求的来源地址
上述过滤规则是http的Referer参数的值中必须包含主机名,可以将攻击页面命名为ip.html(页面被放置在攻击者的服务器里)就可以绕过了

CSRF(high)

high级别的代码增加了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端请求。

<?php

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

    // 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);
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

只有获取token才能进行CSRF,但是浏览器的跨域问题,不能直接获取,所以比较难利用。但是如果服务器存在存储XSS可以来获取token, 然后构造url和代码进行CSRF利用。所以high级别的CSRF将会组合存储XSS一起利用。

文件包含

File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。

文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。当被包含的文件在服务器本地时,就形成的本地文件包含漏洞,被包涵的文件在第三方服务是,就形成了远程文件包 含漏洞。

需要敏感

?page=a.php
?home=a.html
?file=content

目录遍历是可以读取web根目录以外的其他目录,根源在于web application的路径访问权限设置不严,针对的是本系统。
文件包含是通过include函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含。

做一下upload靶场就了解了

LOW

利用include,require等,从一个文件读取另外一个文件

MIDDLE

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?> 

对http://进行过滤,不过可以用hthttp://tp://(双写)方式绕过

HIGH

<?php
// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}
?> 

利用file协议绕过防护策略。
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file:///c:/phpStudy_64/phpstudy_pro/WWW/DVWA/phpinfo.php

文件上传

LOW

直接上传一句话木马就行了,

MIDDLE

上传图片马,然后用burp抓包修改后缀为.php

HIGH

上传一个图片马,不修改后缀,然后使用其他文件,用include方式来引入图片马

验证码

LOW

从代码中可知,只使用了step和changge来判断是不是通过验证,

只需要抓包,然后修改step就行

MIDDLE

Medium级别的代码在第二步验证时,参加了对参数passed_captcha的检查,如果参数值为true,则认为用户已经通过了验证码检查,然而用户依然可以通过伪造参数绕过验证,本质上来说,这与Low级别的验证没有任何区别。

HIGH

<?php 
 
if( isset( $_POST[ 'Change' ] ) ) { 
    // Hide the CAPTCHA form 
    $hide_form = true; 
 
    // Get input 
    $pass_new  = $_POST[ 'password_new' ]; 
    $pass_conf = $_POST[ 'password_conf' ]; 
 
    // Check CAPTCHA from 3rd party 
    $resp = recaptcha_check_answer( $_DVWA[ 'recaptcha_private_key' ], 
        $_SERVER[ 'REMOTE_ADDR' ], 
        $_POST[ 'recaptcha_challenge_field' ], 
        $_POST[ 'recaptcha_response_field' ] ); 
 
    // Did the CAPTCHA fail? 
    if( !$resp->is_valid && ( $_POST[ 'recaptcha_response_field' ] != 'hidd3n_valu3' || $_SERVER[ 'HTTP_USER_AGENT' ] != 'reCAPTCHA' ) ) { 
        // What happens when the CAPTCHA was entered incorrectly 
        $html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>"; 
        $hide_form = false; 
        return; 
    } 
    else { 
        // CAPTCHA was correct. Do both new passwords match? 
        if( $pass_new == $pass_conf ) { 
            $pass_new = mysql_real_escape_string( $pass_new ); 
            $pass_new = md5( $pass_new ); 
 
            // Update database 
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;"; 
            $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' ); 
 
            // Feedback for user 
            echo "<pre>Password Changed.</pre>"; 
        } 
        else { 
            // Ops. Password mismatch 
            $html     .= "<pre>Both passwords must match.</pre>"; 
            $hide_form = false; 
        } 
    } 
 
    mysql_close(); 
} 
// Generate Anti-CSRF token 
generateSessionToken(); 
 
?> 

服务器的验证逻辑是当$ resp(这里是指谷歌返回的验证结果)是false,并且参数recaptcha_response_field不等于hidd3n_valu3(或者http包头的User-Agent参数不等于reCAPTCHA)时,就认为验证码输入错误,反之则认为已经通过了验证码的检查。
搞清楚了验证逻辑,剩下就是伪造绕过了,由于$resp参数我们无法控制,所以重心放在参数recaptcha_response_field、User-Agent上。

weak sessionid

用户访问服务器的时候,一般服务器都会分配一个身份证 session id 给用户,用于标识。用户拿到 session id 后就会保存到 cookies 上,之后只要拿着 cookies 再访问服务器,服务器就知道你是谁了。
但是 session id 过于简单就会容易被人伪造。根本都不需要知道用户的密码就能访问,用户服务器的内容了

LOW

按键点击一次,dvwasession就会+1,不安全

MIDDLE

按照时间获取dvwasession,时间戳转化器

HIGH

使用setcookie()设置cookie,

**setcookie(name,value,expire,path,domain,secure,httponly)**
 - 参数 	             描述 
 - name 	    必需。规定cookie的名称。 
 - value 	   必需。规定cookie的值。 
 - expire   	可选。规定cookie的有效期。 
 - path 	   可选。规定cookie的服务器路径。 
 - domain 	    可选。规定cookie的域名。 
 - secure 	   可选。规定是否通过安全的HTTPS连接来传输cookie。 
 - httponly 	可选。规定是否Cookie仅可通过HTTP协议访问。

使用MD5来解密dvwasession,站长工具——MD5解密

xss(reflected)

LOW

<script>alert('adfa')</script>

MIDDLE

<script>被替换为了空格
绕过:

1.大小写绕过:
<ScRipt >alert(/xss/);</ScRipt>

2.双写方式绕过 str_replace()函数
<scr<script>ipt>alert(/xss/);</script>

3.使用非 script 标签的 xss payload

img标签:
<img src=1 onerror=alert('xss')>
<img src="1" onerror=eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29")></img>

iframe标签:
<iframe onload=alert(1)>
<iframe src=javascript:alert('xss');height=0 width=0 /><iframe>

HIGH

preg_replace() 函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。

虽然无法使用<script>标签注入XSS代码,但是可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。输入
<img src=1 onerror=alert(/xss/)>
<body onload=alert('XSS')>
<iframe onload=alert(/xss/)>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></object>

XSS(store)

函数介绍:
isset()函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false
trim()函数作用为移除字符串两侧空白字符或其他预定义字符
stripslashes()函数用于删除字符串中的反斜杠
mysq1i_real_escape_string()函数会对字符串中的特殊符号(\x00,\n,\r,\,’,",\x1a)进行转义
在代码中对message,name输入框内容没有进行XSS方面的过滤和检查。且通过query语句插入到数据库中。所以存在存储型XSS漏洞

LOW

前端html中对name有字数长度限制:	Burpsuite抓包改为<script>alert(/xss/)</script>:

MIDDLE

strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签。

addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。

可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤了

使用非 script 标签的 xss payload:< img src=1 οnerrοr=alert(/xss/)>

HIGH

这里使用正则表达式过滤了< script>标签,但是却忽略了img、iframe等其它危险的标签,因此name参数依旧存在存储型XSS。
Burpsuite抓包改name参数为< img src=1 οnerrοr=alert(/xss/)>

posted @ 2021-02-26 00:22  upstream_yu  阅读(282)  评论(0编辑  收藏  举报