HTML injection 的一些简单想法
来源:Loveshell http://www.loveshell.net
作者:剑心
HTML injection的背景:
1 现在的XSS就是跨站脚本攻击一般都是在有服务器交互的情况下在客户端产生的一些问题,那么在没有服务器交互的情况下呢?
2 另外就是很多人都认为html文件是绝对安全的,那么真的是这样么?
什么是HTML injection:
有交互才会产生漏洞,无论交互是怎么进行的,HTML文件并不是像大家想的那样没有任何交互,在HTML文件里还是会用到一些javascript来完成自己需要的一些动态效果,这样其实交互的地方还是有的,譬如地址栏的参数也就是location,用户所做的点击触发的事件,以及一些动态的DOM交互都会影响到javascript的执行导致漏洞的产生。
为什么要做HTML injection:
在Windows本地存在大量的HTML文件,如果这些HTML文件可以被injection的话,那么就可以利用本地的HTML文件在本地域内执行javascript,权限是非常高的。
如何寻找HTML injection:
寻找交互的地方:交互的地方就是上面说的地址栏等可能可以交互的地方,最常用的就是地址栏了,也就是javascript里的location,所以在HTML文件里寻找location.可能找到你需要的东西。
寻找危险的操作:HTML里危险的操作包括document.write,eval,对innerHTML这些属性的操作等等都可能会造成jnjection,当然也包括一些其他的可能导致执行脚本的操作。
实际的一个例子:
如果你安装了iis,那么很容易在c:\windows\Help\iisHelp\common\下面找到类似于下面的代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>
<head>
<style>
a:link {font:9pt/11pt 宋体; color:FF0000}
a:visited {font:9pt/11pt 宋体; color:#4e4e4e}
</style>
<META NAME="ROBOTS" CONTENT="NOINDEX">
<title>无法显示网页</title>
<META HTTP-EQUIV="Content-Type" Content="text-html; charset=gb2312">
</head>
<script>
function Homepage(){
<!--
// in real bits, urls get returned to our script like this:
// res://shdocvw.dll/http_404.htm#http://www.DocURL.com/bar.htm
//For testing use DocURL = "res://shdocvw.dll/http_404.htm#https://www.microsoft.com/bar.htm"
DocURL=document.URL;
//this is where the http or https will be, as found by searching for :// but skipping the res://
protocolIndex=DocURL.indexOf("://",4);
//this finds the ending slash for the domain server
serverIndex=DocURL.indexOf("/",protocolIndex + 3);
//for the href, we need a valid URL to the domain. We search for the # symbol to find the begining
//of the true URL, and add 1 to skip it - this is the BeginURL value. We use serverIndex as the end marker.
//urlresult=DocURL.substring(protocolIndex - 4,serverIndex);
BeginURL=DocURL.indexOf("#",1) + 1;
urlresult=DocURL.substring(BeginURL,serverIndex);
//for display, we need to skip after http://, and go to the next slash
displayresult=DocURL.substring(protocolIndex + 3 ,serverIndex);
insertElementAnchor(urlresult, displayresult);
}
function HtmlEncode(text)
{
return text.replace(/&/g, '&').replace(/'/g, '"').replace(/</g, '<').replace(/>/g, '>');
}
function TagAttrib(name, value)
{
return ' '+name+'="'+HtmlEncode(value)+'"';
}
function PrintTag(tagName, needCloseTag, attrib, inner){
document.write( '<' + tagName + attrib + '>' + HtmlEncode(inner) );
if (needCloseTag) document.write( '</' + tagName +'>' );
}
function URI(href)
{
IEVer = window.navigator.appVersion;
IEVer = IEVer.substr( IEVer.indexOf('MSIE') + 5, 3 );
return (IEVer.charAt(1)=='.' && IEVer >= '5.5') ?
encodeURI(href) :
escape(href).replace(/%3A/g, ':').replace(/%3B/g, ';');
}
function insertElementAnchor(href, text)
{
PrintTag('A', true, TagAttrib('HREF', URI(href)), text);
}
//-->
</script>
<body bgcolor="FFFFFF">
<table width="410" cellpadding="3" cellspacing="5">
<tr>
<td align="left" valign="middle" width="360">
<h1 style="COLOR:000000; FONT: 12pt/15pt 宋体"><!--Problem-->无法显示网页</h1>
</td>
</tr>
<tr>
<td width="400" colspan="2">
<font style="COLOR:000000; Font: 9pt/11pt 宋体">试图访问的网页出现问题,无法显示。</font></td>
</tr>
<tr>
<td width="400" colspan="2">
<font style="COLOR:000000; FONT: 9pt/11pt 宋体">
<hr color="#C0C0C0" noshade>
<p>请尝试执行下列操作:</p>
<ul>
<li>打开
<script>
<!--
if (!((window.navigator.userAgent.indexOf("MSIE") > 0) && (window.navigator.appVersion.charAt(0) == "2")))
{
Homepage();
}
//-->
</script>
主页,然后查找与所需信息相关的链接。</li>
<li>单击<a href="javascript:location.reload()">刷新</a>按钮,或稍后重试。<br>
</li>
</ul>
<h2 style="font:9pt/11pt 宋体; color:000000">HTTP 错误 414 - 请求 - URI 太长<br> Internet 信息服务</h2>
<hr color="#C0C0C0" noshade>
<p>技术信息(用于支持人员)</p>
<ul>
<p>
<li>背景<br>
<p>请求的 URI 太长,服务器拒绝处理请求。这种情况仅在下列情形下才会发生:</p>
<p>客户端错误地将 POST 请求转换为带有长查询信息的 GET 请求。</p>
<p>客户端遇到重定向问题(例如,重定向 URL 的前缀指向自身的后缀)。</p>
<p>服务器遭到客户端的攻击,该客户端试图找出那些使用定长缓冲区来读取或控制请求 URI 的服务器上的安全漏洞。</p>
</li>
<li>详细信息:<br><a href="http://www.microsoft.com/ContentRedirect.asp?prd=iis&sbp=&pver=5.0&pid=&ID=414&cat=web&os=&over=&hrd=&Opt1=&Opt2=&Opt3=" target="_blank">Microsoft 支持</a>
</li>
</ul>
</font></td>
</tr>
</table>
</body>
</html>
注意其中使用了DocURL=document.URL也就是地址栏参数,这些参数在后面参与了各种运算和操作,跟踪这个参数最后可以见到是进入了document.write的,不过之前是做了htmlEncode,不过还是没关系,我们可以用javascript:的形式执行需要的代码
file:///C:/WINDOWS/Help/iisHelp/common/400.htm#javascript:alert('loveshell')/
将产生一个连接,点击的话代码将会执行,但是也可以很遗憾地注意到,在这之前IE会提示说有代码会执行......
我们在YY么:
在Windows下面存在大量的HTML文件,甚至包括chm里面带的HTML文件,dll文件里的HTML资源文件,这种漏洞只要挖掘还是会有的,在老版的IE里是允许用iframe和a这些标签引用本地文件的,但是在IE的新版里禁止了这种操作,注意是IE禁止了这种操作,那么其他的程序呢?譬如 realone,譬如其他的协议hcp?