AJAX Security

AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML),AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词,是指一种创建交互式网页应用的网页开发技术。

AJAX 指异步 JavaScript 及 XML(Asynchronous JavaScript And XML)。

clip_p_w_picpath001

使用ajax 构建应用程序

内翻译常为“阿贾克斯”和阿贾克斯足球队同音。Web应用的交互如Flickr,Backpack和Google在这方面已经有质的飞跃。这个术语源自描述从基于Web的应用到基于数据的应用的转换。在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。

Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。
网页Ajax程序与服务器交互返回内容包括无格式文本,Json串,Xml串,回调的Js代码,而这些返回的信息存在有哪些威胁呢?

DOM-Based cross-site scripting

LAB: Client Side Filtering

Same Origin Policy Protection

DOM Injection

XML Injection

JSON Injection

Silent Transactions Attacks

Dangerous Use of Eval

Insecure Client Storage.

LAB: DOM-Based cross-site scripting (类似跨站脚本)
一般类似博客的网站,可以在文本里擦入图片,正常擦入图片的格式为<IMG SRC="p_w_picpaths/logos/owasp.jpg"/>
但是有的服务器只认识标记<IMG> 并不认识标记里的内容。我们可以把内容改掉。
该实验一共5步
1:<img src"http://localhost:8080/WebGoat/p_w_picpaths/logos/owasp.jpg"/> 我们测试这张图片
clip_p_w_picpath003
2:<img src="X" οnerrοr="alert(0)"/> 我们测试js 脚本alert 插件
3:<iframe src="javascript:alert(0)"></iframe> 我们测试js iframe 插件
4:测试
Please enter your password:<BR><input type = "password" name="pass"/><button onClick="javascript:alert('I have your password: ' + pass.value);">Submit</button><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> 我们测试插入login框 js form 语句
5:我们需要修改该目录
webgoat项目\WebGoat-OWASP_Standard-5.3_RC1\WebGoat-5.3_RC1\tomcat\webapps\webgoat\javascript的DOMXSS.js 这个文件

clip_p_w_picpath004

clip_p_w_picpath006

Client Side Filtering
有时候,一些开发人员为了代码看的方便,往往喜欢在源码里写注释,在项目完成后,往往没有删除注释的习惯,那么很多时候源码里会包含一些敏感信息。
用火狐fireBug可以找到CEO的信息,月薪为45W

clip_p_w_picpath008

STAGE 2: Now, fix the problem. Modify the server to only return results that Moe Stooge is allowed to see.

修改该目录C:\Documents and Settings\monalisa.monalisa@jz\桌面\webgoat项目\WebGoat-OWASP_Standard-5.3_RC1\WebGoat-5.3_RC1\tomcat\webapps\webgoat\lessons\Ajax\ clientsidefiler.jsp 这个文件
clip_p_w_picpath010

clip_p_w_picpath012

Same Origin Policy Protection

同源策略保护

同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。
这里的同源指的是:同协议,同域名和同端口。

同源策略(Same Origin Policy,SOP),也称为单源策略(Single Origin Policy),它是一种用于Web浏览器编程语言(如JavaScript和Ajax)的安全措施,以保护信息的保密性和完整性。同源策略能阻止网站脚本访问其他站点使用的脚本,同时也阻止它与其他站点脚本交互。

HTTP Cookie依靠同源策略来确保用户活动的敏感信息只在一个网站上存在。为了使网站可以没有任何限制的相互交流,就需要脚本来自同一个网站,或者具有相同的源,这样浏览器就可以保持用户安全地会话,而无需用户重新认证。

免客户端的SSL ×××产品通常会规避同源策略;×××从互联网上获取所有的内容并提交给客户端,就好像它来自同一个源,从而允许来自不同网站的脚本进行交互。这是很危险的,因为被感染的网站的恶意脚本可能会与没有限制的合法网站脚本交互,这样有可能导致恶意软件感染或敏感数据被破坏。

精髓:
它的精髓很简单:它认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时,它们应该只被允许访问来自同一站点的资源,而不是那些来自其它站点可能怀有恶意的资源。

为什么要有同源限制?
我们举例说明:比如一个***程序,他利用IFrame把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名,密码登录时,他的页面就可以通过Javascript读取到你的表单中input中的内容,这样用户名,密码就轻松到手了。
Ajax应用:
在Ajax应用中这种安全限制被突破。
在普通的Javascript应用中,我们可以修改Frame的href,或者IFrame的src,以实现GET方式的跨域提交,但是却不能访问跨域的Frame/IFrame中的内容。
而Ajax它通过XMLHTTP进行异步交互,这个对象同样能够与远程的服务器进行信息交互,而且更加危险的是,XMLHTTP是一个纯粹的Javascript对象,这样的交互过程,是在后台进行的,不被用户察觉。因此,XMLHTTP实际上已经突破了原有的Javascript的安全限制。
如果我们又想利用XMLHTTP的无刷新异步交互能力,又不愿意公然突破Javascript的安全策略,可以选择的方案就是给XMLHTTP加上严格的同源限制。这样的安全策略,很类似于Applet的安全策略。IFrame的限制还仅仅是不能访问跨域HTMLDOM中的数据,而XMLHTTP则根本上限制了跨域请求的提交。
浏览器支持:而IE其实给这个安全策略开了两个想当然的后门,一个是:他假设你的本地文件,自然清楚将会访问什么内容,所以任何你的本地文件访问外部数据,都不会收到任何的警告。另一个是:当你访问的网站脚本打算访问跨域的信息时, 他居然仅仅是弹出一个对话框来提醒你一下。如果一个欺诈网站,采用这样的手段,提供一个假页面给你,然后通过XMLHTTP帮你远程登录真实的银行服务器。只要10个用户里,有一个用户糊涂一下,点了一个确定。他们的盗取帐号行为,就成功了!你想想看,这是何等危险的事情!
FireFox就不是这样的做法,缺省的情况下,FireFox根本就不支持跨域的XMLHTTP请求,根本就不给***这样的机会。

演示
这个练习演示了同源策略保护。XHR请求只能被传递回原始服务器。试图通过数据到一个非原始服务器将会失败。

clip_p_w_picpath014

非同源策略
同源策略
clip_p_w_picpath016

Dom Injection

文档对象模型注入

文件物件模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。Document Object Model的历史可以追溯至1990年代后期微软Netscape的“浏览器大战”,双方为了在JavaScriptJScript一决生死,于是大规模的赋予浏览器强大的功能。微软在网页技术上加入了不少专属事物,计有VBScriptActiveX、以及微软自家的DHTML格式等,使不少网页使用非微软平台及浏览器无法正常显示。DOM即是当时蕴酿出来的杰作。(转载于百度)
DOM= Document Object Model,文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。换句话说,这是表示和处理一个HTML或XML文档的常用方法。有一点

DOM

很重要,DOM的设计是以对象管理组织(OMG)的规约为基础的,因此可以用于任何编程语言。最初人们把它认为是一种让JavaScript在浏览器间可移植的方法,不过DOM的应用已经远远超出这个范围。Dom技术使得用户页面可以动态地变化,如可以动态地显示或隐藏一个元素,改变它们的属性,增加一个元素等,Dom技术使得页面的交互性大大地增强。[1]

DOM实际上是以面向对象方式描述的文档模型。DOM定义了表示和修改文档所需的对象、这些对象的行为和属性以及这些对象之间的关系。可以把DOM认为是页面上数据和结构的一个树形表示,不过页面当然可能并不是以这种树的方式具体实现。(转载于百度)

实验
这个漏洞实验的意思应该是在输入框内输入字符的时候会有一个ajax请求到后台验证我输入的key是否合法,然后决定是否激活Activate按钮,是要返回我输入的内容,这样我在输入的内容里面插入Js在返回的时候就会被执行,这样就可以修改Activate按钮的属性达到Dom Injection

clip_p_w_picpath018

我们把activate 按钮激活 把disable 去掉
再按activate!
clip_p_w_picpath020

clip_p_w_picpath022

虚拟机中不成功 我在宿主机做成功了

XML Injection
XML数据注入(XML Data Injection)

XML通常用于存储数据,如果用户提供的数据是以XML的方式进行存储,那么对***者来说,注入额外的、***者可能不能正常控制的XML是有可能的。考虑下述XML,在这个XML中,***者仅仅能够控制Attacker Text文本:

<?xml version="1.0" encoding="UTF-8"?>
<USER role="guest">Attacker Text</USER>

如果用你的输入来替换Attacker Text,那将会是多么有趣的测试用例呢?如果开发人员不够谨慎的话,他们可能错误地允许XML注入。如果以User1</USER><USER role=“admin”>User2 作为输入的话,将会产生如下的XML(用户输入的是黑体文本部分):

<?xml version="1.0" encoding="UTF-8"?>
<USER role="guest">User1</USER>
<USER role="admin">User2</USER>

如果应用程序读取这个文件,并且决定给每个用户分配何种访问权限的时候,User2将获得管理员权限!

提示 如果你能够在XML文件的某个部分注入数据的话,那么发送相同的元素
和属性(这些元素和属性是在以前的XML中出现过的,并且是你所不能访问的)
就会很有价值。一些XML解析器会使用最后指定的那些元素/属性的实例,这样,
你或许就能够有选择性地覆盖以前的一些值。

查看accountID输入框:

clip_p_w_picpath023

当我们输入完6位accountID后,js会发起一个ajax请求:

返回包内容为:

<root>

<reward>WebGoat Mug 20 Pts</reward>

<reward>WebGoat t-shirt 50 Pts</reward>

<reward>WebGoat Secure Kettle 30 Pts</reward>

</root>

勾选选项
clip_p_w_picpath025

clip_p_w_picpath027

我们加入check1004 check1005 测试 看看能得到什么更好的优惠
clip_p_w_picpath028

JSON Injection

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScriptStandard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式.

JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

这个和上面的XML Injection一样,不过这次服务器返回的是Json串

{

\"From\": \"Boston\",

\"To\": \"Seattle\",

\"flights\": [

{\"stops\": \"0\", \"transit\" : \"N/A\", \"price\": \"$600\"},

{\"stops\": \"2\", \"transit\" : \"Newark,Chicago\", \"price\": \"$300\"}

]

}

clip_p_w_picpath030

我们把600改成一个较小的值就可以了

clip_p_w_picpath031

Silent Transactions Attacks

这个案例里面我们点击”Confirm”之后,JS会校验余额是否足够然后给后台发送转账申请,,如图:

我们的余额是11987.09,而我们需要200000,怎么办呢?

我们跟踪Js到判断余额的地方,将我们的balanceValue修改得比我们的amount大一点就可以了~

修改Amount的值,发送,返回

clip_p_w_picpath033

我们将找到有用的funciton
submitData 修改返回数值
打开control 的命令编辑器
我们输入数值

clip_p_w_picpath035
我们运行就成功了

Dangerous Use of Eval

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
实验要求先找到eval alert 后,再利用改漏洞

这个漏洞的威胁在于,回调函数使用了Eval(“返回包内容”),而返回包的内容用户是可以自定义的

clip_p_w_picpath036

点击” Purchase”我们发现会有弹出框,内容为我们填入的number和code,如果我们在number和code里面填入Js会怎样呢?

我们跟踪Purchase按钮的提交事件:

clip_p_w_picpath037

在purchase函数中我们没有发现alert(“”)的地方,继续寻找

clip_p_w_picpath038

终于在makeXHR函数中发现了Eval的踪影~

clip_p_w_picpath039

而我们一直寻找的alert就在这里~

http_request.responseText的内容:

"\r\nalert('Purchase completed successfully with credit card \"4128 3214 0002 1999\" and access code \"123\"');\r\n"

了解原理后,我们尝试修改number值,插入js代码运行

如下,返回包中标记红色的就是number的内容

"\r\nalert('Purchase completed successfully with credit card \"4128 3214 0002 1999\" and access code \"123\"');\r\n"

我们尝试闭合语句,');alert('xss');('

这样子就可以插入任意的Js,来执行我们想要的操作了~
我们插入
); alert(document.cookie); (
clip_p_w_picpath041

clip_p_w_picpath043

Insecure Client Storage
不安全的客户存储

这个漏洞在于把信息(coupon code)存储到了客户端 在客户端端中修改该信息回馈服务器
服务器会执行

查看coupon code的事件,找到验证code的js

clip_p_w_picpath044

在isValidCoupon中发现:

clip_p_w_picpath045

搜索coupons发现在coupon code 存储在Js文件顶部:

clip_p_w_picpath046

这样任何访问页面的用户就可以免费获得这些code了

javascript:alert(decrypt("emph"));

我们运行该脚本
出现gold 代码
clip_p_w_picpath048
然后我们查到input 框 把数值修改下

clip_p_w_picpath050
执行回馈给服务器就成功了

clip_p_w_picpath052