XSS攻击详解
XSS文章文章目录什么是XSSXSS能做什么XSS业务场景XSS类型如何检测XSSXSS核心 —— 同源策略注意:XSS语句XSS防御方法XSS检测方法 —— XSS平台反射型XSS练习存储型XSS练习什么是XSS跨站脚本攻击(前端注入)注入攻击的本质,是把用户输入的数据当做前端代码执行。设置cookie操纵浏览器:这里有两个关键条件:第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了
文章目录
什么是XSS
- 跨站脚本攻击(前端注入)
- 注入攻击的本质,是把用户输入的数据当做前端代码执行。
设置cookie
操纵浏览器:
- 这里有两个关键条件:
第一个是用户能够控制输入;
第二个是原本程序要执行的代码,拼接了用户输入的数据。 SQL
注入拼接的是操作数据库的SQL
语句。XSS
拼接的是网页的HTML
代码,一般而言我们是可以拼接出合适的HTML
代码去执行恶意的JS
语句(总结:XSS
就是拼接恶意的HTML
)
XSS能做什么
- 盗取
Cookie
并发送(用的最频繁的) ,document.cookie
—— 读取cookie
,AJAX【核心是默认异步执行机制,依靠JS
】发送数据 - 获取内网
ip
(攻击内网、扫描内网) - 获取浏览器保存的明文密码
- 截取网页屏幕
- 网页上的键盘记录
XSS业务场景
重灾区:评论区、留言区、个人信息、订单信息等
针对型:站内信、网页即时通讯、私信、意见反馈
存在风险:搜索框、当前目录、图片属性等
存储型XSS
会出现在什么地方?
任何可能插入数据库的地方
比如:用户注册的时候
留言板
上传文件的文件名
(管理员可见的)报错信息
……
XSS类型
- 反射型
XSS
(你提交的恶意数据成功的实现了XSS
,但是仅仅是对你这次访问产生了影响,是非持久型攻击)。 - 存储型
XSS
(你提交的数据成功的实现了XSS
,存入了数据库或者写入日志,别人访问这个页面的时候就会自动触发)。 DOM
型XSS
(比较复杂,后面会有专门的文章)
如何检测XSS
- 需要用恶意语句传参一般为反射型
XSS
。 <script>alert(1)</script>
—— 测试是否存在XSS
的常用语句,刷新之后若还有弹窗,说明为存储型XSS
。
XSS核心 —— 同源策略
同源策略:同域名|IP
、同端口、同协议 —— 共用cookie
。
浏览器的同源策略,认为同一个网站,访问同一个东西,限制了不同源的Js
,对当前页面的资源和属性的权限。同源策略保护了a.com
域名下的资源不被来自其他网页的脚本读取或篡改。
同源:
http://www.baidu.com
http://14.215.177.39
https://a.b.c
https://a.b.c/abc
不同源:
http://a.gyy.cn => a.gyy.cn
http://b.gyy.cn => b.gyy.cn
https://a.b.c => https: //443端口
http://a.b.c => http: //80端口
注意
-
cookie
可以有多个,必须获得完整cookie
。 -
cookie
注入和cookie
不是同一个东西,cookie
注入只是目标站点滥用REQUEST
接受传参,而cookie
具有时效性【一次会话或者开发设定,浏览器不关闭,一次会话都存在】,而且不应该也不会放入数据库中。
-
cookie
不能被爆破出来。 -
cookie
是随机字符串(一串或者多串)。 -
第一次访问网页,目标网站会给你设置一个
cookie
,除非自己有cookie
。 -
原则上而言Cookie需要完整的,但是实际上而言,Cookie不一定每一条都代表权限。
ASPSESSIONIDAQBQBCQS=GHFLAMIDIDJEEACJJOCGHAJP;
BWSsoft%5F2010=phone=aaaaa&admin=0&realname=aaaaa&dlcs=1&username=aaaaa&bumen=aaaaaaaaaa&loginname=aaaaa&danwei=aaaaa&shenfen=2&UserID=106
XSS语句
三种触发JS:
-
标签风格【
JS
代码】:<script>alert(1)</script>
、<script>confirm(1)</script>
【判断是否进行某一个操作】、<script>prompt(1)</script>
【用于输入文本内容】 -
伪协议:
<a href=Javascript:alert(1)>123</a>
【Javascript
实际上是一个伪协议,引导用户访问,类似于超链接】 -
事件【较常见】:
<img src='图片路径' onerror=alert(1) />
【满足条件,则触发事件;onxxxxx
就是事件,加载错误会触发onerror
事件,加载成功触发onload
事件,oninput
事件在用户输入时触发。】 ,JS所有事件
XSS防御方法
HTML
实体化 + 过滤httponly
【禁止JS
代码获取Cookie
】
-IE
浏览器不支持httponly
。
- 想办法让页面输出
cookie
【使用目录扫描来获取网页中的探针文件,比如phpinfo()
,这些探针文件可能会有cookie
。一键化搭建的网站容易有探针,其中最常见的文件有phpinfo.php
、i.php
】。
- 总原则:输入作过滤,输出作转义
过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字。
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到js里面的进行js转义。
XSS检测方法 —— XSS平台
XSS平台详解以及练习,使用平台会有风险,可以拿cookie
但不安全。
XSS
平台核心是获取cookie
。- 因为
XSS
的payload
构建复杂,所以一般情况下我们都是使用XSS
平台去获取cookie
,建议隐私模式【shift+n
】访问,不确定平台有没有恶意代码。 cookie
失效后会有邮件、短信通知,但不建议使用。- 机器人被大部分
XSS
平台拉黑,是由于机器人10s
发一次包。 - 图片探测不能获得
cookie
,只能获得IP
。
DOM型XSS —— 因为JS的处理才产生XSS漏洞
通过DOM
可以让脚本动态的访问、控制网页,通过Js
去对网页进行修改,变化执行才产生的XSS
漏洞,documen
开头的document.write('123')
就是DOM
。【因为JS
的处理才产生XSS
漏洞】
DOM—based XSS
漏洞是基于文档对象模型Document Object Model
,DOM
)的一种漏洞。DOM
是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM
中有很多对象,其中一些是用户可以操纵的,如url
,location
,refelTer
等。客户端的脚本程序可以通过DOM
动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM
中的数据在本地执行,如果DOM
中的数据没有经过严格确认,就会产生DOM—based
XSS
漏洞。
document对象
Document
对象使我们可以从脚本中对 HTML
页面中的所有元素进行访问。
Document
的存在可以让浏览器获取网页信息,然后用Js
来填充来节约服务器性能,因为前端代码都在客户浏览器上面执行,和服务器无关。
document.cookie
读取当前网页的Cookie
—— 【xss
必备】
document.lastModified
获得当前页面的最后修改时间 —— 【识别伪静态必备】
document.write(' ')
向文档中写入HTML
或者JS
代码 —— 【Dom xss
常见的存在方式】
静态网页 :纯前端代码,文件后缀为html
的一般为静态页面,唯一的漏洞DOM
型XSS
。
动态网页 :有后端代码所参与的网页就是动态网页
伪静态 : 动态网页假装成静态页面(SQL
注入),与动态页面唯一的区别在于传参。
http://lri45456.ia.aqlab.cn/news/detail/7.html
http://lri45456.ia.aqlab.cn/news/?detail=7 //伪静态页面传参情况
Dom型XSS常见三种状态
Document.write
在页面上面写内容,下面代码的含义是获取URL
里面的name
的传参然后输出在页面,它可以接受native
编码值 。
转码地址
http://127.0.0.1/1.html?name=123<script>alert('123')</script>
http://127.0.0.1/1.html#name=123<script>alert('123')</script> //其中#为锚点
indexOf()
方法可返回某个指定的字符串值在字符串中首次出现的位置。
unescape()函数
substring()
用于提取介于两个指定下标之间的字符。
innerHTML
属性设置或返回表格行的开始和结束标签之间的HTML
下面代码是重新设置id=zkaq
的标签里面的值
document.getElementById("NF").innerHTML="<script>alert(1)</script>"
eval
把字符串当代码执行,这里是获取锚点后的值然后放入eval
。
Location hash 属性
反射型XSS练习
- 我们首先尝试最简单的标签风格的JS代码
<script>alert(1)</script>
,查看源码后我们发现尖括号被过滤。
- 我们只能使用事件法来构造
JS
代码。 - 我们先随便输入
abcd
,查看标签闭合方式为单引号。
- 使用
oninput
事件' oninput=alert(123)//
,发现弹窗说明注入成功,即可得到flag。
存储型XSS练习
-
使用
FineCMS
搭建的一个网站,通过百度搜索这个CMS的XSS漏洞,发现其漏洞。
FineCMS —— XSS漏洞复现
-
点击注册页面,在
url
中添加c=mail&m=test
-
使用
xss
平台,即可在cookie
中发现flag
。
DOM型XSS练习
- 我们点击
F12
,打开开发者工具,发现了document.write
,我们尝试在后面添加?id=1
,发现页面回显。
- 而且,使用
url
传参修改url
,发现页面显示也会被修改。
- 我们使用传参传入简单的弹窗语句,
http://59.63.166.75:8014/dom_xss/?id=1<script>alert(1)</script>
,发现被网站防火墙拦截。
- 我们尝试使用锚点,
http://59.63.166.75:8014/dom_xss/#id=1<script>alert(1)</script>
,发现聊天页面回显正常,说明后端代码获取url
。 document.write
可以接收一个独特的编码Native
,我们通过doucument.write()
传参Native
编码。- 我们可以看出,第一行是后端代码,第二行是页面输出。
- 使用XSS平台。
- 发现没有
flag
,我们点击投诉建议,在其输入框中再次尝试。
- 我们诱导客服去访问,即可在
XSS
平台获取到flag
。【不建议使用短链接,因为客服可能会查看链接域名是否正确】
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)