暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

获取Httponly 保护下的Cookie

漫流砂 2018-10-03
8404

httponly 的作用

https://www.owasp.org/index.php/HTTPOnly

owasp组织给出了定义说明

简单来说,Cookie的httponly属性是为了安全而设定的,带有httponly 属性的Cookie是不会被 js 获取到的


关于httponly的作用,网上搜索有一大堆,在这里说也没有什么必要

主要影响就是XSS攻击中无法通过document对象直接获取到cookie


绕过httponly限制获取cookie

思考过程中,我们应该有一定的方向性

httponly 限制了js 对 cookie的获取,那么就只能从http header中进行获取了

要不就是特定的一些漏洞,导致httponly防护失效,这种肯定是后端的漏洞了


phpinfo 信息

phpinfo是一个常见的信息泄漏途径,很多厂商不在乎,但是这个对于搞安全的来说,就像挖到了宝一样

phpinfo中蕴含着大量的信息,其中就有http header信息,从这里我们可以读取出来受保护的cookie


这里就拿一个实际案例来看吧

从上面的这个界面可以看到 HTTP_COOKIE 这个字段中存放着Cookie,这个Cookie是直接从http header中读取出来的,所以即使Cookie设置了httponly 也是一样的


不过这里我要说一下,只有存在设置Cookie之后才会看到这种字段

这里测试的版本是

我们进行简单验证一下

利用黑客语法

intext:"PHP Version 5.2.17p1"

查看页面中的第二个

可以看到这个是没有的

所以这个信息是否存在于网站的程序是有关系的,与网站的功能也是有关系的,比如有些静态新闻站根本不设置cookie


那么既然这种方法可以获取到httponly保护下的cookie,那么我们就来攻击一下吧

主要可以利用AJAX,关于AJAX的学习可以参考

http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_send.asp

我也是刚刚才学具体的语法,之前都没有特别在意,


思路是这样的:通过XSS漏洞,是服务器发起对phpinfo的访问,之后对响应包进行匹配摘取,获取到Cookie的值,并且赋值给一个变量

剩下的操作就很一般了,正常的xss的利用方式就好了


下面我们就来实验一下

首先写一个设置cookie的php脚本 index.php

代码如下

这个脚本通过header方法进行设置cookie

之后通过js进行读取我们的cookie,并且弹窗出来


我们还要写一个phpinfo文件在服务器上面

此时我们一旦访问index.php 就会被赋予Cookie

所以我们先直接访问phpinfo.php,方便一会儿对比

可以看到此时是没有cookie相关的字段的,毕竟没有赋予Cookie 的操作嘛

下面我们访问一下index.php

可以看到弹窗中将没有设置httponly的Cookie显示了出来,而设置了httponly的并没有,这也显示了httponly的作用


下面我们再来访问一下phpinfo.php

可以看到成功获取到了受保护的cookie

其实还有很多字段都有这个信息

此时我们需要写一个含有xss漏洞的脚本用来演示

代码如下

我们来看一下效果

啊欧,Chrome浏览器把我的危险操作拦截了,好吧,看不到演示效果,我们换Safari 浏览器

也没有弹窗,看来Safari 也是有防护的


这次用火狐试试

可以看到,火狐成功弹窗,各大浏览器的安全性可见一斑

那接下来的操作我们都用火狐浏览器来完成吧


想要完成整个操作,还需要两项,一个是js代码,一个是用来接收cookie的服务器,我们就拿我的物理机当这个服务器吧,直接使用python自带的模块搭建简易服务器

可以看到,我的IP地址是 192.168.123.238,下面我们先测试一下是否可以看到请求的url

sudo python3 –m http.server 9000

接下来我们用XSS服务器来访问我物理机的9000端口的a.php?cookie=dddd这个url

可以看到,在物理机python3搭建起来的服务器中可以直接看到完整的请求参数

这我就放心了,就怕你这后院起火


下面我们来写最主要的,需要执行的js代码

这个代码可以直接让用户本地执行,也可以放在一个远程服务器上面让用户远程加载

这里就演示用户直接本地执行

具体代码我会放在百度云中共享


简单解释一下,这个主要是利用XMLHttpRequest 来请求 phpinfo.php,并且获取页面信息,之后使用js 来虚拟表单,使用post方法发送我们获取到的信息

PS:这里我要说明两个问题

为什么把phpinfo 的全部信息都传递过去?

这是因为我不太会处理js的字符串和html等的关系,又不想用正则去匹配

2. 为什么使用post方法?

这个是由于上一条的原因,数据量很大,所以使用GET方法会超出最大长度,从而导致信息不全,所以使用post方法


现在我们可以开始实验了


首先访问index.php,获取Cookie

可以看到没有获取到httponly保护下的Cookie

之后我们访问XSS页面,xss.php

此时我们带上name参数访问一下

此时我们输入什么都会显示出来,我们简单测试一下简单的反射型XSS

可以看到存在反射型XSS,


接下来就是窃取cookie 的过程了

用我的物理机作为被害机器,我来访问设计好的url

我们得先设置一下监听,之前用Python3的http.server进行接收信息,发现不支持post方法,所以我们改为 nc 来进行

这回我们来访问特定的URL吧

注意一下,这里要把原来的 + 变为 %2B 进行,不然会被当作空格,我们执行一下

看看我们接受到的信息(信息量很巨大,因为没有筛选,这里只是一部分数据)

这里的数据是经过escape函数处理的,我们需要使用unescape函数解密一下数据部分

首先是进行urldecode

之后我们再使用Chrome的console来解密一下unescape

执行之后就会看到解密后的信息,这回我们查看一下我们关注的信息吧

可以看到成功获取到了受httponly保护的Cookie,成功!


PS:其实整个过程很简单,不过由于我对js不熟悉,所以用了很多复杂的东西,其实可能很多前端程序员几下就完成了,不过思路是没有问题的!

脚本地址: https://pan.baidu.com/s/1A58dBhtYbWOPuiOAhJWAoQ 提取码: 37k4

文章转载自漫流砂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论