WebGoat笔记之三-- AJAX Security
网页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.
DOM-Based cross-site scripting
分析
基于DOM的CSS(即XSS)漏洞一般都是由于JS没有对输入的参数作过滤,导致用户可以输入一些XSS载体标签。
在输入框中,我们输入常规的字符发现上面都会出现Hello, XXX的显示
找到输入框的HTML代码,在键盘输入之后会激活displayGreeting事件,并将输入框中的内容作为参数传入
查看displayGreeting函数displayGreeting没有对参数做任何过滤,直接就替换了greeting的内容,这样我们就可以分析页面代码直接输入想要的标签来进行攻击了
greeting标签的内容如下
方法
输入 <img src=x onerror=alert(document.cookie)>
或者 <img src=”http://www.paipai.com/delitem?itemid=232131312”>
这样就可以发起CSRF攻击了
但是这种漏洞的攻击模式在哪呢?需要用户打开这样的页面,还要骗取用户向这样的输入框里面输入攻击者发过去的信息,有难度,模式待研究….
LAB: Client Side Filtering
修改larry的id值,Neville的ID为112,选择larry,这样就可以看到CEO Neville的信息了
由此可见,重要逻辑的判断千万不能放在客户端
Same Origin Policy Protection
同源保护
DOM Injection
这个漏洞的意思应该是我在输入框内输入字符的时候会有一个ajax请求到后台验证我输入的key是否合法,然后决定是否激活Activate按钮,理论上应该是要返回我输入的内容,这样我在输入的内容里面插入Js在返回的时候就会被执行,这样就可以修改Activate按钮的属性达到Dom Injection的目的呀~
但是题目意思好像是要拦截返回包,修改返回包内容达到目的,我们简单点,直接改页面:
修改Activate!按钮的属性,把disabled删去~
XML Injection
查看accountID输入框:
当我们输入完6位accountID后,js会发起一个ajax请求:
http://hacker.qq.com:8080/webgoat/attack?Screen=3825&menu=400&from=ajax&accountID=836239
返回包内容为:
<root>
<reward>WebGoat Mug 20 Pts</reward>
<reward>WebGoat t-shirt 50 Pts</reward>
<reward>WebGoat Secure Kettle 30 Pts</reward>
</root>
然后回调calback()函数
题目的意思是我们可以修改返回包的内容,但是我修改了n次总是没有成功。。。
所以只能通过修改页面代码来达到目的了,方法如下:
安全中心XML注入漏洞(from jima’s ppt)
JSON Injection
这个和上面的XML Injection一样,不过这次服务器返回的是Json串
{
\"From\": \"Boston\",
\"To\": \"Seattle\",
\"flights\": [
{\"stops\": \"0\", \"transit\" : \"N/A\", \"price\": \"$600\"},
{\"stops\": \"2\", \"transit\" : \"Newark,Chicago\", \"price\": \"$300\"}
]
}
我们把600改成一个较小的值就可以了
同样是修改Callback函数内的返回值,req.responseText的值还是没修改成功,直接修改了card的值,方法如下
这个XML Injection和JSON Injection漏洞的做的有点牵强,应该要有用户提交数据,然后提交的数据被包装到一个Xml或者Json里面结果,而数据没有过滤就被包装,破坏了预期的Xml或这Json格式,导致页面显示不正常
Silent Transactions Attacks
这个案例里面我们点击”Confirm”之后,JS会校验余额是否足够然后给后台发送转账申请,,如图:
我们的余额是11987.09,而我们需要200000,怎么办呢?
我们跟踪Js到判断余额的地方,将我们的balanceValue修改得比我们的amount大一点就可以了~
另外一种方式就直接抓个包:
http://hacker.qq.com:8080/webgoat/attack?Screen=4075&menu=400&from=ajax&newAccount=1&amount=2000000&confirm=Transferring
修改Amount的值,发送,返回
The Transaction has Completed Successfully.
Dangerous Use of Eval
这个漏洞的威胁在于,回调函数使用了Eval(“返回包内容”),而返回包的内容用户是可以自定义的
点击” Purchase”我们发现会有弹出框,内容为我们填入的number和code,如果我们在number和code里面填入Js会怎样呢?
我们跟踪Purchase按钮的提交事件:
在purchase函数中我们没有发现alert(“”)的地方,继续寻找
终于在makeXHR函数中发现了Eval的踪影~
而我们一直寻找的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,来执行我们想要的操作了~
Insecure Client Storage
这个漏洞在于把信息(coupon code)存储到了客户端
查看coupon code的事件,找到验证code的js
在isValidCoupon中发现:
搜索coupons发现在coupon code 存储在Js文件顶部:
这样任何访问页面的用户就可以免费获得这些code了