xss-csrf
xss和csrf的关系
-
xss(跨站脚本攻击)
-
简介
跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
-
xss分类
-
反射型
<非持久化>攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
-
存储型
<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie
-
DOM型XSS
dom型xss是一种基于页面dom树而造成的漏洞,后端没有关系,通过拼接用户的输入不经过服务器,而直接输出拼接成恶意攻击代码。
-
-
漏洞原理
xss的实质是没有对用户的输入进行转义,而当成代码来执行的。是一种注入网页前端代码的"艺术",常用语言是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。
-
漏洞利用
1、盗用cookie,获取敏感信息。
2、利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
4、利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
5、在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
-
漏洞注入测试语句和绕过
-
xss绕过
-
如果script大小写被过滤
-
则使用
<img src=1 οnerrοr=alert(1)>
表示插入一个图片 图片路径错误无法显示 onerror事件 触发
-
构造a标签,使其中的script进行HTML字符实体转换。
使用url编码也可以
t 转换为 t
则可以使用伪协议:javascript:alert(1) -
">[haha
如果是输出在a标签中则可直接使用 javascript:alert(1)
-
script中间插入制表符
这里使用 	
"><a href="java	script:alert(1)
-
-
Alert被过滤 可以使用confirm()、prompt()
例 :
<script>confirm()</script>
-
利用javascript:伪协议绕过
实例:
"><iframe src=javascript:alert(1)> “><a href="javascript:alert(1)">haha</a> 或者:”><a href="javascript:alert(1)">haha <input name=keyword value=" "><a href="javascript:alert(1)">haha</a>"> <input name=keyword value=" "><a href="javascript:alert(1)">haha">
-
如果()不能用 可以用 反引号如果 空格被过滤可以使用 %0a 或 %0d 或/**/
-
如果是被 加了反斜杠 \ l过滤 双引号 这种过滤
过滤 双引号:在alert中实体转换alert("XSS")
使用JavaScript的fromCharCode函数绕过过滤
<IMGSRC=javascript:alert(String.fromCharCode(88,83,83))>
使用没有双引号的:
<IMG SRC=javascript:alert(‘XSS’)>
-
xss宽字节绕过
宽字节绕过的条件:
返回页面·是GBK/GB2312编码的;
通过构造UNicode字符让双引号逃逸出来。
例如:
%c1\会被认为一个UNicode字符
-
使用注释符绕过长度限制;
情况一:
例如两个文本框,input元素,限制了长度不允许写入更多东西,这时候可以使用注释符绕过
<inuput id=1 type="text" value=""/> xxxxxxxxx <input id=2 type="text" value=""/>
方法:
在第一个input框中输入
"><!--
在第一二个框中输入
--><script>alert(/xss/);</script>
最终效果;
<inuput id=1 type="text" value=""><! --" /> xxxxxxxx <input id=2 type="text" value="--><script>alert(/xss/);</script"/>
-
绕过magic_quotes_gpc()
magic_quotes_gpc=ON是php中的安全设置,开启后会把一些特殊字符进行轮换,比如’(单引号)转换为\’,”(双引号)转换为\”,\转换为\
比如:
<script>alert(“xss”);</script>
会转换为<script>alert(\”xss\”);</script>
,这样我们的xss就不生效了。针对开启了magic_quotes_gpc的网站,我们可以通过javascript中的String.fromCharCode方法来绕过,我们可以把alert(“XSS”);转换为
String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34,41)
那么我们的XSS语句就变成了<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88,83, 83, 34, 41, 59)</script>
String.fromCharCode()是javascript中的字符串方法,用来把ASCII转换为字符串。
最后使用<script>转换后的放到这里</script>
包含即可 -
使用编码绕过xss
-
使用hex编码绕过
我们可以对我们的语句进行hex编码来绕过XSS规则
比如:可以转换为:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%78%73%73%22%29%3b%3c%2f%73%63%72%69%70%74%3e
-
html实体编码
-
十进制,八进制,十六进制编码
-
unicode编码
-
escape编码
-
String.fromCharCode(...) (ascii编码)
-
-
-
漏洞防御
htmlentities() :把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体
htmlspecialchars和htmlentities的区别:
htmlspecialchars 只转义& 、" 、' 、< 、>
这几个html代码,而 htmlentities 却会转化所有的html代码,连同里面的它无法识别的中文字符也会转化。- 编码:
对用户输入的数据进行
HTML Entity 编码。
如上图所示,把字符转换成 转义字符。
Encode的作用是将
$var
等一些字符进行转化,使得浏览器在最终输出结果上是一样的。
比如说这段代码:<script>alert(1)</script>
若不进行任何处理,则浏览器会执行alert的js操作,实现XSS注入。
进行编码处理之后,L在浏览器中的显示结果就是<script>alert(1)</script>
,实现了将$var作为纯文本进行输出,且不引起JavaScript的执行。
2.过滤:
移除用户输入的和事件相关的属性。如onerror可以自动触发攻击,还有onclick等。(总而言是,过滤掉一些不安全的内容)移除用户输入的Style节点、Script节点、Iframe节点。(尤其是Script节点,它可是支持跨域的呀,一定要移除)。
3、校正
避免直接对HTML Entity进行解码。使用DOM Parse转换,校正不配对的DOM标签。备注:我们应该去了解一下
DOM Parse
这个概念,它的作用是把文本解析成DOM结构。
比较常用的做法是,通过第一步的编码转成文本,然后第三步转成DOM对象,然后经过第二步的过滤。
还有一种简洁的答案:
首先是encode,如果是富文本,就白名单
更多
-
-
-
区别 参考资料
区别一:
CSRF:需要用户先登录网站A,获取 cookie。XSS:不需要登录。
区别二:(原理的区别)
CSRF:是利用网站A本身的漏洞,去请求网站A的api。XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?