freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Pikachu靶场通关之XSS(跨站脚本)
2020-10-30 00:30:37

一、XSS(跨站脚本)概述

Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

二、XSS(跨站脚本)利用

1.反射型xss(get)

反射型XSS(get)
输入   '  "  <>  特殊字符都可以原封不动的输出,可以发现没有任何过滤
1603986946_5f9ae602ad13247f66152.png!small?1603986945215

审查元素修改下长度,输入payload:<script>alert(/xss/)</script>即可

1603986992_5f9ae6304878911755679.png!small?1603986990698

提交后,发现触发了xss

1603987388_5f9ae7bc9b44677be16a2.png!small?1603987387135

查看后台代码,发现 后台代码并没有对你输入的东西 做任何修改 ,只是原封不动的输出了

2.反射型xss(post)

输入账号密码:admin/123456 登入

1603987043_5f9ae66382a6b28f1ec8f.png!small?1603987042100

成功登陆后的界面

1603987444_5f9ae7f4ed67cbf908188.png!small?1603987443469

登入后直接输入payload:<script>alert(/xss/)</script> 触发弹窗

1603987470_5f9ae80e814e045bf5d5f.png!small?1603987469046

3.存储型xss

输入特殊字符:'"<> 发现没有过滤

1603987499_5f9ae82b48513f21d9880.png!small?1603987497718

查看前端元素代码
1603987516_5f9ae83c17a821711341d.png!small?1603987514597
1603987522_5f9ae8425b526abd34008.png!small?1603987520901
直接输入payload:<script>alert(/xss/)</script> 触发弹窗
1603987535_5f9ae84fdc623ba365627.png!small?1603987534376
1603987554_5f9ae86267a1ae3e2e756.png!small?1603987552897
查看后台代码
判断message是否存在,并且 message不为空
进行了转义,防止sql注入
插数据库的时候,做了对应的转义,防止数据库的注入 ,把massage 插入到表中 存下来,存到后台 

1603987569_5f9ae871833aa98505cde.png!small?1603987567970

将存储的留言 都显示出来

1603987599_5f9ae88f7a03913b8e958.png!small?1603987598014

每次点击存储型xss时就会弹窗,所以是持久型xss

4.DOM型xss 

HTML DOM树,可以理解为DOM为一个一个访问html的标准编程接口
1603987650_5f9ae8c25e5a3f692af8f.png!small?1603987648876

输入测试代码'"<> 显示的内容和我们的输入的有所不同
1603987658_5f9ae8ca34c8e38a0260b.png!small?1603987656649

查看页面源码
1603987669_5f9ae8d5407ca1e4bb715.png!small?1603987667702
getElementById获取标签id为text的值传递给str,str通过字符串拼接到a标签中。所以我们要闭合前面的<a>标签
输入payload1: '><img src="#" onmouseover="alert('xss')">
可以发现我们的输入变成了
1603987692_5f9ae8ecf39a103cff972.png!small?1603987691480
当鼠标移动到图片位置就会触发弹窗
1603987704_5f9ae8f803b69a583206b.png!small?1603987702496
输入payload2:' onclick="alert('xss')">
可以发现我们的输入变成了
1603987717_5f9ae9059eed11ed6931d.png!small?1603987716121
点击what do you see,便会触发弹窗
1603987726_5f9ae90eb15dd173eba4c.png!small?1603987725174

5.DOM型xss-x

查看网页源代码
1603987760_5f9ae930c87474c9270dc.png!small?1603987759228
通过拼接代码的功能是从text框取值并插入到标签<a href=''>,例如输入alert,点击链接会跳转到 http://xxxx/xss/alert中,
先闭合前面的<a>标签,再构造新的恶意标签拼接进代码
输入payload1: '><img src="#" onmouseover="alert('xss')">
可以发现我们的输入变成了
1603987774_5f9ae93e9ccd1ae200762.png!small?1603987773148
当鼠标移动到图片位置就会触发弹窗
1603987806_5f9ae95e82989794547f4.png!small?1603987805057
攻击过程:输入payload-》点击’请说出你的伤心往事‘-》点击’有些费尽心机...‘-》鼠标移动到图片位置
输入payload2:' onclick="alert('xss')">
可以发现我们的输入变成了
1603987794_5f9ae9528098ace0d4d16.png!small?1603987792927
点击’有些费尽心机...‘-》点击‘就让往事都随风’就会触发弹窗
1603987847_5f9ae987f31105a18fe32.png!small?1603987849236

6.xss之盲打

xss盲打是一种攻击场景。我们输出的payload不会在前端进行输出,当管理员查看时就会遭到xss攻击。
输入常规的payload:<script>alert(/xss/)</script>,点击提交后发现这里提示一段文字,应该是直接打到后台了,找到后台,登录进去看看
1603987864_5f9ae9983c46d0a270b3e.png!small?1603987862675
后台地址是/xssblind/admin_login.php登录即可触发xss
1603987883_5f9ae9ab1de83ab0253e1.png!small?1603987881577

7.xss之过滤

输入 '<script>” 特殊字符,看输出结果字符被过滤,查看前端源码 输入与输出结果不一致
1603988064_5f9aea6060fa9f6cce1c6.png!small?1603988062868
查看后端源码,发现对 <script 标签进行了过滤,替换为空格,但是只是对小写进行了替换
1603988077_5f9aea6d6f431c5a9c389.png!small?1603988075930
尝试大小写绕过
<SCRIPT>alert(/xss/)</sCRIpt>
成功弹窗
1603988086_5f9aea76c2c787dafaa6e.png!small?1603988085263
当script为过滤关键词时,可以尝试其他的payload,如
<img src=x onmouseover="alert(/xss/)">
<img src=x onerror="alert(/xss/)">
点击图片的位置触发弹窗

1603988102_5f9aea862069634989b4c.png!small?16039881006238.xss之htmlspecialchars

htmlspecialchars()函数定义及用法
在php中,htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。如果 string 包含无效的编码,则返回一个空的字符串,除非设置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 标志;
被转换的预定义的字符有:
&:转换为&amp;
":转换为&quot;
':转换为成为 '
<:转换为&lt;
>:转换为&gt;
输入特殊字符'   "   <   > ,查看前端源码,我们看到   "   <   >   都进行了html实体转码
1603988140_5f9aeaacc28cc52202f05.png!small?1603988139255
但是没有对 ' 进行实体转码
可以使用单引号构造payload。
#' onclick='alert(/xss/)
可以看到我们的输入变成了
1603988153_5f9aeab915063b7cfbbab.png!small?1603988151511
第一个单引号闭合href属性的双引号,第二个单引号闭合href属性的闭合双引号
点击语句即可触发弹窗
1603988160_5f9aeac0da8ea681316ae.png!small?1603988159354

9.xss之href输出

输入测试代码#' onclick='alert(/xss/) ,查看前端源码,发现单引号没有用了
1603988201_5f9aeae95aa178b3b54ca.png!small?1603988199850
在a标签的href属性里面,可以使用javascript协议来执行js,可以尝试使用伪协议绕过。
javascript:alert(/xss/)
点击即可触发弹窗

1603988213_5f9aeaf56acee8cff6299.png!small?160398821189210.xss之js输出

输入测试代码<script>alert(/xss/)</script>查看源码
输入的代码被生成在js中并赋值给$ms。我们的输入被带入到js中,可以闭合
</script><script>alert(/xss/)</script>
';alert(1);//
成功弹窗
1603988244_5f9aeb14c2e4ebd833776.png!small?1603988243275
1603988256_5f9aeb2047fd0aaae7bbb.png!small?1603988254826

三、本文总结

到此为止,通过本篇文章,我们大家分别从XSS(跨站脚本)漏洞的原理、危害,XSS(跨站脚本)如何利用等方面,来和大家一起学习了XSS(跨站脚本)这项漏洞,相信大家已经对XSS(跨站脚本)这项漏洞有了明确而深刻的认识。

本人之后还会陆续分享我在web安全学习之路上的各种笔记,包括且不限于各种漏洞原理、实战漏洞挖掘、漏洞复现以及靶场和CTF的通关教程等等,希望大家多多支持。









# xss # web安全 # 靶场实战
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者