DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)

图片描述

XSS-跨站脚本攻击,在某种意义上也是一种注入型攻击
XSS不仅仅限于JavaScript,还包括flash等其它脚本语言
根据恶意代码 是否存储在服务器中,XSS可以分为存储型的XSS(Stored)与反射型的XSS(Reflected)
DOM型的XSS由于其特殊性,是一种基于DOM树的XSS,被分为第三种

XSS(Reflected)

Low

代码分析

Hello ' . $_GET[ 'name' ] . '
'; } ?> #array_key_exists()函数检查数组里是否有指定的键名或索引。有返回true,没有返回false

可以看到,代码直接引用了name参数,并没有任何的过滤与检查,存在明显的XSS漏洞

操作步骤

输入

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第1张图片
可以看到成功出现弹窗

F12进入开发者模式可以看到浏览器成功将我们的输入作为HTML元素解释运行

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第2张图片


Medium

代码分析

', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "
Hello ${name}
"; } ?>

Medium级别的代码相对于Low级别的代码使用str_replace函数将输入中的
2.使用大小写绕过,输入
3.输入其他标签,如
可以看到结果:

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第3张图片

获取到了当前用户的cookie,这结合csrf(跨站请求伪造)攻击危害是很大的


High

代码分析

Hello ${name}
"; } ?>

可以看到High级别的代码使用了preg_replace函数执行一个正则表达式的搜索和替换
其中/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i是正则表达式(.*)表示贪婪匹配,/i表示不区分大小写
所以在High级别的代码中,所有关于

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第4张图片

点击Forward得到结果

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第5张图片

F12打开开发者模式可以看到输入内容被前端html代码解析运行:

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第6张图片

由于提交的结果存储在数据库中,所以每次刷新页面,输入的恶意代码就会被执行一次

Medium

代码分析

', '', $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( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>

strip_tags()函数剥去字符串中的 HTML、XML 以及 PHP 的标签,但允许使用标签。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
htmlspecialchars()函数把预定义的字符&、"、'、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素
一顿操作对message输入内容进行检测过滤,因此无法再通过message参数注入XSS代码
但是对于name参数,只是简单过滤了
2.使用大小写绕过,输入
3.输入其他标签,如

High

代码分析

' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' ); //mysql_close(); } ?>

和反射型XSS-High级别代码功能一致。对name输入内容利用正则匹配删除所有关于

就可以获取用户cookie。参考链接在此,与本作者无关

XSS(DOM)

对于DOM型的XSS是一种基于DOM树的一种代码注入攻击方式,可以是反射型的,也可以是存储型的
最大的特点就是 不与后台服务器交互,只是通过浏览器的DOM树解析产生

介绍下DOM:

HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准
简单来说DOM主要研究的是 节点,所有节点可通过 javascript访问(增,删,改,查)

可能触发DOM型XSS属性:本实验中主要用到的就是document.write属性

document.write属性
document.referer属性
innerHTML属性
windows.name属性
location属性

Low

代码分析

 

可以,很直接

操作步骤

1.正常输入English和French,F12打开开发者模式可以看见

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第7张图片

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第8张图片

现在来分析一下

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第9张图片

F12审查元素:

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第10张图片

可以看到和之前正常输入相比较,第一个option标签,就是被解释运行

Medium

代码分析

 

Medium级别的代码先是检查判断default参数是否为空,不为空则赋值。然后使用stripos()函数判断default值中是否含有。如果有,则利用header()函数重新发起http请求,将default值改为"English"

操作步骤

1.输入,发现default值改为"English"
2.使用大小写,双写绕过:ipt>alert(1)发现也不行,初步判断应该是把
回车。

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第16张图片

点击确定后(在HTML中alert属性点击确定之后才能执行之后的代码),才会返回Html代码:

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第17张图片

2.这里也可以使用标签,但是要闭合

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第18张图片

如果直接使用标签输入:#

DVWA-从入门到放弃之XSS(Reflected,Stored,DOM)_第19张图片

发现