Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
XSS漏洞可以用来进行钓鱼攻击、前端js挖矿、用户cookie获取。甚至可以结合浏览器自身漏洞对用户主机进行远程控制等。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
危害等级:存储型 > 反射型 > DOM型
☼ 反射型
交互的数据一般不会被存在数据库里面,一次性,所见即所得,一般出现在查询类界面等。
☼ 存储型(持久型XSS)
交互的数据会被存在数据库里面,永久性存储,一般出现在留言板,注册等页面。
☼ DOM型
不与后台服务器产生交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型。
① 在目标站点上找到输入点,比如查询接口、留言板等;
② 输入一组 “特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理;
③ 通过搜索定位到唯一字符,结合唯一字符前后语法确认知否可以构造执行js的条件(构造闭合);
④ 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行说明存在XSS漏洞。
tips:
1.一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS;
2.由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器);
3.通过变换不同的script,尝试绕过后台过滤机制。
get方式的XSS漏洞更容易被利用,一般利用的方式是将带有跨站脚本的URL伪装后发送给目标而post方式由于是以表单方式提交,无法直接使用URL方式进行攻击,如何利用?
打开web开发者工具,将文本框的最大输入值改大些,再向框中输入,单击提交按钮。
存储型XSS漏洞跟反射型形成的原因一样,不同的是存储型XSS下攻击者可以将脚本注入到后台存储起来,构成更加持久的危害,因此存储型XSS也称“永久型”XSS。
通过JavaScript,可以重排整个HTML文档。您可以添加、移除、改变或重排页面上的项目。
要改变页面的某个东西,JavaScript就需要获得对HTML文档中所有元素进行访问的入口。这个入口,连同对HTML元素进行添加、移动、改变或移除的方法和属性,都是通过文档对象模型来获得的(DOM)。
所以,你可以把DOM理解为一个一个访问HTML的标准编程接口。
在文本框中输入,单击提交,来回切换页面,它也会弹出对话框,因为它已经存储在数据库中,所以会反复执行。
JavaScript代码
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "what do you see?";
}
//试试:'>
//试试:' οnclick="alert('xss')">,闭合掉就行
script>
输入#' onclick="alert(111)">
,点击提交。
2.输入下面的JavaScript代码到getxss文本框中,单击提交,最后在pkxss后台查看cookie信息。
http:// www . xyz.com : 8080 / script/test.js
协议 子域名 主域名 端口 资源地址
当协议、主机(主域名,子域名)、端口中的任意一个不同时,称为不同域。
我们把不同的域之间请求数据的操作,称为跨域操作。
为了安全考虑,所有的浏览器都约定了“同源策略”,同源策略规定,两个不同域名之间不能使用js进行互相操作。比如:x.com域名的JavaScript并不能操作y.com域下的对象。
如果想要跨域操作,则需要管理员进行特殊的配置。
比如通过:header( “Access-Control-Allow-Origin:x.com” )指定。
Tips:下面这些标签跨域加载资源(资源类型是有限制的)是不受同源策略限制的。
< s c r i p t s r c = " . . . " > / / j s , 加 载 到 本 地 执 行
。pt>alert(xss绕过) pt>
。pt>alert(xss绕过) ript>
。核心思路:
后台过滤了特殊字符,比如标签,但该标签可以被各种编码,后台不一定会过滤当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行。
注:在使用编码时需要注意编码在输出点是否会被正常识别或翻译!
htmlspecialchars() 函数把预定义的字符转换为html实体。
q' onclick='alert(xss绕过)'
总的原则:输入做过滤,输出做转义。
JavaScript:alert(xss href)
x'