WebGoat笔记

(一)WebGoat部署

安装Tomcat

在官网下载Tomcat 7.0版本的zip包到本地,解压。(用8.0版登录不上webgoat)javascript

新建两个系统变量CATALINA_BASECATALINA_HOME,变量值均为Tomcat的安装目录,例如F:\Webgoat\apache-tomcat-7.0.82。在Path变量中添值%CATALINA_HOME%\lib;%CATALINA_HOME%\binhtml

cmd或powershell移动到安装目录下的bin文件夹,执行命令servic.bat installjava

配置WebGoat

下载WebGoat5.4版本的war包,放到Tomcat目录的webapps子目录下。web

在conf目录下的tomcat-users.xml文件中加入如下内容。ajax

<role rolename="manager"/>  
<role rolename="webgoat_basic"/>  
<role rolename="webgoat_admin"/>  
<role rolename="webgoat_user"/>  
<user username="admin" password="admin" roles="manager-gui"/>
<user username="webgoat" password="webgoat" roles="webgoat_admin"/>  
<user username="basic" password="basic" roles="webgoat_basic,webgoat_user"/>  
<user username="guest" password="guest" roles="webgoat_user"/>

登录WebGoat

打开bin目录下的tomcat7w.exe程序,启动Tomcat。算法

地址栏输入localhost:8080/WebGoat-5.4/attack,用户名和密码均输入guest,便可进入WebGoat主页。sql

(二)General

HTTP基础

请求报文结构:
shell

请求头:数据库

  • If-Modified-Since:说明浏览器最后一次收到资源的时间,若是自此以后资源没有更新,服务器会返回 304 响应指示浏览器使用缓存副本;
  • Accept-Encoding:愿意接收的内容编码;
  • Referer:提出当前请求的原始URL;
  • Authorization:为一种内置的HTTP身份验证提交证书;

响应报文结构:
apache

响应头:

  • Location:说明重定向响应的目标;
  • Cache-Control:向浏览器传送缓存指令;
  • Expires:说明消息主体的有效时间,在此以前,浏览器可使用缓存副本;

状态码

  • 301 Moved Permanently:永久重定向,新URL将替换原始URL;
  • 302 Found:临时重定向,在随后的请求中恢复原始URL;
  • 304 Not Modified:指示浏览器使用缓存副本;
  • 400 Bad Request:无效的http请求;

HTTP Splitting

若是应用不检查输入请求中的 CRLF(Carriage-Return Line-Feed),攻击者能够经过回车符(\r)和换行符(\n)插入消息头和消息体,控制响应信息

例如,在表单中填入字符串

foobar%0d%0aContent‐Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent‐Type:%20text/html%0d%0aContent‐Length:%2047%0d%0a%0d%0a<html>Hacked J</html>

能够构造如下报文

Foobar
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 47

<html>Hacked J</html>

注入特殊字符后,HTTP 响应数据包中“Content‐Length: 0”告诉浏览器响应已经结束。再经过随后的报文传送一个新页面

缓存污染:HTTP头中的 Last‐Modified 字段设置为一个将来时间,迫使浏览器发送 If‐Modified‐Since 请求头

(三)Access Control Flaws

  • 绕过表示层访问控制

登录帐户“Tom Cat”,使用ViewProfile功能,拦截请求包将动做改成DeleteProfile

  • 绕过基于路径的访问控制

拦截请求,修改请求路径以绕到其余目录。
例如:../../../../../conf/tomcat-users.xml

  • 绕过数据层访问控制

修改 request 中的employee_id参数,恶意访问其余人的资料

  • 远程管理界面

利用开发人员预留的参数接口访问管理界面,例如,在URL添加参数&admin=true

(四)Ajax Security

  • 在表单利用HTML标签可构造DOM型XSS
  • 客户端的数据都是不安全的
  • 查看HTML源码能够看到一些隐藏信息,或者修改一些元素的属性。例如,删除readonly=""能够修改一些本不容许修改的数据
  • 阅读 Javascript 理解其工做流程,能够绕过一些客户端的验证,或者获得一些隐藏信息
  • XML 注入和 JSON 注入:修改 respond 的 XML 和 JSON 数据
  • 静默交易攻击:经过浏览器直接执行 Javascript 中的功能函数完成交易。不少浏览器支持在地址栏输入相似javascript:function();的语句执行 JavaScript

(五)Authentication Flaws

  • 弱口令

利用忘记密码功能,经过暴力破解回答问题,获得密码或设置新密码

  • 基自己份认证

客户端用Authorization头提供 Base64 编码的用户名和密码,修改 Authorization 头能够更改帐户。但 Cookie 不变的话页面信息不会变

  • 多级登录
  1. 修改参数使已经用过的 TAN(Transaction Authentication Number)验证码仍然生效
  2. 修改 user 相关的参数访问其余用户的信息

(六)Buffer Overflows

当计算机向缓冲区内填充数据位数时超过了缓冲区自己的容量,溢出的数据会覆盖在合法数据上。

  1. 拦截请求后发送到Intruder,将参数 room_no 设为溢出目标。
  2. 攻击类型为 sniper,方案为 character blocks(大量的字符填充)。
  3. 设置好输入值,最小、最大值,步长,而后发送payload。

(七)Code Quality

从页面源码中找到泄漏的敏感信息,例如在注释中

(八)Concurrency

线程安全是指一个对象或类的领域在多线程同时使用的时候老是保持有效的状态。它每每能够利用并发错误,精确地在同一时间、同一个页面加载另外一个用户。由于全部的线程共享同一个方法区,而全部的类变量存储在方法区,多个线程试图同时使用相同的类变量。

缘由:

  1. Web应用程序能够同时处理不少HTTP请求

  2. 开发人员常用的变量不是线程安全的​

后果:

用户利用 Web 应用程序中的并发错误, 能够查看同一时间中,另外一个用户试图登陆同一个功能的信息。也能够利用并发缺陷查看他人信息或者篡改购物车付款金额。

(九)Cross-Site Scripting

存储型XSS

登录 tom 的帐户,修改 Street 一栏的信息为<script>alert("Hey guy!")</script>。用 Jerry 的帐户查看 Tom 的资料时会受到 XSS 攻击而弹出警告。

可以使用输入验证来阻止上传 XSSPayload,而已经存储在服务端的 XSSPayload 能够经过输出编码阻止。

反射型XSS

构造一个包含 XSSPayload 的 URL,在服务端返回的 response 中,URL 上的 XSSPayload 会被当成页面源代码执行。

Cross Site Request Forgery(CSRF)

例:发送一封带有<img>标签图片的邮件,利用 src 属性指向一个恶意请求

绕过确认

先提交一个<iframe><img>构造恶意请求,再用一个标签指向第一个请求触发的确认(注意要前后生效)

绕过Token

Anti-CSRF token:在请求发起页面插入Token用于完成请求和并验证该操做不是经过脚本执行的。

先使用一个<iframe>打开页面,用 JS 读取出Token;而后加载另外一个<iframe>,并使用第一个<iframe>读取的 Token 发送请求。

HTTPOnly

微软引入的新的 cookie 属性字段,被标记 HTTPOnly 字段后浏览器将禁止客户端脚本访问 Cookie

跨站跟踪攻击

嵌入 Ajax 请求,利用 HTTP TRACE 方法(回显服务器收到的请求,主要用于测试或诊断)

(十)Improper Error Handling

例:拦截请求,删除 password 参数,Java 代码会捕获空指针异常使得认证被绕过

(十一)Injection Flaw

命令注入

原理:修改提交的参数,使服务器执行恶意命令

防范:“清洗”全部输入数据是不错的防护方法,尤为是那些将被用于操做系统命令、脚本和数据库查询语句的数据

SQL注入

数字型SQL注入

注入参数为整型(ID、年龄、页码等),不须要单引号闭合。

字符串型SQL注入

一般使用单引号闭合参数,例如,在密码框输入error'or'1'='1可绕过密码认证。

经过SQL注入操做数据

修改:注入UPDATE命令,例如:someuserid'; UPDATE salaries SET salary=999999 WHERE userid='jsmith

添加:注入INSERT命令,例如:someuserid';INSERT INTO salaries VALUES ('zrquan',9999999);--

盲注

1) 某些SQL注入是没有明确返回信息的,只能经过条件的“真”和“假”进行判断

例:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );能够判断PIN值是否大于1000,以此类推缩小范围,最终肯定其值

2) SUBSTRING 方法用来截取字符串,可使用该方法进行字符串型的盲注SUBSTRING(STRING,START,LENGTH)

例:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );能够判断PIN字段的第一个字符是否小于H,通过屡次测试(比较0-9 A-Z a-z等字符串能够肯定每个字符的值

日志欺骗

向日志添加虚假信息或插入脚本,管理员经过浏览器观看日志时恶意脚本会被执行

XPATH注入

XPATH:用于在文档中查找XML数据的语言

与 SQL 注入相似,XPATH 注入发生在当网站使用用户提供的信息查询 XML 数据时。经过向网站故意发送异常信息,攻击者能够发现 XML 数据的结构或访问那些原本没法访问到的数据。

数据库后门

触发器是在数据库管理系统上调用另外一个数据库操做,如insert, select, update or delete(MySQL不支持触发器)

举个例子:攻击者能够用下面的命令建立一个触发器,该触发器在建立新用户时,将每一个新用户的 Email 地址设置为攻击者的地址

someuserid;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid

(十一)Denial of Service(DOS)

例:服务器容许两个用户同时登录,经过 SQL 注入获取其余合法用户的密码,登录三个用户,将会使服务器过分使用

(十二)Insecure Communication

敏感数据不能用明文发送,一般在验证后要切换到安全链接,由于攻击者可经过嗅探得到的
登陆信息和收集到的其余信息入侵帐户。一个好的Web 应用程序老是使用加密方式发送敏
感数据。

使用 HTTPS 访问后,全部数据被加密。服务器与应用程序通信将经过传输层安全(Transport Layer Security TLS)),又称为安全套接字层(Secure Socket Layer(SSL))。TLS 是一种混合的加密协议,经过一个主密钥来创建通讯。这个密钥使用的是 SHA-1 或 MD5 。

(十三)Insecure Configuration

利用不安全配置漏洞强行浏览一些禁止访问的资源,例如,蛮力猜想资源路径/WebGoat/config, /WebGoat/configuration, /WebGoat/conf等,可发现隐藏页面

(十四)Malicious Execution(恶意执行)

利用漏洞上传包含恶意指令的文件到服务器并执行,脚本后门就属于典型的恶意文件

例如,上传一个包含java代码的文件,经过访问该文件执行代码建立一个新文件:

<html>
    <% java.io.File file = new java.io.File("F:\\Webgoat\\apache-tomcat-7.0.82\\webapps\\WebGoat-5.4\\guest.txt"); file.createNewFile(); %>
</html>

(十五)Parameter Tampering

  • 篡改参数

客户端验证不该该被认为是一种安全的参数验证方法,这种验证方式只能帮那些不知道所需输入的用户缩短服务器处理时间,攻击者能够用各类方法轻易的绕过这种机制。任何客户端验证都应该复制到服务器端,这将大大减小不安全的参数在应用程序中使用的可能性。

漏洞利用:用开发者工具修改客户端的一些限制,配合拦截工具可轻易修改参数

  • 隐藏字段

开发人员在加载信息的页面上使用隐藏字段来跟踪、登陆、订价等。虽然这是一种方便且易于开发的机制,但他们每每不验证从隐藏字段收到的信息。

漏洞利用:经过开发者工具能够看到隐藏的 html 元素,并对其进行恶意篡改

  • 未检查的E-mail

多数网站都容许一个非验证的用户给“朋友”发送 e-mail 。对垃圾邮件发送者来讲,这是一个绝佳的机制,能够利用公司的邮件服务器来发送电子邮件。

漏洞利用:将隐藏域中的邮箱修改成目标邮箱

(十六)Session Management Flaws

cookie认证欺骗

许多应用程序自动记录登陆站点的用户指定 Cookie,若是使用算法生成的 Cookie 都能得到,则Cookie能够被猜解。并且一些被放到客户端上的 Cookie 可能被跨站攻击盗取。

例:

  1. 分别用 webgoat 和 aspect 两个帐号登录,截取到服务端返回的 cookie 值是AuthCookie=65432ubphcfxAuthCookie=65432udfqtb
  2. 两个 cookie 值的数字位没变,英文字符串则是用户名倒过来后再向后推一位,能够推测出用户 alice 的 cookie 是AuthCookie=65432fdjmb
  3. 截取请求并添加推测的 cookie 值,能够成功经过登录认证
会话劫持

应用开发者开发会话ID时,常常忘记配置复杂性和随机性,若是一个用户的特定会话ID不够复杂和随机则很容易遭受到蛮力攻击。

会话固定

原理:

服务器经过每一个用户惟一的 SessionID 来确认其合法性。若是用户已登陆,而且受权他没必要从新验证受权,则当他从新登陆应用系统时,他的 Session ID 依然是被认为合法的。

漏洞利用:

攻击者能够用一个选定的 SessionID 给受害人发送一个超连接。例如,准备好一封恶意邮件,它看起来像是一个从应用程序管理员发来的官方邮件。若是受害者点击了连接,而且该受害者以攻击者指定的 ID 登陆了系统;那么攻击者能够不经受权直接使用与受害者相同的ID访问该页面。

(十七)Web Services

SOAP请求

SOAP

基于 XML 的简易协议,可以使应用程序在 HTTP 之上进行信息交换;

WSDL

Web Services Description Language,是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问;

截取请求并调用任何方法,用SOAPAction:头发送一个SOAP(简单对象访问协议)请求的有效帐户

WSDL扫描

拦截请求,修改 field 参数获取信息

SQL注入
  1. 使用 WebScarab 的 WebServices 模块,看到调用的 Web 服务或者 WSDL 历史文件
  2. WebScarab 将解析 XML 文件,因此能够选择调用的操做,而后输入一个调用的参数值
  3. 在“vaule”中输入1 or 1=1,(401错误表示没有受权,先insert已认证的cookie)
SAX注入

SAX:全称 Simple API for XML,是一个用于处理 XML 事件驱动的“推”模型,虽然它不是 W3C 标准,但它倒是一个获得了普遍承认的API。

SAX 解析器不像 DOM 那样创建一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,而后由事件处理器提供对文档内容的访问。

SAX解析器会解析任何格式正常的XML文件。

例:只要匹配到有效的标记符号及闭合符号即认为正确。当您向原有的XML文件中添加新的 changePassword 元素时,若是 id 和 password 等标记都正确,那么解析器将很乐意帮您去修改另外一个 userid 的密码(有点像 DOM XSS)。

更改密码时提交如下代码:

newpassword</password>
</wsns1:changePassword>
<wsns1:changePassword>
<id xsi:type='xsd:int'>102</id>
<password xsi:type='xsd:string'>notforyoutoknow

(十八)Challenge

目标

破坏身份验证方案,从数据库中盗取全部的信用卡信息,而后破坏页面"webgoat_challenge_guest.jsp"

stage1

越权登录,通常有两种方法:

  1. 经过认证用户的身份登录
  2. 利用注入漏洞
  1. 首先尝试找到注入点,发现输入可能能够注入的点有 Username/Password/Submit/user/user(Cookie) 这几个,用户名通常不能进行注入。

  2. 看到 User(cookie) 是 Base64 编码的,解码后的值和 user 同样是 youaretheweakestlink 。尝试对 user 进行 sql 注入,将注入后的字符串进行 Base64 编码后替换 User(cookie) ,仍是不行。

  3. 查看网页的HTML源码,找到被隐藏的表单,能够看到 youaretheweakestlink 的 name 属性是 user ,它应该就是正确的用户名,但密码没法注入,要找到密码。

    密码在localhost:8080/WebGoat-5.4/source?source=true ,大概靠信息收集吧······

stage2
  1. 须要得到所有信用卡号码,通常经过 sql 注入获取 database 的信息。
  2. 查看拦截信息,发现登录成功后并无发送其余请求去得到 credit card 的数据,因此注意点应该在登录认证的 request 中。
  3. 依次对几个注入点进行检查,发现对 user(Cookie) 进行注入就能够得到到全部信用卡信息,可是注意使用的是 Base64 编码后的信息。
stage3

不一样的协议表单获取页面,这种表单通常有两种获取形式:

  1. 利用 SQL 从数据库中读取
  2. 利用 cmd 命令行获得
  1. 先尝试拦截报文,对 file 字段作 SQL 注入,发现没有效果。而后进行命令行注入,使用通用命令ls(webgoat 的 Java 源码里作了判断,只有 tcp 有注入漏洞)。
  2. 注入命令&& pwd && ls && find -name "webgoat_challenge_guest.jsp"找到目标文件的路径,注意 Mac 中的指令会有所差异。
  3. 获得目标文件路径后,经过注入命令echo "[payload]" > [target]覆盖文件内容。
相关文章
相关标签/搜索