XSS、CSRF、SSRF的概念,防御和实验
一.概念
相同点:
XSS,CSRF,SSRF三种常见的Web服务端漏洞均是由于,服务器端对用户提供的可控数据过于信任或者过滤不严导致的。
不同点:
XSS是服务器对用户输入的数据没有进行足够的过滤,导致客户端浏览器在渲染服务器返回的html页面时,出现了预期值之外的脚本语句被执行。
CSRF(跨站请求伪造)是服务器端没有对用户提交的数据进行随机值校验,且对http请求包内的refer字段校验不严,导致攻击者可以利用用户的Cookie信息伪造用户请求发送至服务器。
SSRF(服务端请求伪造)是服务器对用户提供的可控URL过于信任,没有对攻击者提供的RUL进行地址限制和足够的检测,导致攻击者可以以此为跳板攻击内网或其他服务器。
二.防御
(一)xss
对字符实体进行转义、使用HTTP Only来禁止JavaScript读取Cookie值、输入时校验、浏览器与Web应用端采用相同的字符编码
1.HttpOnly属性
为Cookie中的关键值设置httponly属性,大部分XSS(跨站脚本攻击)的目的都是通过浏览器的同源策略,来获取用户Cookie,从而冒充用户登陆系统的。
如果为Cookie中用于用户认证的关键值设置httponly属性,浏览器将会禁止js通过同源策略访问cookie中设有httponly属性的信息,因此以劫持用户认证cookie为目的XSS攻击将会失败。
但很明显,只为cookie中的值设置Httponly是不够的,因为XSS攻击并不是只能获取用户COOKIE,它还可以窃取用户浏览器信息,模拟用户身份执行操作等等
2.对输入和URL参数进行过滤(白名单和黑名单)
3.对输出进行编码
在输出数据之前对潜在的威胁的字符进行编码、转义是防御XSS攻击十分有效的措施。如果使用好的话,理论上是可以防御住所有的XSS攻击的。对所有要动态输出到页面的内容,通通进行相关的编码和转义。当然转义是按照其输出的上下文环境来决定如何转义的。
(1)作为body文本输出,作为html标签的属性输出:
比如:
u
s
e
r
n
a
m
e
<
/
s
p
a
n
>
,
<
p
>
<
c
:
o
u
t
v
a
l
u
e
=
"
{username}</span>, <p><c:out value="
username</span>,<p><c:outvalue="{username}"></c:out>
此时的转义规则如下:
< 转成 <
> 转成 >
& 转成 &
" 转成 "
' 转成 '
(2)javascript事件
除了上面的那些转义之外,还要附加上下面的转义:
\ 转成 \\
/ 转成 \/
; 转成 ;(全角;)
(3)URL属性
如果 <script>, <style>, <imt> 等标签的 src 和 href 属性值为动态内容,那么要确保这些url没有执行恶意连接。
确保:href 和 src 的值必须以 http://开头,白名单方式;不能有10进制和16进制编码字符
(二)cfrs
1.Referer标识当前请求的来源页面,浏览器访问时除了自动带上Cookie还会自动带上Referer,所以服务端可以检测Referer头是否本网站页面来决定是否响应请求。
2.token就是服务端返回给客户端类似sessionid那样一长串的类值(长是为了防暴力猜解)。csrf依赖于浏览器该问链接时自动对应网站的cookie带上,token不放cookie(一般form表单加个hidden属性的input标签来存放)csrf就没法获取token,这样我们就可以通过检测发送过来的数据包中是否有正确的token值来决定是否响应请求。
(三)ssrf
1.限制协议为HTTP、HTTPS
2.不用限制302重定向
3.设置URL白名单或者限制内网IP
三.实验
(一)Xss
1.DVWA
一.Xss介绍
(一)xss形成原因
由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
(二)Xss攻击
通常指黑客通过 HTML 注入 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击行为。
(三)Xss类型
1.反射型(非持久型)
只是简单地把用户输入的数据反射给浏览器,简单来说,黑客往往需要去诱使用户点击一个恶意链接,才能攻击成功。
2.存储型
将用户输入的数据存储在服务器端,每次用户访问都会被执行js脚本。
3.DOM型
基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
(四)应用场景
1.利用xss获得cookie1
2.重定向
3.钓鱼网站
4.DDOS
二.反射型xss
(一)Low
1.
页面显示
源码显示
代码成功插入网页源代码
1.2<body οnlοad=alert(‘xss2’)>
弹窗提示
1.3<a href=’’ οnclick=alert(‘xss3’)>click1
页面显示
点击click1 弹窗提示
1.4<img src=http://192.168.10.128/a.jpg οnerrοr=alert(‘xss4’)>
Img 语段执行错误 执行oneeror 弹窗提示xss4
1.5kali的地址为192.1618.106.129,那么靶机上插入的hook js脚本为:
1.6自动化测试工具
1.开启phantomjs xss.js
必须在xss.js文件所在路径下打开cmd
Python-phantomjs-bin-xss
2.开启拦截并打开火狐代理
3.DVWA提交信息
4.burp siute拦截成功
5.调整配置Payloads
Payloads Type选择Extenstion-generted
然后,如下图所示,选择xss Validator
6.配置option
7.添加的数据位于xss validator
8.开启攻击 start attack
(二)Medium
通过查看view source
可以看到使用str_replace函数只对参数进行了简单的替换,过滤
原理:浏览器不区分大小写
2.2组合过滤条件
<scr
弹窗提示
源码:
2.3使用别的便签
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200922145419657.png#pic_center)<a href=’’ οnclick=alert(‘xss’)>click
(三)High
使用了preg_replace正则表达式函数,对参数进行过滤
查看源码可以看到对
(四)Impossible
无法利用xss
PHP htmlspecialchars() 函数
把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体:
三.存储型xss
(一)Low
分析源代码
Trim函数:移除字符串两侧的空白字符或其他预定义字符。(\x00,\n,\r,\,’,",\x1a)
扩展:ltrim() - 移除字符串左侧的空白字符或其他预定义字符
rtrim() - 移除字符串右侧的空白字符或其他预定义字符
mysql_real_escape_string函数:转义SQL语句中的特殊字符 不转译%和_
函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括\0、\t、\n、\x0B、\r以及空格
例子:
mysql_real_escape_string()
以上例子将产生如下输出:
Escaped string: Zak’s and Derick’s Laptop
stripslashes函数过滤掉”\”
测试:(大体和反射型相同)
在message栏中测试:
注:name 一栏有字符长度限制,进行抓包后修改
开启拦截后 提交数据
观察burpsiuite
更改NAME字段
点击转发
收到弹窗提示
(二)Medium
分析源代码,我们可以看到对
m
e
s
s
a
g
e
参
数
m
e
d
i
u
m
级
比
l
o
w
级
多
了
2
个
函
数
,
做
了
很
严
格
的
过
滤
(
进
行
h
t
m
l
实
体
转
义
以
及
转
义
S
Q
L
语
句
中
使
用
的
特
殊
字
符
,
杜
绝
了
对
message参数medium级比low级多了2个函数,做了很严格的过滤(进行html实体转义以及转义SQL语句中使用的特殊字符,杜绝了对
message参数medium级比low级多了2个函数,做了很严格的过滤(进行html实体转义以及转义SQL语句中使用的特殊字符,杜绝了对message关于xss的利用),但对
n
a
m
e
参
数
做
的
过
滤
不
严
格
,
只
是
替
换
<
s
c
r
i
p
t
>
以
及
转
义
S
Q
L
语
句
中
使
用
的
特
殊
字
符
,
可
以
使
用
别
的
h
t
m
l
标
签
对
name参数做的过滤不严格,只是替换<script>以及转义SQL语句中使用的特殊字符,可以使用别的html标签对
name参数做的过滤不严格,只是替换<script>以及转义SQL语句中使用的特殊字符,可以使用别的html标签对name参数的防护进行绕过。
strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
方式大体相同,分为以下几种
2.1.双写绕过
Burpsuite抓包改name参数为:
<sc
2.2.大小写混淆绕过
Burpsuite抓包改name参数为:
2.3.使用非 script 标签的 xss payload:
例如:img标签:
Burpsuite抓包改name参数为:
以上抓包修改数据Forward后,均成功弹窗:
(三)High
分析源代码
可以看到相比较中级而言,高级使用正则表达式对$nam参数多了对
页面源代码
分析发现选择下拉列表内容,其值会赋给default再添加到url的末尾,再将其传给option标签的value结点,由于没有任何过滤,我们输入xss语句即可触发
测试语句
在页面顶端输入url:
即可观察到弹窗
(二)Medium
分析代码
array_key_exists() 函数检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false。
stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)
header() 函数向客户端发送原始的 HTTP 报头
页面源代码没变化
综上可以发现该级别过滤了 script ,但是没有过滤其他危险字段,可以使用img的onerror绕过该防护
测试语句
(三)High
分析代码
页面源代码依旧没有区别,增加后端代码
High级别发现使用白名单,只允许 传的 default值 为 French English German Spanish 其中一个,可以通过在名单中的一项添加注释
注:由于 form表单提交的数据 想经过JS 过滤 所以注释部分的javascript 代码 不会被传到服务器端(也就符合了白名单的要求)
测试语句
default=English#
(四)Ipossible
无解
2.Pikachu
一.反射型xss(get)
二.反射型xss(post)
三.存储型xss
四.DOM型xss
五.DOM型xss-x
六.xss之盲打
七.Xss之过滤
八.Xss之htmlspecialchars
九.Xss之href输出
十.Xss之Js输出
3.XSS漏洞类型区分
反射型:
特征:输入框内输入什么就导出什么
预防措施:使用htmlentities()函数-实体转义
注:弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。
(二)Csrf
1.Csrf(get)
(1)开启拦截 修改并提交信息
(2)拦截到get数据包
(3)修改数据 重新发送
2.Csrf(post)
和get型差不多制作一个表单
通过 csrf Poc修改
实验部分后续补充
网络信息安全—ploto