前言
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS
反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。
2.存储型XSS
存储型XSS又名持久型XSS,攻击的恶意代码会被存储在数据库、文件系统等存储介质,因为是永久存储所以功效持久。通常来讲攻击者可以把payload放在网站留言板、评论等位置,等用户访问网站并有匹配payload的行为时,即可触发攻击。
3.DOM型XSS
DOM XSS的XSS代码并不需要服务器解析响应的直接参与,触发XSS靠的就是浏览器端的DOM解析,可以认为完全是客户端的事情,无法通过WAF防护。
第01关 反射型XSS漏洞
1.打开靶场
2.源码分析
如下所示,未对传入参数name进行任何过滤,存在xss漏洞
<?php require_once '../header.php'; ?>
<html>
<head>
<title>反射型XSS漏洞</title>
</head>
<h2>反射型XSS漏洞</h2>
<div class="alert alert-success">
<p>/01.php?name=iwebsec </p>
</div>
<body>
<table class='table table-striped'>
<?php
if(isset($_GET['name'])){
$name=$_GET['name'];
echo "<h2>"."Hello ".$name."<h2>";
}else{
exit();
}
?>
</table>
很明显,这是一个反射型的XSS漏洞
3.渗透
传入参数<script>alert('ljn')</script>
iwebsec 靶场漏洞库iwebsechttp://iwebsec.com:81/xss/01.php?name=渗透成功,效果如下所示
第02关 存储型XSS漏洞
1.打开靶场
iwebsec 靶场漏洞库iwebsechttp://iwebsec.com:81/xss/02.php如下所示,这是一个留言板相关内容的网页
2.源码分析
如下所示对传入的参数name并未做任何过滤,具备XSS漏洞。
<?php
require_once('../header.php');
require_once('../sqli/db.php');
?>
<html>
<head>
<title>存储型XSS漏洞</title>
</head>
<h2>存储型XSS漏洞</h2>
<div class="alert alert-success">
<p>请输入你的留言信息</p>
</div>
<form method="get">
<input type="text" name="name">
<input type="submit" value="submit">
</form>
<body>
<?php
if(isset($_GET['name'])){
$name=$_GET['name'];
$sql="INSERT INTO xss set name='$name'";
$result=mysql_query($sql);
$sql="SELECT * FROM xss";
$result=mysql_query($sql);
}
else{
exit();
}
if ($result) {
?>
<table class='table table-striped'>
<tr><th>id</th><th>name</th></tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['name']."</td>";
echo "</tr>";
}
echo "</table>";
}
else
{
print_r(mysql_error());
}
?>
同时对参数name使用SQL语句进行insert存储,关键源码如下
$sql="INSERT INTO xss set name='$name'";
$result=mysql_query($sql);
接下来再使用select查询语句将其展示出来,关键源码如下
$sql="SELECT * FROM xss";
$result=mysql_query($sql);
很明显这是具有存储型XSS漏洞,注入的XSS命令会永久存储到服务器,从而触发XSS漏洞。
4.渗透
方法1:
这里要注意的是,因为涉及到SQL语句,第一个SQL插入源码如下所示,闭合方式为单引号。
$sql="INSERT INTO xss set name='$name'";
故而name的赋值不可以有单引号,故而如果想输出ljn,那么参数不能是<script>alert('ljn')</script>这是因为包含了单引号
<script>alert(/xss/)</script>
如下所示
渗透结果如下所示
方法2
因为使用SQL语句单引号闭合,故而可以选择使用双引号来进行渗透
<script>alert("hello ljn")</script>
在留言处输入参数后如下所示
如下所示,渗透成功
方法3
<script>alert(20221128)</script>
如下所示渗透成功
第03关 DOM XSS漏洞
1.打开靶场
iwebsec 靶场漏洞库iwebsechttp://iwebsec.com:81/xss/03.php
2.源码分析
如下代码中存在domxss函数,可能存在dom型xss漏洞
<?php require_once '../header.php'; ?>
<html>
<head>
<title>DOM XSS漏洞</title>
</head>
<h2>DOM XSS漏洞</h2>
<div class="alert alert-success">
<p>请输入内容 </p>
</div>
<body>
<table class='table table-striped'>
<script>
function domxss()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = str;
}
</script>
<h2 id = "output"></h2>
<input type="text" id="input" value="" />
<input type="button" value="submit" onclick="domxss()" />
</table>
3.渗透分析
输入参数,判断是否有过滤信息
'"<>?%66666ljn
在当前页面元素,搜索框中输入关键字搜索ljn,寻找刚刚输入的内容,很明显所有字符都还在,并不存在过滤单引号和双引号等特殊字符, 并将输入内容显示到页面中。
接下来分析一下闭合关系,查看器中的内容如下,于是可以输入完整的xss语句,通过将内容输出到页面,再出发显示到页面的内容执行xss脚本。
<h2 id="output">'"<>?%66666ljn</h2>
3.渗透过程
(1)渗透方法1
基于此可以构造闭合,参数输入xss恶意脚本(点击ljn后输出你好)
<li/onclick=alert('你好')>ljn</li>
输入后提交如下所示
在页面的ljn处点击鼠标,则弹出你好,渗透成功
(2)渗透方法2
参数为xss恶意脚本(因图标执行错误而出发弹框输出ljn)
<img src=1 onerror=alert('ljn')>
如下所示,渗透成功
(3)渗透方法3
参数为xss恶意脚本(鼠标移动到图标后输出ljn)
<img src="#" onmouseover="alert('ljn')">
提交后如下图所示
当鼠标移动到图标处时,弹出弹框,渗透成功
第04关 XSS修复示例
1.打开靶场
iwebsec 靶场漏洞库iwebsechttp://iwebsec.com:81/xss/04.php
2.源码分析
如下所示对参数使用了htmlspecialchars函数过滤,这样就可以防范恶意的xss攻击
<?php require_once '../header.php'; ?>
<html>
<head>
<title>XSS修复示例</title>
</head>
<h2>XSS修复示例</h2>
<div class="alert alert-success">
<p>/04.php?name=iwebsec </p>
</div>
<body>
<table class='table table-striped'>
<?php
if(isset($_GET['name'])){
$name=$_GET['name'];
echo "<h2>"."Hello ".htmlspecialchars($name)."<h2>";
}else{
exit();
}
?>
</table>
3.渗透实战
再次尝试第01关渗透成功的内容
<script>alert('ljn')</script>
如下所示,渗透失败,说明xss漏洞修复成功
版权归原作者 mooyuan天天 所有, 如有侵权,请联系我们删除。