前言
在Web安全领域,XSS和CSRF两个是最常见的攻击方式,由于最近在研究Django框架,阅读源码的同时分析下这两个攻击的攻击方式和防御方式
XSS
XSS,即 Cross Site Script,中译是跨站脚本攻击;在别人的站点嵌入脚本,而这个脚本原来不是属于这个站点的,所以叫跨站脚本,其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS。
XSS 攻击本质是指攻击者在网站上注入恶意的客户端代码,代码未经过滤,浏览器无法区分,恶意脚本被执行,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式。
攻击者对客户端网页注入的恶意脚本一般包括 JavaScript,有时也会包含 HTML 和 Flash。有很多种方式进行 XSS 攻击,但它们的共同点为:将一些隐私数据像 cookie、session 发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操作。
XSS 危害
- 盗取Cookies,恶意删除文章,篡改嫁祸
- web 2.0 蠕虫,就是微博的那次XSS蠕虫爆发
- 蠕虫DDos,刷量,刷广告,破坏数据
XSS攻击可以分为3类:反射型(非持久型)、存储型(持久型)、基于DOM(这个咱们就先不管了,看前两个)。
反射型 (单次反射,无db)
攻击者构造出特殊的URL,其中包含恶意代码,用户打开恶意代码的URL,服务器解析拼接在HTML‘中返回反射给浏览器,脚本执行,窃取信息。
用户通过Web客户端提交给服务端的数据,立刻用于解析和显示该用户的结果页面(数据没有在服务端存储)
这种方式只是简单的把用户输入的数据反射给浏览器,这种攻击方式往往需要攻击者诱导点击链接,或者提交一个表单,Response返回Script脚本代码,从而注入脚本。
Question:肯定有人好奇反射型攻击的恶意链接放在哪里?
1.攻击者可以恶意链接直接发送给受信任用户,比如email,站内私信,评论等
2.攻击者可以购买存在漏洞网站的广告位,将恶意链接插入到广告中
示例
创建一个静态页面,url后面跟上自己的注入脚本,可以写好,可以通过input
输入
当用户点击钓鱼网站链接时,服务器处理后由于没有过滤转义,就会直接和HTML一起反射回来
# 路径配置
from django.urls import path, re_path
from . import views
app_name = 'books'
urlpatterns = [
re_path(r'^cook1/$', views.cook1),
随后页面上回出现恶意链接网站注入的脚本
# view视图处理
def cook1(request):
# t1 = loader.get_template('books/cook1.html')
# context = {'h1': 'hello'}
return render(request, 'books/cook1.html', {
'x': request.GET.get('x')})
# 模板渲染反射
<body>
{
{
x}}
{
#{
{ x|safe }}#}
</body>
浏览器的区别:
针对这种XSS攻击,Chrome和Safari都已经屏蔽了,只能在Firefox中模拟出来
以上就产生了反射性的XSS攻击,攻击者根据注入任意类型的恶意脚本进行攻击,可以恶作剧,也可以注入能获取用户cookies的脚本。
非持久性最典型的就是在URL后面添加恶意脚本如下,简单粗暴,后面介绍应对方案
<script>恶意代码</script>
注意:
XSS非持久型攻击,根据我的理解是不会跳转到攻击者页面的,同源策略,脚本会在本网站进行非法获取或者恶作剧
这里有
RSS攻击图解
持久型 (永久反射,入库)
攻击者在表单页面发表评论,输入一些文本之后还输入了脚本
<script>alert