前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战-某QQ邮箱钓鱼网站白盒渗透POC

实战-某QQ邮箱钓鱼网站白盒渗透POC

作者头像
字节脉搏实验室
发布2020-04-20 11:15:31
3.4K0
发布2020-04-20 11:15:31
举报

作者-寺鹓

1.实验目标:成功登录到钓鱼网站后台

POC关键词:COOKIE伪造

简述:利用PHP程序中含有逻辑问题(仅验证admin_pass),绕过login页面,登录后台

2.实验过程

(1)打开钓鱼页面

看域名可以发现这是一个伪造成官方QQ邮箱页面的钓鱼网站

查看源代码发现,网页的javascript来获取用户的UA来决定是否跳转至wap.html,从源代码来看没有什么收获

从robots.txt来看也没有敏感信息

那么尝试一下常见的admin目录看看

果不其然,此处有一个管理页,初步尝试了几个基本的弱密码但是都报账号密码错误

这时候可以推测是否可以尝试一下sql注入绕过登录?

很不幸的是估计这里有一个waf限制着,尝试了好几个sql语句,也没有办法绕过

此时我们可以推测,这些钓鱼cms基本上从搜索引擎搜索也能找到源码,在某网站上成功找到一模一样的cms,下载下来,用phpstudy本地搭建了一个环境,大体上没有什么区别。

分析部分:

从这个web程序中有两个目录,分别是admin目录,include目录,与include目录的子目录360safe,这个目录里存放着360safe防注入脚本,而且是可以更新的,此时就不考虑sql注入了,难度较高

那么接下分析admin/login.php页面

首先第一句话就可以看到引用了一个include目录下的common.php

这里先暂时继续下去,等到发现哪个变量缺了的时候,再回头看这个common.php

接下去是一个从前端获取用户输入账号密码的语句

此时,程序获取到了用户输入账号密码,下面是比对数据库的部分

在第19行,发现了一个非常有趣的$_POST变量ispersis,很遗憾的是,我并未在其他页面找到这个变量,所以我们暂且认为这个if语句不会执行,在实际测试的使用,的确用户正常输入账号密码登录,确实不会到达这条语句,即19-23行

但是给了我们一个思路,这个程序可能会存在判断Cookie的参数值来确定登录状态

可以分析19-23行做的是如果存在这个ispersis则会给Cookie添加参数islogin、admin_user、admin_pass,并且会提示登录成功,这时候有一个思路,可以通过伪造Cookie的方式来实现登录

虽然上面的if语句上半部分不会执行,但是else语句就变成一定会执行,可以看到这里有一个$_SESSION,表示这里通过SESSION来存储参数,服务器端存储数据,在客户端中的Cookie信息里有一个PHPSESSID,这就是服务器用来判断不同网页客户端的依据。

在46-55行中可以看到,当从get中获得logout变量后,就会把cookie的值清空,并且提示已经注销

这时候login.php已经审计完毕,我们回头看看这个页面开头的第一句,引用了一个名叫common.php,现在来审计这个页面

在这张图的第五行发现了一个有趣的全局常数LOGIN_KEY,值为abchdbb768541,这里和之前login.php页的验证密码处有关联

(下图common.php)

(下图login.php)

继续审计这段代码,发现除了一个连接的数据库语句以外,还引用了许多的页面,有function.php,member.php(判断登录的关键),os.php(钓鱼网站获取用户UA判断手机品牌),kill.intercept.php

那么关键的自然是member.php

最终定论:

这里从两条if语句

1. if($_COOKIE["admin_user"])

2. if(isset($_SESSION['islogin']))

可以证实,这个后台登录存在两种校验方式,第一种是通过SESSION的方式校验,第二种的方式是COOKIE校验,两种方式的特征在于,

1.SESSION校验在浏览器的COOKIE信息中只有PHPSESSID

2.在COOKIE校验中,COOKIE信息会存在admin_user、 admin_pass、islogin、PHPSESSID

显然,从COOKIE下手是最好的办法

想要伪造COOKIE,那就要从源码分析下手,图中第一行就告诉我们islogin参数要等于1,否则就免谈!

图中第三行的信息告诉我们,admin_user应该是一个被base64加密过的字符串

图中第四行连接了数据库获取了“用户名为$admin_user”的该行信息,那么这里和之前在登录页试图sql注入语句的地方不同点在于,这里没有360waf的阻拦,是一个关键点之一

图中第五行用人话来描述就是

$admin_pass1=sha1(查询数据库的密码的值 + LOGIN_KEY)

图中第六行是一个关键点,串联起来所有信息,就是一句话:假如 从数据库调取的值计算出的$admin_pass1等于COOKIE中的admin_pass,则会把1赋值给变量islogin(注意这里的islogin不是Cookie的参数)

islogin的作用在于校验是否为管理员,从admin/index.php这句话就可以理解islogin的作用

(下图为admin/index.php)

这里的意思是如果变量islogin不等于1,则会重定向到login.php

我们看回校验点:

我们看回校验点:

1. udata = DB->get_row("SELECT * FROM fish_admin WHERE username='

2.admin_pass1=sha1(udata['password'] + LOGIN_KEY)

假如我在username中填入一个数据库不存在的用户名,自然就不会返回任何的值,得到 $udata['password']就为空!

那么一个小学数学的问题,a1=sha1(a2 + LOGIN_KEY),且a2=0

答案为$admin_pass1=sha1(Login_KEY)

(注:Login_Key为abchdbb768541)

此时的POC就是这样子构成

COOKIE参数:

admin_user = base64_enconde(一个不存在的用户名)

admin_pass = sha1(LOGIN_KEY)

islogin =1

PHPSESSID = 略

通过实验,在火狐浏览器开发者工具,添加上面的COOKIE信息

成功登录到后台页

实验结束

附赠全部代码(含少量注释)

链接: https://pan.baidu.com/s/1a6nQkOQiDGrVuQbBoP8P0g

密码: g330

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档