文章目录
作业
1. 总结反射型、存储型、DOM型XSS特点和区别
1. 反射型 XSS
特点:
- 攻击者通过构造特定的 URL,将恶意脚本作为参数传递给服务器,然后服务器将该脚本“反射”回用户的浏览器。
- 通常在请求的响应中直接执行,例如通过查询字符串或表单提交。
- 不会在服务器端存储,攻击依赖于用户点击链接。
例子:用户访问恶意链接,链接中的 JavaScript 代码被执行。
2. 存储型 XSS
特点:
- 恶意脚本被永久存储在服务器上(例如数据库、消息论坛等),并在用户访问时自动执行。
- 受害者在访问存有恶意内容的页面时,会加载并执行这些脚本。
- 更具危害性,因为它可以影响多个用户,只要有用户访问了包含恶意代码的页面。
例子:攻击者在评论区插入恶意 JavaScript,当其他用户查看该评论时,该脚本被执行。
3. DOM 型 XSS
特点:
- 恶意脚本通过 DOM 操作进行注入,而不是通过服务器响应。
- 攻击者直接操控客户端的 JavaScript,使得页面的 DOM 结构被修改,进而执行恶意代码。
- 不依赖于服务器的响应,主要发生在客户端。
例子:攻击者在 Web 应用中利用 JavaScript 操作 DOM,将恶意脚本注入到页面中,比如通过不当处理 URL 参数。
反射型 XSS | 存储型 XSS | DOM 型 XSS | |
---|---|---|---|
存储方式 | 不存储,即时反射 | 长期存储于数据库等 | 不依赖于服务器存储 |
攻击触发 | 用户点击恶意链接 | 用户访问包含恶意数据的页面 | 用户交互或页面操作触发 |
影响范围 | 单次攻击,仅对主动点击的用户有效 | 可影响多个用户 | 主要影响当前页面的用户 |
执行位置 | 服务器响应 | 服务器存储后执行 | 客户端 JavaScript 操作 |
2. XSS 的fuzz字典或字典生成工具
fuzz字典:
jas502n/fuzz-wooyun-org: WooYun Fuzz 库 (github.com)
TuuuNya/fuzz_dict: 常用的一些fuzz及爆破字典,欢迎大神继续提供新的字典及分类。 (github.com)
TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。 (github.com)
cpkkcb/fuzzDicts: 渗透测试路径字典,爆破字典。内容来自互联网和实战积累。 (github.com)
字典生成工具
c0ny1/upload-fuzz-dic-builder: 上传漏洞fuzz字典生成脚本 (github.com)
3. 到XSS挑战靶场打靶(https://xss.tesla-space.com/)
第一关
发现应该在地址栏中输入文本内容
输入代码,即可
第二关
输入代码,没有反应,查看此处的源代码,如图,发现可能需要闭合
需要使用 " 来闭合本来就有的引号,后面接着注入代码
第三关
尝试输入
发现单引号‘’会转换为双引号,且有<、/、>三个符号被实体编码了,即可构造事件来触发xss
因为输入的文本在input标签内,则输入inpu标签中的事件即可
此处用的是’ οnfοcus=alert(“hello”)
第四关
输入内容,发现此处没有‘和“的转换,且尾部还有”,应该要闭合
输入" οnfοcus="alert(‘hello’)即可
第五关
可以看见输入的on变成了o_n
Script标签也被过滤了
此时可以考虑JavaScript伪协议
输入 ">Click me 即可
第六关
href 属性被过滤
尝试使用大小写绕过检查,即可成功
4 总结浏览器解析机制,若不能理解,解释《漏洞利用之XSS注入》中15条中,至少5条执行成功或不成功的原因。(可选)
- 顺序:html解码→URL解析器可能会在JavaScript解析器之前或之后进⾏解析
- “javascript:”协议被html解析器解码后,它才能够被URL解析器正确识别,且引号内字符串一个也不能少
1
html解码
“javascript”协议已经被解码,它才能够被URL解析器正确识别
而此时,JavaScript没有被html解码,所以无法调用url解析器,所以无法执行
2
<a href="javascript:%61%6c%65%72%74%28%32%29">
html解码
url解码
可以执行,解码完成,由JS模块执⾏
4
使用<和>的实体字符,浏览器仅把它们视为文本字符串,而不会把它们解析为实际的 HTML 元素。
此处的 img 标签并没有完整地插入到 DOM 中,它只是作为一个字符串被包含在
5
<textarea><script>alert(5)</script></textarea>
无法执行弹窗
和13
<script>alert('13\u0027)</script>
在JS中只有字符串和标识符能⽤Unicode表示
所以不会执行
15
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%37%32%5c%75%30%30%37%34(15)"></a>
Html解码
url解码
JavaScript Unicode解码
可以被解码,但是解码后的alrt()不是正确的函数名称,故不可以被执行
知识点总结
前端
相关链接
ES6 入门教程 - ECMAScript 6入门 (ruanyifeng.com)
https://developer.mozilla.org/zh-CN/docs/Mozilla/Firefox
HTML URL 编码参考手册 (w3school.com.cn)
Cookie 和session
在 Web 开发和网络通信中,Cookie 和 Session 是两种重要的技术,用于用户身份验证、状态管理以及存储用户数据。尽管它们有相似之处,但其工作原理和使用场景有所不同
Cookie
Cookie 是一种在客户端(通常是浏览器)存储小块数据的机制。服务器可以通过 HTTP 响应头设置 Cookie,浏览器在后续请求中将这些 Cookie 发送回服务器。
Cookie 的基本信息
- **名称:**每个 Cookie 都有一个名称。
- **值:**与名称对应的值。
- **域:**指示 Cookie 适用的域名。
- **路径:**指定 Cookie 有效的 URL 路径。
- **过期时间:**定义 Cookie 的生存期,超过这个时间 Cookie 将被删除。
- 安全标记:
- **HttpOnly:**防止 JavaScript 通过 document.cookie 访问 Cookie,提高安全性。
- **Secure:**确保 Cookie 仅在 HTTPS 连接中传输。
Cookie 的类型
- 会话 Cookie:
- 临时 Cookie,用户关闭浏览器后自动删除。
- 持久性 Cookie:
- 保存于用户的硬盘中,直到达到过期时间或用户手动删除。
- 第一方 Cookie:
- 由用户访问的网站创建的 Cookie。
- 第三方 Cookie:
- 由用户访问的网站之外的其他域名创建的 Cookie,通常用于广告和追踪目的。
Session
Session 是一种在服务器端存储用户状态信息的机制。当用户与网站交互时,服务器创建一个会话对象并为其分配一个唯一的标识符(Session ID),该标识符通常以 Cookie 或 URL 参数的形式传递给客户端。
区别:
- Cookie 用于存储少量数据在客户端,主要用于跟踪和持久化用户状态。
- Session 用于在服务器端存储用户会话相关的数据,提高了安全性和数据管理能力。
浏览器的解析机制
三种解析器:
Html、url、JavaScript
- HTML 解析器负责构建网页的结构(DOM);
- URL 解析器负责处理用户输入的地址,确保能正确请求资源;
- JavaScript 解析器负责运行网页中的动态脚本,实现交互功能。
Html解析器
词法解析
DOM树
字符实体
这里有三种情况可以容纳字符实体,“数据状态中的字符引用”,“RCDATA状态中的字符引用”和“属性值状态中的字符引用”
在“”和“
url解析
不能对协议类型进行任何的编码操作,不然URL解析器会认为它无类型
Javascript解析
unicode不可以对特殊符号进行编码,例如:’ " \n
解析流
示例
在URL解析器的时候不能被URL编码
如果解析器正在解析一个函数调用语句,圆括号部分必须为“(”和“)”,而不能是\u0028和\u0029
解码编码工具
工具匠 - 一个小众的在线工具箱 (toolkk.com)
Html编码解码 - 工具匠 (toolkk.com)
URL编码解码 - 工具匠 (toolkk.com)
Unicode编码解码 - 工具匠 (toolkk.com)
XSS漏洞
XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的安全漏洞,攻击者通过在网站中注入恶意脚本,使得其他用户的浏览器执行这些脚本。
此类攻击通常利用了应用程序未能正确验证或清理输入的数据。
XSS 的类型
- 存储型 XSS:
- 恶意脚本被永久存储在服务器上,例如数据库、留言板等。当用户访问这些内容时,脚本会被执行。
- 反射型 XSS:
- 恶意脚本并不存储在服务器上,而是立即反射回用户的浏览器。通常通过 URL 参数或表单数据传递。
- DOM 型 XSS:
- 这种类型的 XSS 是通过修改客户端的文档对象模型(DOM)来实现的。攻击的发生依赖于 JavaScript 的执行,而不是服务器的响应。
!!! DOM、 DOM树
防范 XSS 攻击的方法
- 输入验证和输出编码:对用户输入进行严格的验证,并对输出进行 HTML 实体编码。
- 使用 CSP(内容安全策略):配置 CSP,可以限制可执行的 JavaScript 来源,减少风险。
- 避免使用 eval() 等函数:避免在 JavaScript 中使用 eval() 和类似方法,这可能导致代码执行漏洞。
- 定期审计代码和使用安全库:定期检查和审计你的代码,使用成熟的安全库来处理用户输入。
- HTTPOnly 和 Secure 标志:设置 Cookie 的 HTTPOnly 和 Secure 标志,以保护 Cookie 不被 JavaScript 访问。
参考链接
XSS之绕过简单WAF总结_xss绕过waf-CSDN博客
浅析XSS常见绕过姿势及靶场实战 - FreeBuf网络安全行业门户
XSS过滤绕过总结 - 随风kali - 博客园 (cnblogs.com)
网络安全自学篇(十八)| XSS跨站脚本攻击原理及代码攻防演示(一)-腾讯云开发者社区-腾讯云 (tencent.com)
手段
- 找到可控点(url地址栏、文本框……)
| 标签的文本内容为可控点时 | 需要文本起始是<>,否则就会认为这是一个纯文本内容
如第一关 |
| — | — |
| 标签的属性值为可控点时 | 需要使用 " 或’来闭合本来就有的引号 |
-
初步注入测试
| 测试——script标签 | |
| — | — |
| | ‘‘换成// ,即(/hello/) |
| |
| 闭合
XSS测试之闭合的正确使用方式_xss怎么看闭合不闭合-CSDN博客 | |
---|---|
双引号、单引号被过滤的情况 | |
用反引号绕过 |
在javascript的函数中,可以用反引号代替单双引号。 | <img src=“x” οnerrοr=alert(xss
);> |
|
直接把script替换为空的过滤方式 | |
---|---|
双写绕过 | alert(/quan9i/) |
大小写绕过 | |
这种方法还适用于,其他标签和属性被过滤的情况,可以尝试 |
|
其他标签
使用 |
---|
οnfοcus=alert(“hello”) |
| | <input οnblur=alert(“xss”) autofocus> |
| | |
| img标签 | |
| svg标签 |
|
| |
| body标签 | |
| | |
| iframe标签 | <iframe οnlοad=alert(“xss”);>
//onload:当页面加载完毕时执行代码,在这里也就是弹出xss |
| | |
|
如果<和>被过滤,我们无法引入新标签,此时可以引入标签的事件
即,对应标签后面的属性
事件
** **属性名,像事件属性,比如onclick,onerror这样的,它们后面的属性值的引号可加可不加 | |
| <和>都被过滤,无法插入标签
存在内容过滤
例如这种
s
t
r
2
=
s
t
r
r
e
p
l
a
c
e
(
"
a
l
e
r
t
(
1
)
"
,
"
a
l
e
r
t
(
1
)
"
,
str2=str_replace("alert(1)","ale_rt(1)",
str2=strreplace("alert(1)","alert(1)",str);
事件和常用标签都被过滤 | |
---|---|
可使用 javascript:伪协议进行 XSS(跨站脚本攻击) |
支持Javascript伪协议的属性有:img,href,lowsrc,bgsound,background,action,dynsrc | |
| | Click me |
| | <a href=“” οnclick=alert(‘xss’)>a |
| |
引号可以去掉 |
| 可以用HTML编码来绕过检测 | |
| | |
| | |
编码绕过 | CTF 编码 |
---|---|
HTML 字符实体转换 |
- 插入代码
点击提交,显示了信息,则说明存在xss注入
注入后重新刷新发现直接回显注入的东西,说明是存储型xss
"> |
---|
- 将刚刚成功注入代码并能触发xss的网址通过电子邮件等方式发送给对方的手中,如果结合xss平台,对方点击了链接,就能得到对方的cookie等信息
(安装插件hackbar V2)
SQL:提供三种数据库的sql查询语句,以及一些方便联合查询的语句
XSS:提供xss攻击语句
string.fromcharcode():将根据UNICODE 值来输出xss语句
html charactor : 将XSS语句转化为HTML字符实体(以&开头)
alert(xss) statement : 构建一条xss测试语句,弹出一个框内容为xss,相当于alert(‘xss’);
Encryption:对所选字符进行加密,提供了MD5,SHA-1,SHA-256,ROT13等加密方式
Encoding:对所选字符进行编码解码,提供了Base64 Encode,Base64 Decode,URLencode,URLdecode,
HEX encoding, HEX decoding等方式
Other:
addslashes:在每个双引号前加反斜杠
stripslashes:除去所选字符中的反斜杠
strip space:除去所选字符中的空格
reverse:将所选字符倒序排列
usefull strings:提供了一些特殊的数值如圆周率PI,斐波那契数列等,其中buffer overflow 可以输入一定长度的字符造成缓存溢出攻击