DVWA 初次尝试(下)

SQL Injection (Blind)(SQL盲注)

Low

在这里插入图片描述

查看源码,可以发现没有任何的过滤以及进行检查的语句,我们可以先进行测试
在这里插入图片描述
在这里插入图片描述

我们可以发现无论输入什么都只会出现这两个语句,即由此可以判断出这就是盲注。
当我们进行盲注时,不会进行报错,只会对我们输入的命令进行判断,判断是否正确。

一、以布尔盲注示例:(根据显示存在与否来进行判断)

  1. 判断是否存在注入,以及注入的是字符型还是数字型
    输入 1 显示存在
    输入1’ and 1=1# 显示存在
    输入1’ and 1=2# 显示不存在
    即是存在字符型的SQL注入

  2. 猜当前的数据库名称
    <1.猜数据库的长度
    <2.猜数据库的名称
    输入1’ and length((database())=1 #
    在这里插入图片描述

    输入 1’ and length(database())=4 #
    在这里插入图片描述

    即数据库名长度为4
    输入1’ and ascii(substr(database(),1,1))>97 # //即数 据库名的第一个字符的ascii的值大于97
    在这里插入图片描述

    输入1’ and ascii(substr(database(),1,1))<100 #
    在这里插入图片描述

    输入1’ and ascii(substr(database(),1,1))>100 #
    在这里插入图片描述

    即数据库名称的第一个字符是d,重复上述步骤就可以猜出完整的数据库名:dvwa

  3. 猜数据库中数据表的名称
    <1.猜数据库中有几个数据表
    <2.分别猜各个数据表名的长度
    ❤️.分别猜各个数据表的名称
    输入1’ and (select count(table_name) from information_schema.tables where table_schema=database())=1 #
    在这里插入图片描述

    输入1’ and (select count(table_name) from information_schema.tables where table_schema=database())=2 #
    在这里插入图片描述

    即数据库中有两个表
    
  4. 猜表中的字段名
    <1.猜数据表中有几个字段
    <2.分别猜各个字段名的长度
    ❤️.分别猜各个字段名的名称

  5. 猜自己想要的数据
    Ps:在测试的过程中可以用二分法,这样可以减少测试的时间。

二、以时间盲注示例:(根据是否有明显延迟现象进行判断)
步骤与布尔盲注相同。

  1. 判断是否存在注入
    输入1’ and sleep(5) # //感觉到明显延迟
    输入1 and sleep(5) # //没有延迟
    即是基于字符型的盲注
  2. 猜数据库名长度
    输入1’ and if(length(database())=1,sleep(5),1) //没有延迟
    输入1’ and if(length(database())=4,sleep(5),1) //感觉到明显延迟
    即数据库的长度为4
    其余步骤类似
    更多可参考sqli-labs中盲注的内容
Medium

在这里插入图片描述

查看源码,我们可以看到代码中有mysql_real_escape_string函数对特殊符号\x00,\n,\r,,’,",\x1a进行了转义,并且输入框页变成了下拉选择表单,控制用户的输入
在这里插入图片描述

此时,我们可以通过抓包更改参数id的值同样可以完成注入

High

在这里插入图片描述

查看源码,我们可以看到代码利用cookie传递参数id,并且在SQL查询语句中添加了LIMIT 1L来控制只输出一个结果。
在这里插入图片描述

当SQL查询结果为空时,会执行函数sleep来防止进行基于时间的盲注。
虽然添加了TIMIT 1,我们可以通过#将其注释掉,因为有sleep函数对时间盲注进行了干扰,所以我们在此进行基于布尔的盲注,通过抓包更改cookie中的参数id

Impossible

在这里插入图片描述

查看源码,我们可以看到采用了PDO技术,划清了代码和数据的界限,能够有效防御SQL注入。
在这里插入图片描述

Anti-CSRF token机制的加入了进一步提高了安全性。

Weak Session IDs

Session利用的实质 :

由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登陆过程(比如密码),就可以轻易获取访问权限,无需登录密码直接进入特定用户界面, 进而查找其他漏洞如XSS、文件上传等等。

Session劫持 :

就是一种通过窃取用户SessionID,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫SessionID还可以保存在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。

Low

在这里插入图片描述
查看一下服务端php源码

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (!isset ($_SESSION['last_session_id'])) {
        $_SESSION['last_session_id'] = 0;
    }
    $_SESSION['last_session_id']++;
    $cookie_value = $_SESSION['last_session_id'];
    setcookie("dvwaSession", $cookie_value);
}
?> 

从源码上来看 没有设置任何过滤,我们对页面进行抓包
在这里插入图片描述

可以清楚地看到cookie的内容
在这里插入图片描述
并且每重新抓一次包,dvwaSession就会增加1
所以我们构造代码
Cookie: dvwaSession=15; security=low; PHPSESSID=0oq01of215s4qescnc3aeqbooi
通过火狐浏览器的hackbar,提交,选择cookie提交方式,提交后发现直接登录dvwa,绕过密码验证:
在这里插入图片描述

Medium

在这里插入图片描述查看源码
在这里插入图片描述
可以看到这是基于时间戳生成dvwaSesion的,我们可以直接利用在线工具来对时间戳进行转换。通过设置时间戳,可以知道诱骗受害者在哪个时间点进行点击。
在这里插入图片描述
在这里插入图片描述

High

在这里插入图片描述
查看源码
在这里插入图片描述
high级别使用了PHP setcookie()函数,来设置cookie。setcookie() 函数向客户端发送一个 HTTP cookie。我们还可以看到这里对dvwaSession的值进行了md5计算,并且还设置了dvwaSession的有效期进一步增加安全性。
在这里插入图片描述
我们经过MD5解密可以发现
在这里插入图片描述
high级别也是从零开始的整数进行加密,所以我们同上我们构造一个代码提交即可。

Impossible

在这里插入图片描述

根据源代码我们可以看到$cookie_value采用随机数+时间戳+固定字符串"Impossible",再进行sha1运算,我们无法猜测到dvwaSession的值。

DOM Based Cross Site Scripting (XSS)

dom xss的产生并没有和后台服务器产生交互,而是通过浏览器的dom树解析产生的

Low

在这里插入图片描述
我们查看一下源码
在这里插入图片描述

可以看到这里的传参方式是get类型,并且参数名称是default,我们直接构造代码
?default=< script>alert(‘xss’)< /script>
在这里插入图片描述
获得弹框。查看服务端的php文件

在这里插入图片描述
可以看到没有任何php代码即没有限制条件,所以直接通过构造参数值即可。

Medium

在这里插入图片描述
与low一样,我们看一下源码
在这里插入图片描述
没有什么不一样的地方,像low一样构造恶意代码进行尝试
在这里插入图片描述
发现没有成功弹窗。查看服务端php代码
在这里插入图片描述
从源码中我们可以看到,参数default中不允许出现“<script”字符,还出现了stripos函数。stripos() 函数的作用是查找字符串在另一字符串中第一次出现的位置(不区分大小写),并且stripos() 函数是不区分大小写的。所以还防止了通过大小写进行绕过。
1.我们可以通过将恶意代码注释掉的方式进行绕过,在“?default=< script>alert(‘xss’)< /script>”添加“#”,那么“#”之后的数据不会发送到服务器端,从而进行绕过
在这里插入图片描述
2.我们还可以利用< img>标签的onerror事件进行绕过
构造代码:?default=</ option></ select>< img src=xss οnerrοr=alert(/xss/)>
在这里插入图片描述
注意要在< img>标签前添加标签</ option>和标签</ select>进行闭合。

High

在这里插入图片描述查看源码,我们可以看到只允许对下拉框里面的内容进行选择,如果不对default则会重置回默认值。
那么我们可以在参数default值的English后面构造恶意代码,并且用"#"将其注释掉进行绕过
构造代码:?default=English#< script>alert(‘xss’)</ script>
在这里插入图片描述

Impossible

在这里插入图片描述
发现后端没有任何处理,我们输入恶意代码进行测试
在这里插入图片描述
在输入框出现了乱码,我们查看前端代码
在这里插入图片描述
可以看到客户端所做的"防护"就是将default参数的值全部进行URL编码, 没有进行相应的解码就直接赋给value, 从根本上斩除了xss漏洞。

Reflected Cross Site Scripting (XSS)

在这里插入图片描述
我们在输入框里输入字符测试一下
在这里插入图片描述
我们看到页面有返回值,看一下服务端php代码
在这里插入图片描述
从源码中可以看到,代码直接引用了参数name,没有做任何过滤措施,所以我们直接在输入框中输入恶意代码即可

在这里插入图片描述

Meduim

在这里插入图片描述
从源代码里可以看到,输入框中输入字符< script>则会被替代成空。对字符“< script>”进行了过滤。
1.我们可以通过双写关键字进行绕过 即在输入框中输入<< script>script>alert(‘xss’)</ script>
在这里插入图片描述
2.我们可以通过大小写混写进行绕过 即在输入框中输入< Script>alert(‘xss’)</ script>
在这里插入图片描述

High

在这里插入图片描述
我们从源码中可以看到,出现了preg_replace() 函数,此函数用于正则表达式的搜索和替换,并且正则表达式中的i不区分字母的大小写,所以这就避免了通过大小写和双写进行绕过。
但是我们可以通过标签< img>进行绕过,在输入框内输入< img src=1 οnerrοr=alert(‘xss’)>
在这里插入图片描述

Impossible

在这里插入图片描述
根据源代码 ,我们可以发现在代码中加入了Anti-CSRF token机制,并且有htmlspecialchars()函数将输入内容进行编码将其转换为 HTML 实体。

Stored Cross Site Scripting (XSS)

Low

在这里插入图片描述
我们可以看到出现了两个输入框,输入1进行测试
在这里插入图片描述
页面返回了输入信息,查看服务端php代码

<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

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

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

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $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>' );

    //mysql_close();
}

?> 

根据源码,我们可以看到在代码中没有任何防御措施,所以我们直接在输入框中输入恶意代码即可

在这里插入图片描述
当我们在name框中输入时发现有字数限制,所以我们在message框中输入

在这里插入图片描述
name框不能为空,输入1,即可获得弹窗
在这里插入图片描述

Medium
<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = str_replace( '<script>', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $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>' );

    //mysql_close();
}

?> 

先查询一下代码中不熟悉的函数
1.trim() 函数移除字符串两侧的空白字符或其他预定义字符。
2.strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。并且该函数始终会剥离 HTML 注释,这点无法通过 allow 参数改变。
3.addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
并且message框被htmlspecialchars()函数限制对输入字符进行了编码,name框中的“< script>”也被替代成空。因为这里对message框的输入字符做了严格的过滤,所以我们利用name框,但是因为name框对输入字数有限制,所以我们通过抓包修改。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

High
<?php

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = strip_tags( addslashes( $message ) );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $message = htmlspecialchars( $message );

    // Sanitize name input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $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>' );

    //mysql_close();
}

?>

在源码中加入了正则表达式,所以我们不能通过双写关键字和对字符进行大小写混写来绕过,我们可以通过其他的标签来进行绕过,抓包改参。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Impossible
<?php

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

    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

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

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

    // Update database
    $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
    $data->bindParam( ':message', $message, PDO::PARAM_STR );
    $data->bindParam( ':name', $name, PDO::PARAM_STR );
    $data->execute();
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

从源代码中可以看到,通过使用htmlspecialchars函数,解决了XSS。
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

Content Security Policy (CSP) Bypass

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。
两种方法可以启用 CSP
一种是通过 HTTP 响应头信息的Content-Security-Policy字段。
一种是通过网页的标签。

Low
<?php

$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com  example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, jquery and google analytics.

header($headerCSP);

# https://pastebin.com/raw/R570EE00

?>

从源代码中我们可以看到,罗列出了允许JavaScript的网站

在这里插入图片描述
我们可以在pastebin网站上自己写一个javascript代码alert(“hi borrrring”),保存后复制链接
https://pastebin.com/raw/b9CMrHBb
在输入框中输入这个网址
在这里插入图片描述
在这里插入图片描述

就可以看到在pastebin上保存的js代码被执行了。这是因为pastebin网站是被信任的。攻击者可以把恶意代码保存在受信任的网站(白名单)上,然后把链接发送给用户点击,实现注入。

Medium
<?php

$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";

header($headerCSP);

// Disable XSS protections so that inline alert boxes will work
header ("X-XSS-Protection: 0");

# <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

?>

根据源码我们可以看到http请求头中的“script-src”白名单不再是信任的网站了,而是要用内联资源。
1.unsafe-inline,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。
2. nonce-source,仅允许特定的内联脚本块,nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=”
因为有特定的内联脚本块,所以我们直接在框内输入给定的内容即可

<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("hi borrrring")</script>

在这里插入图片描述

High

在这里插入图片描述
我们可以看到high级别没有输入框,并且只能计算最后值。查看php源码

<?php
$headerCSP = "Content-Security-Policy: script-src 'self';";

header($headerCSP);

?>

可以看到设置成了只信任自己的域名,并且客户端在点击完按钮之后,会在html中创建

<script src="http://192.168.11.102/vulnerabilities/csp/source/jsonp.php?callback=solveSum"></script>

我们就可以利用参数callback进行注入。

Impossible

在这里插入图片描述
我们可以看到 url 中没有参数callback 了,没有可以进行注入的地方。
这一关参考博客 https://www.cnblogs.com/jojo-feed/p/10204588.html

最后一关先搁置一下 看不懂了实在是 等我学两天JS再回来继续搞吧~

暂时性完结~~ 撒花~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值