XSS原理
xss又叫(css)跨站脚本攻击。因为与html中css样式同,所以称为xss。
属于web应用中计算机安全漏洞,是恶意的web访问者将脚本植入到提供用户使用的页面中,通常是使用JS编写的危险代码,当用户使用浏览器访问页面时,脚本会被执行,从而达到攻击者目的
XSS攻击最终目的是在网页中嵌入客户端恶意代码
反射型
反射型xss也称作非持久性、参数型跨站脚本。主要用于将恶意脚本附加到URL地址的参数中
漏洞特征:前端执行、不会储存在后端数据库,反射是一来一回的过程,具有一次性
我们呢可以构造一次链接,执行访问,原理是通过给别人发送这些带有恶意脚本的参数的URl,当这个URL地址被打开的时候,特定的这个参数代码会被浏览器解析,执行,如此就可以获得别人的cookie了,进而盗号登录
靶场DVWA
反射型一来一回的,你输入什么(不为空)会跟你返回来
<script>alert("文本" )</script> 产生一个带有确认按钮对话康
<script>confirm("文本")</script>拥有确认和取消
<script>prompt("文本","默认值")</script>可以输入文字的框
执行这个会跟你弹窗,有弹窗就是XSS,有些网站即使你在输入的可以输入,但是不会有弹窗
这是源码,这个函数是检查数组中是否存在键名,存在返回true,&&后面是看变量的值是否为空
可以发现,没有对用户输入的数据进行过滤
反射型XSS形成的一个过程
攻击者构造出特殊的 URL,其中包含恶意代码。
用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
存储型
此类XSS不需要用户单击特定URL就能执行跨站脚本攻击者事先将恶意JS代码上传或存储到漏洞服务器中
当受害者浏览器包含此恶意JS代码的页面就会执行恶意代码
漏洞特征:持久性,前端执行,储存在后端数据库
存储型 XSS 常出现在网站的留言版、评论、博客日志等交互处
存储型XSS数据交互过程:
用户输入数据->后端执行php代码->存入数据库某张表->返回数据给php页面->回显前端
靶场DVWA
在name中它限制我们的长度只有10,我们试着改改,能在前端改的尽量在前端改。前端修改是一次性的,不刷新或者啥的就会没有了
就会把数据存储到数据库中,等我下次再点击这个存储型漏洞时,就会出现弹窗
源码
第一行它判断了是否接受名为’btnSign’的post请求
isset函数:用于检测变量是否已设置并且非 NULL。
trim( )函数的作用:移除字符串两侧的空白字符或者其他其他自己定义的字符
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠
mysqli_real_escape_string() 函数:转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集, 这里防止sql注入
die():输出一条消息,并退出当前脚本
mysql_query(query):执行一条mysql查询
mysql_error返回上一个mysql操作产生的文本错误消息
存储型XSS形成的一个过程
攻击者将恶意代码提交目标网站的数据库中
用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
DOM型
漏洞特征:一次性的、前端执行、不会储存在后端数据库, 程序执行不依赖与服务器端的数据
web server不参与,仅仅涉及到浏览器的XSS
DOM XSS的XSS代码不需要服务端解析响应的直接参与,触发XSS的是浏览器端的DOM解析
用户在客户端输入的数据如果包含了恶意JS脚本,而这些脚本没有经过适当的过滤,应用程序就可能受到基于DOM的XSS攻击。
自己弹自己–dom
DOM是JS操作网页的接口,全称为“文档对象模型”(Document Object Model)它的作用是将网页转为一个JS对象,从而可以用脚本进行各种操作(比如增删内容)
DOM节点
文档是由节点构成的集合,在DOM里存在许多不同类型的节点,主要分为3种:元素节点、文本节点、属性节点
1、元素节点
在“购物清单”例子中,< body >、< p>< u>之类的元素在文档中的布局形成了文档的结构,它们即是元素节点。
2、文本节点
文档通常会包含一些内容,这些内容多数日文本提供,如前面的例子中< p>包含着文本“欢迎购买它就是一个文本节点。
3、属性节点
元素或多或少都有一些属性,属性用于对素做出更具体的描述
DOM型原理
XSS原理客户端的脚本程序可以通过DON动态地检查和修改页面内容
程序执行不依赖于服务器端的数据,从客户端获得DOM中的数据并在本地执行
浏览器用户可以操作DOM中的一些对象 。例如:URL、location
用户在客户端输入的数据如果包含了恶意javaScript脚本,而这些脚本没有经过适当的过滤和消毒应用程序就可能受到基于DOM的XSS攻击
三种类型的XSS区别
DOM与前两个不同是:漏洞发生原因跟服务器解析无关,纯粹是JS代码读取了URL内容导致
dom-xss取决于输出位置,并不取决于输出环境,因此domxss既有可能是反射型的,也有可能是存储型的
因此检测JS代码中可能触发DOM型XSS的属性如下
document.referer属性
window.name属性
location 属性
innerHTML属性
documen.write 属性(可以在当前执行我们script标签之后,去插入任意的HTM源码)
靶场:pikachu
遇到这么一个输入框,点击一下回显,再点击这个超链接时啥都没直接上最简单的语句
<script>alert(1)</script>
也没啥,但是当你鼠标放在超链接上时你会发现它会把语句完整的回显出来,说明他进行过拼接,但是点击超链接后,会弹出403错误,然后我们可以看看源码
找到what do you see关键字,看看怎么写的
这里有dom值,在最后的div标签引用了dom值
当我们的js代码执行后会将这个a标签和我们输入的字符串连接起来
输入任意数值点击提交,会在表单下面新生成一个 < a >标签,输入的数值保存在 href 属性中
后半段的代码不用看,主要是这里,假设拼接在href里面,首先先把href的值闭合掉,添加单引号或则里面用#
然后可以使用onclick函数
#' onclick="alert(111)"
扩展
鼠标事件:
onclick:在鼠标左健点击弹起之后触发的事件,即一次完整的鼠标点击过程。过程完成瞬间触发函数。
onm ousedown:事件会在鼠标按键被按下时发生。
onm ouseup:事件会在松开鼠标按键时触发。
onm ouseover:属性在鼠标指针移动到元素上时触发。
onm ouseout: 属性在鼠标指针移动到元素外时触发。
onm ouseenter:属性在鼠标指针移动到元素上时触发,
onmouseover和onmouseenter唯一的区别是 onm ouseenter 事件不支持冒泡 。
onmouseleave:属性在鼠标指针移动到元素外时触发,
onmouseout和onmouseleave唯一的区别是 onm ouseleave 事件不支持冒泡 。
DOM型XSS形成的一个过程
攻击者构造出特殊的 URL,其中包含恶意代码。用户打开带有恶意代码的 URL。用户浏览器接收到响应后解析执行,前端JavaScript 取出 URL 中的恶意代码并执行。恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
XSS漏洞挖掘与绕过
数据交互(输入/输出)的地方最容易产生跨站脚本。因此,我们最重要的是考虑哪里有输入、输入的数据在什么地方输出,一般常会对网站的输入框、URL参数、COOKIE、POST表单、HTTP头内容进行测试。
手工测试XSS
- 找到测试点(搜索框、留言板)
- 根据测试流程首先实验一些特殊符号的输入。发现可以正常输出,说明后台并没有进行相关的过滤,例子:'<>?"&/6666
- 如果有过滤则进行相关的绕过、
XSS常见POC
-
常见XSS语句标签,< script>
< script>alert(1)</ script>
< script src=http://baidu.cn/xss/xss.js></ script>
'>< script>alert(1)</ script> -
常见XSS语句标签,< img>
< img src=x οnerrοr=alert(‘xss’)> 单引号被过滤可以用/
< img src=javascript:alert(1)> 版本,E7.0|IE6.0 才能执行
< img src=# οnmοuseοver=“alert(1)”>
src应该接路径,x明显不是路径那么通过前面的错误会触发onerror函数 -
常见XSS语句标签,< input>
< input οnclick=alert(3)> -
常见XSS语句标签,< a>
“> < a href=javascript:alert(‘xss’)>xss
“>< a href=”” οnclick=“alert(1)”>xss
XSS漏洞绕过方式
大小写绕过 < ScRiPt>alert(1)</ ScRiPt>
双写绕过 <sc< script>ript>alert(/xss/)</ script>
反引号绕过 ``绕过单双引号的过滤
关闭标签(利用<>关闭标签) ">< script>alert(1)</ script>
超链接标签 < a href=>1</ a>
图片链接绕过< img src=1 οnerrοr=alert(1)>
编码绕过(八进制、十进制、十六进制编码、html实体编码、url编码、base64)空格、回车、换行符、tab、混淆
XSS漏洞之防御手段
-
CSP内容安全策略
Content Security Policy
禁止加载外域代码,防止复杂的攻击逻辑。
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)
禁止未授权的脚本执行(新特性,Google Map 移动版在使用)
网站通过发送CSP头部告诉浏览器什么是被授权执行,以及什么是被禁止 -
通过设置HttpOnly防止cookie被窃取
-
输入输出检查(包括前端js和后端php)
输出编码主要有URL、HTML、JS
可以采用白名单验证或者黑名单验证方法。
-
白名单验证:对用户提交的数据进行格查,只接受指定长度范围内、采用适当格式和预期字符的输入,其余一律过滤
-
黑名单验证:对包含XSS代码特征的内容进行过滤,如"<“、”>“、“script”、”#"等
-
·对所有输出字符进行HTML编码
‘<’ 转成& lt;
‘>’ 转成& gt;
‘&’ 转成& amp;
" 转成& quot;
’ 转成& #39;