在官网下载Tomcat 7.0版本的zip包到本地,解压。(用8.0版登录不上webgoat)javascript
新建两个系统变量CATALINA_BASE和CATALINA_HOME,变量值均为Tomcat的安装目录,例如F:\Webgoat\apache-tomcat-7.0.82
。在Path变量中添值%CATALINA_HOME%\lib;%CATALINA_HOME%\bin
。html
cmd或powershell移动到安装目录下的bin文件夹,执行命令servic.bat install
。java
下载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"/>
打开bin目录下的tomcat7w.exe
程序,启动Tomcat。算法
地址栏输入localhost:8080/WebGoat-5.4/attack
,用户名和密码均输入guest,便可进入WebGoat主页。sql
请求报文结构:
shell
请求头:数据库
响应报文结构:
apache
响应头:
状态码
若是应用不检查输入请求中的 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 请求头
登录帐户“Tom Cat”,使用ViewProfile功能,拦截请求包将动做改成DeleteProfile
拦截请求,修改请求路径以绕到其余目录。
例如:../../../../../conf/tomcat-users.xml
修改 request 中的employee_id
参数,恶意访问其余人的资料
利用开发人员预留的参数接口访问管理界面,例如,在URL添加参数&admin=true
readonly=""
能够修改一些本不容许修改的数据javascript:function();
的语句执行 JavaScript利用忘记密码功能,经过暴力破解回答问题,获得密码或设置新密码
客户端用Authorization
头提供 Base64 编码的用户名和密码,修改 Authorization 头能够更改帐户。但 Cookie 不变的话页面信息不会变
当计算机向缓冲区内填充数据位数时超过了缓冲区自己的容量,溢出的数据会覆盖在合法数据上。
从页面源码中找到泄漏的敏感信息,例如在注释中
线程安全是指一个对象或类的领域在多线程同时使用的时候老是保持有效的状态。它每每能够利用并发错误,精确地在同一时间、同一个页面加载另外一个用户。由于全部的线程共享同一个方法区,而全部的类变量存储在方法区,多个线程试图同时使用相同的类变量。
缘由:
Web应用程序能够同时处理不少HTTP请求
开发人员常用的变量不是线程安全的
后果:
用户利用 Web 应用程序中的并发错误, 能够查看同一时间中,另外一个用户试图登陆同一个功能的信息。也能够利用并发缺陷查看他人信息或者篡改购物车付款金额。
登录 tom 的帐户,修改 Street 一栏的信息为<script>alert("Hey guy!")</script>
。用 Jerry 的帐户查看 Tom 的资料时会受到 XSS 攻击而弹出警告。
可以使用输入验证来阻止上传 XSSPayload,而已经存储在服务端的 XSSPayload 能够经过输出编码阻止。
构造一个包含 XSSPayload 的 URL,在服务端返回的 response 中,URL 上的 XSSPayload 会被当成页面源代码执行。
例:发送一封带有<img>
标签图片的邮件,利用 src 属性指向一个恶意请求
先提交一个<iframe>
或<img>
构造恶意请求,再用一个标签指向第一个请求触发的确认(注意要前后生效)
Anti-CSRF token:在请求发起页面插入Token用于完成请求和并验证该操做不是经过脚本执行的。
先使用一个<iframe>
打开页面,用 JS 读取出Token;而后加载另外一个<iframe>
,并使用第一个<iframe>
读取的 Token 发送请求。
微软引入的新的 cookie 属性字段,被标记 HTTPOnly 字段后浏览器将禁止客户端脚本访问 Cookie
嵌入 Ajax 请求,利用 HTTP TRACE 方法(回显服务器收到的请求,主要用于测试或诊断)
例:拦截请求,删除 password 参数,Java 代码会捕获空指针异常使得认证被绕过
原理:修改提交的参数,使服务器执行恶意命令
防范:“清洗”全部输入数据是不错的防护方法,尤为是那些将被用于操做系统命令、脚本和数据库查询语句的数据
注入参数为整型(ID、年龄、页码等),不须要单引号闭合。
一般使用单引号闭合参数,例如,在密码框输入error'or'1'='1
可绕过密码认证。
修改:注入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:用于在文档中查找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
例:服务器容许两个用户同时登录,经过 SQL 注入获取其余合法用户的密码,登录三个用户,将会使服务器过分使用
敏感数据不能用明文发送,一般在验证后要切换到安全链接,由于攻击者可经过嗅探得到的
登陆信息和收集到的其余信息入侵帐户。一个好的Web 应用程序老是使用加密方式发送敏
感数据。
使用 HTTPS 访问后,全部数据被加密。服务器与应用程序通信将经过传输层安全(Transport Layer Security TLS)),又称为安全套接字层(Secure Socket Layer(SSL))。TLS 是一种混合的加密协议,经过一个主密钥来创建通讯。这个密钥使用的是 SHA-1 或 MD5 。
利用不安全配置漏洞强行浏览一些禁止访问的资源,例如,蛮力猜想资源路径/WebGoat/config, /WebGoat/configuration, /WebGoat/conf
等,可发现隐藏页面
利用漏洞上传包含恶意指令的文件到服务器并执行,脚本后门就属于典型的恶意文件
例如,上传一个包含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>
客户端验证不该该被认为是一种安全的参数验证方法,这种验证方式只能帮那些不知道所需输入的用户缩短服务器处理时间,攻击者能够用各类方法轻易的绕过这种机制。任何客户端验证都应该复制到服务器端,这将大大减小不安全的参数在应用程序中使用的可能性。
漏洞利用:用开发者工具修改客户端的一些限制,配合拦截工具可轻易修改参数
开发人员在加载信息的页面上使用隐藏字段来跟踪、登陆、订价等。虽然这是一种方便且易于开发的机制,但他们每每不验证从隐藏字段收到的信息。
漏洞利用:经过开发者工具能够看到隐藏的 html 元素,并对其进行恶意篡改
多数网站都容许一个非验证的用户给“朋友”发送 e-mail 。对垃圾邮件发送者来讲,这是一个绝佳的机制,能够利用公司的邮件服务器来发送电子邮件。
漏洞利用:将隐藏域中的邮箱修改成目标邮箱
许多应用程序自动记录登陆站点的用户指定 Cookie,若是使用算法生成的 Cookie 都能得到,则Cookie能够被猜解。并且一些被放到客户端上的 Cookie 可能被跨站攻击盗取。
例:
AuthCookie=65432ubphcfx
和AuthCookie=65432udfqtb
AuthCookie=65432fdjmb
应用开发者开发会话ID时,常常忘记配置复杂性和随机性,若是一个用户的特定会话ID不够复杂和随机则很容易遭受到蛮力攻击。
原理:
服务器经过每一个用户惟一的 SessionID 来确认其合法性。若是用户已登陆,而且受权他没必要从新验证受权,则当他从新登陆应用系统时,他的 Session ID 依然是被认为合法的。
漏洞利用:
攻击者能够用一个选定的 SessionID 给受害人发送一个超连接。例如,准备好一封恶意邮件,它看起来像是一个从应用程序管理员发来的官方邮件。若是受害者点击了连接,而且该受害者以攻击者指定的 ID 登陆了系统;那么攻击者能够不经受权直接使用与受害者相同的ID访问该页面。
SOAP:
基于 XML 的简易协议,可以使应用程序在 HTTP 之上进行信息交换;
WSDL:
Web Services Description Language,是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问;
截取请求并调用任何方法,用SOAPAction:
头发送一个SOAP(简单对象访问协议)请求的有效帐户
拦截请求,修改 field 参数获取信息
1 or 1=1
,(401错误表示没有受权,先insert已认证的cookie)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
破坏身份验证方案,从数据库中盗取全部的信用卡信息,而后破坏页面"webgoat_challenge_guest.jsp"
越权登录,通常有两种方法:
- 经过认证用户的身份登录
- 利用注入漏洞
首先尝试找到注入点,发现输入可能能够注入的点有 Username/Password/Submit/user/user(Cookie) 这几个,用户名通常不能进行注入。
看到 User(cookie) 是 Base64 编码的,解码后的值和 user 同样是 youaretheweakestlink 。尝试对 user 进行 sql 注入,将注入后的字符串进行 Base64 编码后替换 User(cookie) ,仍是不行。
查看网页的HTML源码,找到被隐藏的表单,能够看到 youaretheweakestlink 的 name 属性是 user ,它应该就是正确的用户名,但密码没法注入,要找到密码。
密码在localhost:8080/WebGoat-5.4/source?source=true
,大概靠信息收集吧······
不一样的协议表单获取页面,这种表单通常有两种获取形式:
- 利用 SQL 从数据库中读取
- 利用 cmd 命令行获得
ls
(webgoat 的 Java 源码里作了判断,只有 tcp 有注入漏洞)。&& pwd && ls && find -name "webgoat_challenge_guest.jsp"
找到目标文件的路径,注意 Mac 中的指令会有所差异。echo "[payload]" > [target]
覆盖文件内容。