2018上海大学生安全竞赛web3解析

直接给源码吧:

<?php
    //error_reporting(0);
    //$dir=md5("icq" . $_SERVER['REMOTE_ADDR']);
    $dir=md5("icq");
    $sandbox = '/var/sandbox/' . $dir;
    @mkdir($sandbox);
    @chdir($sandbox);

    if($_FILES['file']['name']){
        $filename = !empty($_POST['file']) ? $_POST['file'] : $_FILES['file']['name'];
        if (!is_array($filename)) {
            $filename = explode('.', $filename);
        }
        $ext = end($filename);
        if($ext==$filename[count($filename) - 1]){
            die("emmmm...");
        }
        $new_name = (string)rand(100,999).".".$ext;
        move_uploaded_file($_FILES['file']['tmp_name'],$new_name);
        $_ = $_POST['hehe'];
        if(@substr(file($_)[0],0,6)==='@<?php' && strpos($_,$new_name)===false){
            include($_);
        }
        unlink($new_name);
    }
    else{
        highlight_file(__FILE__);
        

先看后缀名绕过吧。看着有点熟悉,总感觉在哪见过,后来才想起是pwnhub的公开赛里见过,考察的是end()函数。给个例子输出就清楚了。

<?php
	$a[2] = '222';
	$a[1] = '111';
	$a[0] = '000';
	
	$end = end($a);
	var_dump($end);
	
	$arr = $a[count($a)-1]
	var_dump($arr);


?>

输出结果:

end输出输入顺序最后一个

所以这里绕过是文件名取$_POST'file'绕过

至于下面unlink的绕过,有两种解法,一种是加/.,一种是../绕过。

我本地搭建更换了目录,可以看到已经成功写入

加/. unlink无法删除是linux下的特性,windows并不适用。

接下来传入hehe参数,爆破包含即可。

至于加../,产生的随机数会生成会被当成路径。

然后直接包含我们的文件即可。

看下当前目录

生成了shell.php,也成功写入了。

这里加 /. 和 ../ unlink都没删除,p牛小密圈给过解释

查看php源码,其实我们能发现,php读取、写入文件,都会调用php_stream_open_wrapper_ex来打开流,而判断文件存在、重命名、删除文件等操作则无需打开文件流。

我们跟一跟php_stream_open_wrapper_ex就会发现,其实最后会使用tsrm_realpath函数来将filename给标准化成一个绝对路径。而文件删除等操作则不会,这就是二者的区别。

所以,如果我们传入的是文件名中包含一个不存在的路径,写入的时候因为会处理掉“../”等相对路径,所以不会出错;判断、删除的时候因为不会处理,所以就会出现“No such file or directory”的错误。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

apple ID可绕过安全提示问题直接修改密码漏洞

利用前提:知道受害者的apple id及其注册时的出生日期 利用步骤: 第一步:登录https://iforgot.apple.com/iForgot/iFor...

25610
来自专栏吴伟祥

配置Tomcat使用https协议(配置SSL协议) (http自动跳转到https)

1342
来自专栏有困难要上,没有困难创造困难也要上!

Redis实现类似同步方法调用的功能(一)

37211
来自专栏软件

十分钟搞定SourceTree安装使用

下载位置: 链接: https://pan.baidu.com/s/1sluTAG1 密码: qexi ? ? ? ? ? ? SourceTree跳过Atla...

1.3K6
来自专栏hbbliyong

Git SSH Key 生成步骤

Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置。 github的SSH配置如下: 一 、 设置Git的us...

3896
来自专栏云加头条

Git 2.13 正式发布,可检测 SHA-1 冲突

最近,开源项目 Git 正式发布了 Git 2.13.0 版本,包括了来自 65 位贡献者开发的特性和 Bug 修复。其中特别值得一提的一处 Bug 修复与 `...

4880
来自专栏Python

linux每日命令(7):rmdir命令

rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的。(注意,rm - r dir命令可代替rmdir,但是有很大危险性。)删除某目录...

1094
来自专栏魏艾斯博客www.vpsss.net

腾讯云 CDN 和 lnmp1.4 环境安装 Let’s Encrypt 免费证书教程

2843
来自专栏云计算教程系列

如何在Debian 9上安装和配置Nextcloud

Nextcloud是ownCloud的一个分支,它是一个文件共享服务器,允许您将个人内容(如文档和图片)存储在集中位置,就像Dropbox一样。与Nextclo...

1.6K3
来自专栏信安之路

代码安全之上传文件

从数据包中可以看出,验证文件类型的参数有:Content-Type、Filename、Filedata。

1380

扫码关注云+社区

领取腾讯云代金券