这个口令红包没领成。
新年新气象,逛圈子偶遇到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读取。