WebGoat的大坑
由于WebGoat不同的版本课程都不一样,所以说网上的资料也不全,我用的是7.1.0版本,先来上个图
而且**!!!最坑的是!!!**有些题根本他娘的没答案,或者答案是错的,开发版的题也不知道怎么做!
Introduction
这一章节教了你怎么用这个东西,以及怎么为这个组织贡献课程,主要就是3个选项,没什么实质教学内容
- Java Source: 源码
- Solution: 答案
- Hints: 提示
General-Http Basics
这一章节让你明白什么是Http,可以用BurpSuite拦截一下报文和我Blog中讲的基础进行验证下,Solution使用的拦截工具是WebScarab,单独安装比较难,可以在Kali中使用,但是我用的是BurpSuite,效果一样.
Access Control Flaws-Using an Access Control Matrix
这个就是让你初步理解权限的概念,点一点,找到谁的权限最大就可以了
Access Control Flaws-Bypass a Path Based Access Control Scheme
这一节是让你利用拦截工具,改变参数,访问到原本不能访问的路径,在BurpSuite的Intercept里抓到这个请求
然后根据Hints提醒使用shell脚本里切换到上一级目录的指令”..”修改File的值”CSRF.html”构造出另外一个指令
../../../../../WEB-INF/spring-security.xml
就可以访问到目标目录意外的文件,但是坑爹的是不论试验了多少次都提示我
* Access to file/directory " ../../../../../WEB-INF/spring-security.xml" denied
然后看Solution里说是访问main.jsp于是改为
../../../../../main.jsp
课程通过…Hints和Solution根本不一样…这就是WebGoat的坑爹之处
Access Control Flaws-LAB: Role Based Access Control
Stage 1: Bypass Business Layer Access Control
权限管理问题,由于代码没有对Control里的Delete指令做权限管理,又通过action字段判断Control指令,所以原本不应该有Delete权限的Tom执行了Delete操作.
- 使用密码jerry进入Jerry Mouse的帐号,有ViewProfile和DeleteProfile的操作
- 使用密码tom进入Tom Cat的帐号,只有ViewProfile
- 执行ViewProfile拦截请求,改action为DeleteProfile
Stage2
说是需要在开发版下修复这个问题,没找到怎么修复.
Stage 3: Bypass Data Layer Access Control
水平越权问题,View这个操作不能像Delete一样对Tom进行权限上的控制,那么与Tom出于同一层级的其它用户也具有这个权限,所以说Tom可以通过拦截修改employee_id水平的访问其它人的资料,也是属于非正常逻辑.
Stage4
需要对每一个操作再次进行权限核实,才能解决这个问题,也是要求在开发版下完成这节课,但是我也不知道怎么完成.
AJAX Security-LAB: Client Side Filtering
客户端过滤,有些时候服务器返回的了很多条信息,只挑选了其中少数进行显示,可以在返回的html源码中看到全部的信息.
- 选中名字附近元素点击”检查”
- 在源码中搜索关键词”hidden” “Joanne”等
- 发现有3个”Joanne”,其中一个隐藏了Neville的信息
AJAX Security-DOM Injection
DOM:文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展标志语言的标准编程接口.就是HTML报文中的节点,这里说是通过DOM注入的方式让原本网页中不可点击的按钮变为可点击.
- 输入License Key会自动发起一个Ajax的请求
- 通过拦截AJAX请求的返回报文,把报文头和内容全部清空
- 更改返回为一段JS代码
如下
document.form.SUBMIT.disabled = false
此时按钮就可以使用了,除了这个方法之外,还可以直接检查按钮
<input disabled="" id="SUBMIT" value="Activate!" name="SUBMIT" type="SUBMIT">
改disabled为false或者直接删除这个标记.
AJAX Security-LAB: DOM-Based cross-site scripting
这就是一个简单的反射型XSS的演示,依次输入以下内容在文本框里
World//正常
<IMG SRC="images/logos/owasp.jpg"/>//XSS插入图片
<img src=x onerror=;;alert('XSS') />//XSS插入Alert
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>//XSS插入iFrame
甚至可以直接伪造界面
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>
AJAX Security-XML Injection
XML注入攻击,和HTML注入攻击一样,都是利用文本解析机制,写入恶意输入
- 输入ID:836239,拦截请求
- 修改返回报文的XML文件,给自己跟多的选择
返回报文
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Content-Type: text/xml
Date: Tue, 08 Mar 2016 08:46:40 GMT
Content-Length: 136
<root>
<reward>WebGoat Mug 20 Pts</reward>
<reward>WebGoat t-shirt 50 Pts</reward>
<reward>WebGoat Secure Kettle 30 Pts</reward>
</root>
可以修改内容为
<root>
<reward>WebGoat Mug 20 Pts</reward>
<reward>WebGoat t-shirt 50 Pts</reward>
<reward>WebGoat Secure Kettle 30 Pts</reward>
<reward>WebGoat Secure Kettle 30 Pts</reward>
<reward>WebGoat Core Duo Laptop 2000 Pts</reward>
<reward>WebGoat Hawaii Cruise 3000 Pts</reward>
</root>
AJAX Security-JSON Injection
JSON注入攻击,原理和XML注入攻击一样
- From输入BOS,to输入SEA
- 拦截请求返回报文
如下
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Content-Type: text/html
Date: Tue, 08 Mar 2016 08:50:24 GMT
Content-Length: 169
{
"From": "Boston",
"To": "Seattle",
"flights": [
{"stops": "0", "transit" : "N/A", "price": "$600"},
{"stops": "2", "transit" : "Newark,Chicago", "price": "$300"}
]
}
修改600美元为30美元就可以便宜了
AJAX Security-Insecure Client Storage
这是最坑的一道题!!!
先来说下题目的原意,题目中让你找出优惠券号码,然后享受优惠,利用情形是
- 有的优惠券号码是由服务器发送到前端的
- 为了防止从源码窃取,发送到浏览器的是加密后的优惠码,用一定算法进行解密
- 然后对比解密后的优惠券和用户的输入
- 相同就享受优惠
这里有个逻辑漏洞,就是拿解密后的优惠码明文和用户输入进行对比,而不是加密用户的输入与密文对比,所以前端还是可以通过JS打断点获取到优惠码明文.
大坑来了
如果相对JS打断点,首先要能在控制台找到JS脚本文件,由于整个页面是使用了JQuery内嵌了课程内容(网页内部嵌另外一个网页),红色框内的内容是动态加载的,所以直接在Sources页面根本找不到内嵌网页的”clientSideValidation.js”
这个坑了我好久啊,对前端不熟悉怎么都找不到.js文件
Solution里给的答案第一步就是让你定位”clientSideValidation.js”,定位不到怎么办!!!!
检查Network
既然内部的网页是动态加载的,那么肯定有网络通讯,可以通过检查Network看记录,和”clientSideValidation.js”附近的文件有个条网络请求”attack?Screen=272&menu=400”的,点击可以看到红色框体内的页面,然后可以获取到实际地址
http://zhuojiademacbook-pro.local:8080/WebGoat/attack?Screen=272&menu=400
利用Request拦截
除去查看Network之外,还可以利用BurpSuite拦截Ajax请求,因为整个页面是通过Ajax刷新的,Ajax本身又是一种请求,那么只要我点击purchase,就可以拦截到一条Request请求,且能看到页面内的相关参数
- 对这个请求点击Action-Send to repeater
- 右键-Show response in browser
- 从浏览器里打开链接(注意此时关闭拦截)
- 就跳转到了实际内部页面的地址
得到了实际地址后,就可以在子页面内调试JS
Stage2
第二步说的是有些在前端可以通过删除掉input框的readonly标记任意修改金额,比较简单
AJAX Security-Dangerous Use of Eval
Eval是php语言中执行一段JS代码的意思,这一道题也是一种典型的反射型XSS展示,与刚刚基于DOM的不同,DOM是直接插入新节点,而这个是使用一定技巧,先关闭原本的DOM,然后写自己的DOM,再组装好刚刚被关闭DOM的后半部分.
通过php的Eval,alert被执行
123');alert(document.cookie);('
123后的
');
使得原本的DOM不受影响,最后的
('
闭合掉了原本多出的**’)**符号
插入代码的样子是
('123');alert(document.cookie);('')