DVWA--全等级XSS反射型(Reflected)

在练习之前我们来讲一讲XSS的基本知识吧!

什么是XSS攻击:
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制–例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。

XSS分类:
类型A,DOM型,本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。
(也就是web开发人员在编写网页脚本时无意间造成的错误)
类型B,反射式漏洞,这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。
(简单解释一下大致意思,当用户在网站的地址栏输入URL,从服务器端获取到数据时,网站页面会根据返回的信息而呈现不同的返回页面,如果这个时候恶意用户在页面中输入的数据不经过验证且不经过超文本标记语言的编码就录入到脚本中,就会产生漏洞)
类型C,存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。这种类型的漏洞 可以使恶意用户将javascrip永久性的存储在数据库中。

XSS攻击流程大致如下:
1,发现存在webXSS漏洞web,
2,恶意用户通过该漏洞将javascrip插入到该web的脚本中,等待或欺骗新用户去访问。当用户打开此含有XSS漏洞的页面,脚本运行。如果这个代码是用来获取用户的个人信息,就返回一个信息输入页面,当用户将个人用户信息输入后,当窃取到用户信息后,将该信息发送到恶意用户自行搭建的获取信息的接口。
在这里插入图片描述

介绍完了XSS漏洞的基本含义。作为测试漏洞是否存在的一方,当然要知道如何去寻找漏洞。
1。首先寻找漏洞输入点,一般在客户端界面显示为留言板或查询接口等。
2。当找到这样类似的漏洞输入点后,并不急于去构造相应的payload,而是通过输入一组字符外加一个特殊的识别符(可以是数字组合),提交后查看返回的源码,看是否服务器端做出了上述所说的处理即是否从客户端提交的数据有做相应的过滤或对返回的数据做相应的代码转译。而特殊的识别符就是观察点。如果输入的识别符被原封不动的返回,就说明有很大的几率存在XSS漏洞。
3。最后,根据输出点所在的html译文或者javascrip代码的上下文去构造闭合,最后构造payload

 

反射型XSS漏洞:
如果一个应用程序使用动态页面向用户显示错误消息,就会造成一种常见的XSS漏洞。通常,该页面会使用一个包含消息文本的参数,并在响应中将这个文 本返回给用户。对于开发者而言,使用这种机制非常方便,因为它允许他们从应用程序中调用一个定制的错误页面,而不需要对错误页面中的消息分别进行硬编码。

Low

我们还是先来看一下源码吧!

 1 <?php
 2 
 3 header ("X-XSS-Protection: 0");
 4 
 5 // Is there any input?
 6 if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
 7     // Feedback for end user
 8     $html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
 9 }
10 
11 ?>

从代码我们知道并没有有对参数name做任何过滤,知识单纯的判断是否为空,所以很明显存在XSS漏洞注入。

array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。

所以当我们输入指令时,会很容易的执行:

<script>alert('我是谁')</script> 直接就执行了我们的 js 代码

 

Medium

源码:

 1 <?php
 2 
 3 header ("X-XSS-Protection: 0");
 4 
 5 // Is there any input?
 6 if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
 7     // Get input
 8     $name = str_replace( '<script>', '', $_GET[ 'name' ] );
 9 
10     // Feedback for end user
11     $html .= "<pre>Hello ${name}</pre>";
12 }
13 
14 ?>

 

从源码可以看出,这里的str_replace()函数$name = str_replace( '<script>', '', $_GET[ 'name' ] )只把“<script>”做了一次过滤,那我们就对其进行饶过:

1、我们常见的双写饶过:因为只过滤了一次,所以我们搞成双写的完整的过滤了,可是不完整的拼好了,嘻嘻。

<s<script>cript>alert("我拼好了")</script>

 

 2、我们还可以来进行大小写混合,全是大写过滤,只要不全是小写就可以。

 

<SCRIPT>alert("我变大了")</SCRIPT>

 

 好了,就先这样啊吧!

 

High

源码:

 1 <?php
 2 
 3 header ("X-XSS-Protection: 0");
 4 
 5 // Is there any input?
 6 if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
 7     // Get input
 8     $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
 9 
10     // Feedback for end user
11     $html .= "<pre>Hello ${name}</pre>";
12 }
13 
14 ?>

我们可以看到,

$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

这个级别的把sccript里面的单个字母都给过滤了,并且不区分大小写,那就是说不能用这个标签了。

但是我们可以通过img、body、i等标签的事件或者iframe等标签的src注入恶意的js代码。

Img标签:

<img src=1 onerror=alert("我试试额")>  这句话的意思是scr=1错误就执行alert("我试试额"),显而易见:

 

 

 

 

iframe标签:

<iframe onload=alert(1)>

 

Impossible

查看源码:

 1 <?php
 2 
 3 // Is there any input?
 4 if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
 5     // Check Anti-CSRF token
 6     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
 7 
 8     // Get input
 9     $name = htmlspecialchars( $_GET[ 'name' ] );
10 
11     // Feedback for end user
12     $html .= "<pre>Hello ${name}</pre>";
13 }
14 
15 // Generate Anti-CSRF token
16 generateSessionToken();
17 
18 ?>

以看到,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。可以看出,impossible级别的代码先判断name是否为空,不为空的话然后验证其token,来防范CSRF攻击。然后再用htmlspecialchars函数将name中的预定义字符转换成html实体,这样就防止了我们填入标签.

 

posted @ 2020-04-03 21:29  心态要好(✪▽✪)  阅读(449)  评论(0编辑  收藏  举报