WebGoat Day2 Ajax Security

Client Side Filtering

总结

客户端是不可信的,不要将过多信息(权限外信息)传输给客户端。

实验过程

直接用 F12 找到隐藏信息即可。

自动化检测的可行性

较难,难以判定什么是权限外信息。

Same Origin Policy Protection

总结

本节课程主要是熟悉同源策略。

同源策略保护。同源策略是指,域名,协议,端口相同。它是客户端脚本,尤其是JavaScript的重要安全度量标准。它阻止从一个源加载的文档/脚本用来获取或设置另一个源加载的文档的属性。
AJAX技术的一项关键元素是XMLHttpRequest(XHR),该技术允许客户端向服务器端发起异步调用。然而,作为一项安全措施,这些请求最好只能从客户端原始页面向服务端发起访问。

可以看到,下面该页面下面依次有两个超链接,第一个是链接符合同源策略的,第二个链接是不符合同源策略的。
XMLHttp只能向同源服务器发送请求,任何向非同源服务端发送数据的尝试都将失败。

DOM Injection

总结

前端禁用功能并不可靠,可以通过修改response绕过。如果要禁用,必须同时保证后台禁用。

实验步骤

(实验失败,找不到form)

修改burpsuit的默认设置,开启响应拦截。

请求拦截后,依次点击:Action ——> Do intercept ——> Response to this request
设置拦截该请求的响应后,点击Forward,拦截到如下服务器的响应。

修改该响应,找到submit这里,去掉“disabled”字段,然后forward,可见浏览器显示的激活按钮已经可以按动了。

DOM-Based cross-site scripting

总结

DOM型 跨站脚本的常见利用方式, 再次印证一切输入都是不可信的。

实验过程

首先发现输入都会到一个 h1 标签内
第一阶段
For this exercise, your mission is to deface this website using the image at the following location: OWASP IMAGE

1
<IMG SRC="images/logos/owasp.jpg"/>

第二阶段
Now, try to create a JavaScript alert using the image tag

1
<img src=x onerror=;;alert('XSS') />

第三阶段
Next, try to create a JavaScript alert using the IFRAME tag.

1
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

第四阶段
Use the following to create a fake login form

1
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>

第五阶段

Perform client-side HTML entity encoding to mitigate the DOM XSS vulnerability. A utility method is provided for you in escape.js.

即如何防御 DOM XSS


1
2
3
4
5
function displayGreeting(name) {
if (name != ''){
document.getElementById("greeting").innerHTML="Hello, " + name + "!";
}
}

修改为

1
2
3
4
5
function displayGreeting(name) {
if (name != ''){
document.getElementById("greeting").innerHTML="Hello, " + escapeHTML(name); + "!";
}
}

就是用 escapeHTML 过滤一下输入。

XML Injection

burp 拦截和篡改 XML

JSON Injection

实验步骤

说起来都不一定要burp拦截改包,直接 F12 修改就行了。

Insecure Client Storage

总结

不安全的客户端存储。在服务器端验证所有的用户输入信息是很好的,但是在客户端输入的任何验证信息都存在被逆向分析的脆弱性。记住,客户端的任何数据都不能被视为机密!

实验步骤

第一阶段
F12 Sources
客户端JS断点调试的基本方法

第二阶段
要求我们绕过客户端的验证,提交订单却不花钱。这个需要在客户端修改价格,利用firebug,在HTML中找到readonly=””,删除该属性,则可在页面上随意修改商品价格,然后提交免费的订单!

Slient Transactions Attacks

总结

验证转账合理性的部分不应该放在前端,应该在后台验证,放在前端会存在被逆向的风险。

实验步骤

当用户输入账户名和额度后,点击“Confirm”,在转账交易前,会首先调用processData()来判断用户的输入以及转账额度是否合理等,然后调用函数submitData(accountNo, amount)进行转账,而该函数实际上是向后台提交转账所需的重要信息:目标账号和转账金额。

如果通过浏览器直接执行submitData(accountNo,balance)函数,那么就可以绕过客户端验证,不需要任何额外的确认和用户数字签名。这里指的是用浏览器直接执行,而不是系统给定的“Confirm”按钮。在浏览器地址栏输入如下内容:

1
javascript:submitData(1,1)

Dangerous Use of Eval

总结

危险指令使用。eval()函数可以编译并执行任何JS代码。这隐藏了一个潜在的安全问题。

实验步骤

这是一个购物的网页,要求通过alert()函数显示出document.cookie,3位数的授权码会进入服务器进行验证,因此可以针对该授权码进行特别构造。
输入如下内容:

1
123');alert(document.cookie);('

则服务器收到并返回的JavaScript结果是

1
2
3
eval(‘123’);
alert(document.cookie);
(‘’);

参考资料

[1] WebGoat之AJAX Security