目录
知识点
Post与Get报文区别
GET
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
POST
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
比较 GET 与 POST
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded or multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 有限制。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。 在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
反射型、存储型、DOM型XSS特点和区别
反射型(Reflected)、存储型(Stored)和DOM型(DOM-based)XSS是跨站脚本攻击(Cross-Site Scripting, XSS)的三种主要类型,它们各自具有独特的特点和区别。以下是对这三种XSS类型的详细总结和对比:
反射型XSS
特点:
非持久性:反射型XSS的攻击载荷(payload)不会保存在目标服务器上,而是通过URL参数、表单字段或HTTP头等方式即时传送给受害者浏览器并执行。
特定性:攻击对象是特定的,通常需要受害者点击一个包含恶意脚本的链接才能触发攻击。
前端执行:恶意脚本在受害者的浏览器前端执行,不涉及服务器端的直接交互。
危害:窃取用户cookie等敏感信息;冒充用户身份进行非法操作。
存储型XSS
特点:
持久性:由于攻击脚本被永久地存储在目标服务器的数据库或文件中,只要受害者访问包含该恶意脚本的页面,就会被执行。
广泛影响:非特定攻击用户,任何访问该页面的用户都可能成为受害者。
隐蔽性高:由于攻击脚本存储在服务器上,其隐蔽性较反射型XSS更高。
危害:波及范围广,可能导致大量用户受害;恶意脚本可以长期潜伏,难以被及时发现和清除;可能导致网站被用作DDoS攻击的肉鸡。
DOM型XSS
特点:
客户端执行:DOM型XSS完全在客户端执行,不涉及服务器端的任何交互。攻击者通过修改DOM节点来执行恶意脚本。
隐蔽性:由于攻击发生在客户端,服务器端的日志可能不会记录任何异常,这使得检测和追踪变得更加困难。
动态内容相关:攻击通常与网页的动态生成内容有关,如JavaScript生成的内容。
危害:窃取用户敏感信息;修改页面内容,误导用户;执行其他恶意活动,如发送恶意请求等。
区别总结
反射型XSS | 存储型XSS | DOM型XSS | |
存储位置 | 不保存在服务器上,通过URL等即时传输 | 永久保存在服务器数据库或文件中 | 不保存在服务器上,在客户端执行 |
攻击对象 | 特定用户,需点击恶意链接 | 非特定用户,访问页面即可能被攻击 | 访问页面的用户,但依赖于DOM操作 |
持久性 | 非持久性 | 持久性 | 非持久性(但依赖于页面加载和DOM操作) |
攻击方式 | 通过URL参数等即时传输恶意脚本 | 恶意脚本存储在服务器上,用户访问时自动执行 | 修改DOM节点执行恶意脚本 |
服务端参与 | 不涉及服务器直接解析响应 | 涉及服务器存储和返回恶意脚本 | 不涉及服务器直接解析响应 |
检测难度 | 中等,可通过URL分析发现 | 高,因为恶意脚本存储在服务器上 | 高,因为攻击发生在客户端,日志中无记录 |
Fuzz字典
在XSS(跨站脚本攻击)的fuzz测试中,fuzz字典包含了用于测试的各种输入值,目的在于触发潜在的XSS漏洞。下面是一些常用的字典介绍及GitHub链接
XSS Fuzz字典下载
FuzzDB:一个广泛使用的fuzzing字典项目,包含了多种类型的fuzzing字典,包括针对XSS的字典。可以从GitHub上的FuzzDB项目页面下载:https://github.com/fuzzdb-project/fuzzdb。
AwesomeXSS:AwesomeXSS是一个集合了多种XSS相关资源的项目,其中也包括了一些fuzz字典。可在GitHub上的AwesomeXSS项目页面下载:https://github.com/s0md3v/AwesomeXSS。
PayloadsAllTheThings:一个包含各种类型payload的集合,其中也包括了用于XSS测试的payload,可以作为fuzz字典的一部分。可在GitHub上的PayloadsAllTheThings项目页面下载:https://github.com/swisskyrepo/PayloadsAllTheThings。
SecLists:SecLists是一个安全相关的列表集合,其中包含了多种类型的fuzz字典,包括针对XSS的字典,可在GitHub上的SecLists项目页面下载:https://github.com/danielmiessler/SecLists。
XSS Fuzz字典生成工具
Crunch:Crunch是一种创建密码字典的工具,但同样可以用于生成XSS fuzz字典。它可以按照指定的规则生成密码或输入值,非常适合用于fuzz测试;Crunch可以在Kali Linux等渗透测试环境中使用,通过命令行参数指定生成字典的规则。
自定义脚本:除了现成的工具外,还可以根据具体需求编写自定义脚本来生成XSS fuzz字典。例如,可以根据目标网站的特点,生成包含特定关键字或特殊字符的字典;也可以使用Python、Bash等脚本语言编写脚本,通过读取预定义的输入值或生成算法来生成字典
浏览器解析机制
浏览器的解析机制是一个复杂且高效的过程,涉及多个阶段和组件的协同工作。以下是浏览器解析机制的一个总结:
URL解析与缓存检查
URL解析:当用户在浏览器中输入一个URL并发送请求时,浏览器首先会对URL进行解析,识别出协议(如http、https)、域名、端口号(如果未指定,则使用默认端口,如http的80,https的443)和路径等信息。
缓存检查:在发送网络请求前,浏览器会检查本地缓存(包括浏览器缓存、系统缓存和ISP缓存)中是否已有对应请求的资源的副本。如果缓存中存在且未过期,则直接从缓存中加载资源,以节省时间和带宽。
DNS域名解析
如果本地缓存中没有找到所需资源,浏览器会进行DNS查询,以获取域名对应的IP地址。DNS查询是一个递归查询过程,可能涉及多个DNS服务器。
建立连接与发送请求
浏览器使用解析出的IP地址和端口号,与服务器建立TCP连接(对于HTTPS,则是TLS加密的TCP连接)。
连接建立后,浏览器向服务器发送HTTP请求,请求中包含请求的资源路径、请求方法(如GET、POST)、请求头等信息。
服务器响应
服务器接收到请求后,处理请求并返回响应。响应中包含状态码(如200 OK表示成功)、响应头(如Content-Type指定资源类型)和响应体(即实际请求的资源内容)。
浏览器解析响应
解析HTML:浏览器接收到HTML文档后,开始解析HTML。HTML解析器将HTML文档转换成DOM(文档对象模型)树。在解析过程中,如果遇到JavaScript或CSS文件,浏览器会暂停HTML的解析,转而加载和执行这些文件。
构建CSSOM:浏览器同时解析CSS文件,构建CSSOM(CSS对象模型)。CSSOM描述了样式信息。
构建渲染树:将DOM和CSSOM结合,构建渲染树(Render Tree)。渲染树只包含需要显示的节点和样式信息。
布局与绘制:浏览器根据渲染树进行布局计算,确定每个节点在页面上的位置和大小。然后,合成线程将渲染树转换成屏幕上的像素,最终呈现给用户。
JavaScript执行
JavaScript的执行会影响DOM和CSSOM的构建,进而影响渲染树和最终的页面呈现。如果JavaScript修改了DOM或CSSOM,浏览器可能需要重新计算布局和重绘。
异步处理
浏览器支持异步加载资源(如图片、脚本等),以加快页面加载速度。异步加载的资源不会阻塞HTML的解析和渲染。
安全机制
浏览器还实现了多种安全机制,如同源策略、CORS(跨源资源共享)、CSP(内容安全策略)等,以保护用户免受跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等安全威胁。
靶场实战
Pikachu靶场
反射型xss(get)
查看题目
更改输入栏属性,增大输入长度,输入恶意脚本语句
点击submit,弹出窗口
由于本题是反射型xss(get),我们同样可以在URL中输入恶意语句,且无长度限制
修改URL后回车,同样能弹出恶意窗口
同样使用HackBar插件也能实现恶意弹窗
反射型xss(post)
使用之前在弱口令爆破中得到的账户密码admin - 123456成功登录
登录后在输入栏输入kobe,submit后发现已无法在URL中修改请求中message内容
在输入栏输入恶意语句,点击submit,获得cookie,由于是Post型请求,这次我们在URL中没有看到输入的恶意语句
使用BP内置浏览器重复操作,将Post请求发送到重放器
在重放器中修改message内容为恶意代码,发送后查看响应内容,搜索恶意代码内容,发现其已成功提交,但页面渲染没有显示
存储型xss
由于是存储型xss,随意输入留言内容
使用bp抓取刚刚留言的请求包,发送到repeater,点击发送,在响应包中搜索留言内容,得到存储位置
直接发送恶意代码,弹出恶意窗口
此时我们重复操作,依然能在Repeater得到的返回响应里发现恶意代码已被存储,此时只要一点开“存储型xss”连接,即会弹出恶意窗口
DOM型xss
输入框输入恶意代码,没有弹窗,点击'>what do you see链接,服务器出现错误;检查输入框,分析一下前端网页代码,可以发现输入框里的参数会被传递给A标签的href属性。
查看网页源代码,发现'"+str+"'语句会将用户输入的恶意语句转化为字符串而不执行,且由于a标签里不允许套script标签,所以我们选择闭合单引号和a标签,再进行恶意语句输入
重新输入恶意语句:'><img src="#" οnmοuseοver="alert('xss')">,提交后将鼠标移动到img上,跳出恶意窗口
XSS挑战靶场
第一关
观察URL,发现name=list可注入语句
将test改为恶意脚本语句,回车,完成
第二关
尝试在输入框内直接输入脚本语句,发现没有弹窗
查看网页源代码,发现输入脚本语句中的“<>”被实体转义了,而value中的“<>”并没有被转义,所以我们可以选择输入字符闭合绕过,使得脚本语句正常注入
输入修改后的脚本语句,弹窗,完成
第三关
尝试输入脚本语句,未弹窗,查看网页源代码,发现此次两处的脚本语句中的"<>"均被实体转义
同样尝试闭合绕过方法,发现没有弹窗,查看源代码,发现“<>”仍被实体转义
因为<>会被过滤掉,所以在这里我们可以尝试利用onfocus事件绕过,先简单介绍一下onfocus事件
详见onfocus 事件 | 菜鸟教程 (runoob.com)
onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码所以我们可以利用这个事件来绕过<>号的过滤已达到执行js的目的,构造payload如下:
' οnfοcus=javascript:alert() '
JavaScript伪协议补充:通俗地讲,JavaScript伪协议不是真实存在的协议,它的功能是将JavaScript:后面的语句当做JavaScript代码在本页面执行,并不跳转到其他网页,而是结果返给当前页面,相当于一个伪造的超链接。点击输入框,即弹窗,完成
第四关
查看网页源代码,发现与第三关类似,同样是input标签,只是把单引号换成了双引号
同理,双引号闭合,使用onfocous语句输入,点击输入框,弹窗,完成
第五关
尝试使用三四关方法,输入“ οnfοcus=javascript:alert() ”,未弹窗,查看源代码,发现on被替换成了o_n
此时只能新找一个方法进行xss注入,这里我们用a href标签法,与之前的Pikachu靶场的第四题类似,只是这一次我们要利用a href标签生成的链接来进行xss
href属性的意思是 当标签<a>被点击的时候,就会触发执行转跳,上面是转跳到一个网站,我们还可以触发执行一段js代码,于是我们需要添加一个a标签,且需要闭合绕过,构建payload如下
"> <a href=javascript:alert()>click me!</a> <"
输入代码并搜索后,点击生成链接,弹窗,完成
第六关
随意输入payload,并查看源代码,发现过滤内容较多,尝试大小写绕过
大小写绕过补充:一般后台对输入进行过滤有两种方法:使用正则匹配,一旦匹配成功就会被删除掉;用查找的函数查找,被函数查找到的内容也会被删除。而这两种方法可以用大小写混合的方式进行绕过,因为后端是不管大小写的,可以正常执行我们的语句,输入大小写拼凑的payload,查看源代码,没有被过滤。
弹窗,完成
第七关
随意输入payload,查看源代码,发现script关键字全部被过滤掉了,但是只过滤掉了script,因此我们可以利用双拼写来绕过,即将script关键字替换为scrscriptipt,当中间的script被删掉后,两边的scr和ipt重新拼凑为script,从而达到绕过的目的
输入修改后的payload:"> <scrscriptipt>alert("fku")</scrscriptipt> <",弹窗,完成
第八关
随意输入payload,查看源代码发现script变为scr_ipt,且双引号被实体转义
尝试将payload:javascript:alert()使用unicode编码后输入,点击友情链接,弹窗,完成