03.XSS基础
2019-03-02 本文已影响0人
新一mghc
一、成因
程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。
二、分类
1. 反射型
交互的数据一般不会被存在在数据库里面,一次性,所见即所得,一般出现在查询类页面等。
- GET方式的XSS漏洞更加容易被利用,一般利用的方式是将带有跨站脚本的URL伪装后发送给目标
- 而POST方式由于是以表单方式提交,
2. 存储型
交互的数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面。
3. DOM型
不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。
三、跨站脚本漏洞测试流程
- 在目标站点上找到输入点,比如查询接口留言板等
- 输入一组“特殊字符+唯一识别字符”,点击提交后,査看返回的源码,是否有做对应的处理
- 通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
- 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在ⅩSS漏洞
TIPS
- 一般査询接口容易出现反射型XSS,留言板容易岀现存储型XSS
- 由于后台可能存在过滤措施,构造的 script可能会被过滤掉,而无法生效或者环境限制了执行(浏览器)
- 通过变化不同的 script,尝试绕过后台过滤机制;
四、环境实操
1.反射型xss(get)
1. 转译过滤判断
提交框.png 返回源码.png输入一组“<>6666”,点击提交后,査看返回的源码,未对输入信息进行过滤
2. 尝试进行攻击
进行注入.png发现前端对字符数进行了限制,打开F12调试工具修改前端代码。
前端源码.png的确进行了限制,将20修改为足够大,输入
<script>alert(1)</script>
弹窗成功.png
注入成功
3. 源码审计
源码.png在第一个框中对信息进行判断,若信息不为空且不为Kobe,则将参数传入{$_GET['message']},未对信息进行适当过滤
2.存储型型xss
1. 转译过滤判断
提交判断未进行过滤.png 转移判断.png未进行过滤与转译
2. 进行攻击
尝试攻击.png成功弹窗,并且在刷新页面后,依然弹窗,储存型xss触发成功
3. 源码审计
语句保存代码.png将数据存入了后台数据库
<p class="line">留言列表:</p>
<?php echo $html;
$query="select * from message";
$result=execute($link, $query);
while($data=mysqli_fetch_assoc($result)){
echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";
}
查看留言展示节目界面,未对{$data['content']}进行过滤
3.1. DOM型xss
1.攻击前准备
test.png随便输入,提交出现what do you see?,查看源代码
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>
str 接收传入值;写入a href标签;最后传入倒数第二行 id="dom";可以考虑在a herf标签构造语句进行攻击
攻击.png点击what do you see 出现弹窗
3.2. DOM型xss-x
1.查看源代码
<div id="xssd_main">
<script>
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<form method="get">
<input id="text" name="text" type="text" value="" />
<input id="submit" type="submit" value="请说出你的伤心往事"/>
</form>
<div id="dom"></div>
</div>
window.location.search:获取url参数
与第一个类似