这个口令红包没领成。
新年新气象,逛圈子偶遇到P牛发的一个红包。
题目如下:
1 | 2018.mhz.pw:62231 |
信息获取
使用浏览器访问题目,发现无法访问,且提示为ERR_INVALID_HTTP_RESPONSE
,那就说明这个端口并不是HTTP协议
的服务。
使用端口指纹识别:
rsync
是linux系统下的数据镜像备份工具。所以我们得去了解一下rsync
的基本语法
1 | 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://2018.mhz.pw:62231 |
源码拉取
将git
裸仓库进行还原
1 | git clone pwnhub_6670.git/ |
需要审计的源码还原成功,但是本地搭建没成功,得修改修改(环境问题)。
漏洞挖掘
文件列表如下:
初略看了下,只有一个登录框。
那还是读源码吧。从index.php
跳转至cpre.php
,先看这份PHP代码
。
从开始都是一些常规的全局设置。再往下看。
目标站点只有简单的登陆功能,相关代码如下:
1 | escape($_REQUEST); # 转义 |
在检测的$name
值当中,$_SERVER
很明显并没有被转义处理。或许我们能利用这一个点。
再往下看代码、来到了Controller
类。分了BaseController.php
和MainController.php
,它们是继承关系。在MainController.php
看到了三个函数。
1 | actionIndex() #主页 |
看到这里我才知道是有注册功能的。下面来看看actionRegister
的代码:
1 | function actionRegister(){ |
能利用的点就是email的组成元素(HTTP_HOST),而HTTP_HOST
又是由arg函数
获取的,也就是说可以从没有被转义的$_SERVER
着手。既然是数据库操作,那就看看是否能构造语句使之形成SQL注入漏洞
。
先明确一点:Email由用户名
、@
、Host
三者拼接而成,而Host
可利用的点为$_SERVER
。
但是其中有个FILTER_VALIDATE_EMAIL过滤器
,所以首先还是得绕过这个过滤器。
绕过过滤器
第一次见到FILTER_VALIDATE_EMAIL
是在PHPMailer的CVE-2016-10033
里面遇到的,当时还是用着wordpress
博客程序。
这样就能引入了引号,又符合过滤器的规则。那我们就传入用户名为"qqq
,Host为rcoil'"@rcoil.me
进行注册。因为邮箱中包含单引号,所以必会造成SQL注入
。
构造SQL注入
将Host
进行修改,结果如下:
404错误,并不是我们想象中的情景。之前做CTF的时候有过这类型的情况,添加多一个Host
就可以了。如图:
既然构成了SQL注入,那就看看怎么利用了。
SQL注入
在源码中有分sql备份文件,从里面能看到SQL的结构。
最后卡在了这个报错注入里面。
P牛的WriteUP
知识点还是掌握得不够,静下心来好好学习。
看了P牛的WriteUp,才注意到create
方法就是拼接了一个INSERT
语句,而且报错信息也没仔细看。
现在回过头来想想,确实就是这么一回事。在插入的过程中,闭合了前段语句,再新建一个语句插入自己定义的语句,就能在可控的范围内获取自己所需要的信息。翻了翻之前的笔记。
1 | mysql> use test; |
然后我们构造一下语句
1 | POST /main/register HTTP/1.1 |
闭合了前段的INSERT语句
,并新建了一条语句,在email
字段将flag
读取。