dvwa-xss

XSS

跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。

攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。

HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。

DOM

DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。

DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。

在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。

LOW

我也很好奇注入点会在哪里?然后根据页面的设计点了一下

你会发现所做出的的选择会显示在url上

看看源代码

牛,没有防护

运行成功

MEDIUM

来看看源码

这里先检查了default参数是否为空,如果不为空则将default等于获取到的default值。这里还使用了stripos 用于检测default值中是否有 <script ,如果有的话,则将 default=English

stripos() 函数返回字符串在另一个字符串中第一次出现的位置。

如果没有找到该字符串,则返回 false。

如果区分大小写的话,算了试一下,无弹窗,返回了English

这里使用了<img scr=1 onerror=alert(‘hack’)>,没有回显,但是成功注入进了蓝色那行中,那么这里只要先将提前注入,即可将语句闭合,实现xss注入

HIGH

这里对default的内容,通过switch枚举进行判断

这里可以通过#进行注入

原理:在URL中#表示的是一个锚点。在浏览器识别url的时候,会把#后的字符当做页面的定位,然后加载页面的时候,直接定位到指定的标签。因此#后面的字符是不会被浏览器发送到服务器端的。这样就实现了绕过服务器端的防御机制。而依赖DOM修改html结构执行的是js代码,这个执行过程是在客户浏览器端的,因此实现了不经过服务器就可以实现xss注入。

IMPOSSIBLE

防护都在客户端了

看了前端的代码感觉和前面挺像的

就拿之前的攻击代码试了一下

都进了框里

#也是不能使用的

与high的前端代码比较后发现

这里的lang没有像之前一样经过decodeURL解码。因此输入进去的数据都会经过url编码呈现到页面上。

REFLECTED

当用户在网站的地址栏输入URL,从服务器端获取到数据时,网站页面会根据返回的信息而呈现不同的返回页面,如果这个时候恶意用户在页面中输入的数据不经过验证且不经过超文本标记语言的编码就录入到脚本中,就会产生漏洞

LOW

我输什么就hello什么,那我直接放一段代码

1
<script>alert('vincent')</script>

看看源码

好家伙,这波是真的零防护

MEDIUM

拿之前的代码试了一下,发现回显中<script*>与</script*>都不见了

查看源代码

果然,这里过滤了<script*>那用

1
<img src=1 onerror=alert(/vincent/)>

即可,

当然也可以大小写混写,

1
<scRipt>alert(/VINCENT/)</script>

以及双写的方式进行绕过

1
<sc<script>ript>alert(/vincent/)</script>

HIGH

直接看源码吧

preg_replace() 函数用于正则表达式的搜索和替换,

.*具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。

这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。

直接用

1
<img src=1 onerror=alert(/vincent/)>

绕过即可

IMPOSSIBLE

anti-csrf 好久不见

同时,Impossible级别的代码使用htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。

STORED

存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,黑客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。这种类型的漏洞 可以使恶意用户将javascrip永久性的存储在数据库中。

LOW

看得出来,这里对name的输入进行了长度限制,那不如在message处注入,但是我这里试了多次之后

并没有回应(之后刷新后发现,均注入成功且出现弹窗),抓个包试试好了

我在name处改写了代码后,放包,出现弹窗,再加上之前在message处写的,所以弹出了两次

来看看源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?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();

}



?>

相关函数介绍

trim(string,charlist)

函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。

mysql_real_escape_string(string,connection)

函数会对字符串中的特殊符号(\x00,\n,\r,\,’,”,\x1a)进行转义。

stripslashes(string)

函数删除字符串中的反斜杠。

可以看到,对输入并没有做XSS方面的过滤与检查,且存储在数据库中,因此这里存在明显的存储型XSS漏洞。

MEDIUM

上面为输入,底下为输出,你会发现<script*>被过滤了,尝试一下双写与大小写混合

无弹窗

无弹窗

最后显示如下

看了源代码,发现漏洞在name上,抓包进行注入即可成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?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();

}



?>

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

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

可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤了<script*>字符串,仍然存在存储型的XSS。

HIGH

看完源码后发现,这里只对<script*>一系列进行防护,并没有对其余的尖括号有防护措施

1
<img src=1 onerror=alert('vincent')>

即可成功

IMPOSSIBLE

看了源码发现均使用了htmlspecialchars函数,解决了XSSstored的问题。从网上了解,该函数若使用不当,依然存在绕过的机会。

参考链接:

https://baike.baidu.com/item/XSS%E6%94%BB%E5%87%BB/954065?fr=aladdin

https://www.cnblogs.com/yyxianren/p/11381304.html

https://blog.csdn.net/qq_36119192/article/details/82932557

https://www.freebuf.com/articles/web/123779.html

https://blog.csdn.net/weixin_44720762/article/details/89637370