Phuck2

打开靶机,一片空白,传参也没发现啥(一度以为靶机坏了)

然后使用arjun工具找到参数:hl

传入参数,给了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
    stream_wrapper_unregister('php');
    if(isset($_GET['hl'])) highlight_file(__FILE__);
 
    $mkdir = function($dir) {
        system('mkdir -- '.escapeshellarg($dir));
    };
    $randFolder = bin2hex(random_bytes(16));
    $mkdir('users/'.$randFolder);
    chdir('users/'.$randFolder);
 
    $userFolder = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']);
    $userFolder = basename(str_replace(['.','-'],['',''],$userFolder));
 
    $mkdir($userFolder);
    chdir($userFolder);
    file_put_contents('profile',print_r($_SERVER,true));
    chdir('..');
    $_GET['page']=str_replace('.','',$_GET['page']);
    if(!stripos(file_get_contents($_GET['page']),'<?') && !stripos(file_get_contents($_GET['page']),'php')) {
        include($_GET['page']);
    }
 
    chdir(__DIR__);
    system('rm -rf users/'.$randFolder);

源码审计:

大概可以了解最后需要通过get:page达到文件包含执行rce的目的

有几个新函数,查下

stream_wrapper_unregister

escapeshellarg

虽然说看不懂

我们可以大概知道 这两个函数都安全的一批

然后随机化了用户所在文件夹

关键代码:

$userFolder = (isset($_SERVER[‘HTTP_X_FORWARDED_FOR’]) ? $_SERVER[‘HTTP_X_FORWARDED_FOR’] :

$_SERVER[‘REMOTE_ADDR’]); $userFolder = basename(str_replace([‘.’,’-‘],[”,”],$userFolder));

X_FORWARDED_FOR去获取数据作为用户的文件夹名userFolder

file_put_contents 把 $_SERVER 的所有数据写到 userFolder/profile 里,并且没有过滤,那么我们随便写一个 HTTP 头,传入任意 PHP 代码,可以造成 RCE

现在做的就是想办法绕过<?php,也就是这道题的考点了,include 与 file_get_contents 在关于 Data URI 处理问题上的问题,include () 与 file_get_contents () 支持Data URI

查了一下资料:

allow_url_include=Off

file_get_contents在处理data:xxx时会直接取xxx

所以我们现在明白了,只要将xff头改成我们要的文件名,然后随意插入一个http头,包含我们的恶意代码,文件包含即可执行任意rce命令

而include会包含文件名为data:xxx的文件

然后执行get_flag就行

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud