一、实验原理与目的
1. 实验要求
本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。
二、实验过程
1. 环境配置
WebGoat
-
webGoat需要Java SE8的支持,版本不匹配那么浏览器的菜单栏中会缺失很多内容
-
在官网下载
jdk-8u251-linux-x64.tar.gz
,并参考链接进行环境配置,配置好截图如下: -
下载
webgoat-container-7.0.1-war-exec.jar
。 -
在命令行输入
java -jar webgoat-container-7.0.1-war-exec.jar运行Webgoat
,等待一小会后出现如下提示则运行成功。 - 在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面 - 随便选择一个用户名进行登录,最好使用guest。webgoat为管理员账户,有的操作失误只能重新安装。
2. SQL注入攻击(Injection Flaws)
1、命令注入(Command Injection)
- 命令注入的原理是在正常的参数提交过程中添加恶意代码以执行某条指令。
- 在菜单栏中选择
Injection Flaws
,展开页面中选择Command Injection
右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,在复选框中对应位置第一个option的代码,双击进行修改,添加"& netstat -an & ipconfig"。 - 点击
view
,可以看到执行指令后的网络端口使用情况和IP地址。
3、数字型注入(Numeric SQL Injection)
- 在station字段中注入特征字符,组合成新的SQL语句。如:
SELECT * FROM weather_data WHERE station = [station]
-
在菜单栏中选择
Injection Flaws
,展开页面中选择Numeric SQL Injection
-
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,在选中的城市编号Value值中添加or 1=1
-
点击
Go!
即可显示所有城市的天气情况。
-
4、日志欺骗(Log Spoofing)
- 通过在日志文件中插入脚本实现欺骗。
-
步骤:
-
前提:本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。
-
在菜单栏中选择
Injection Flaws
,展开页面中选择Log Spoofing
-
利用入回车(0D%)和换行符(%0A),在 username 中填入
shn%0d%0aLogin Succeeded for username: admin
, -
攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将
admin <script>alert(document.cookie)</script>
作为用户名输入,可以看到弹窗的cookie信息。
-
5、字符串型注入(String SQL Injection)
-
步骤:
-
在菜单栏中选择
Injection Flaws
,展开页面中选择LAB: SQL Injection
,展开页面中选择String SQL Injection
-
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,将password密码框的最大长度限制改为18。 -
以用户
Neville(admit)
登录,输入密码hello‘ or ‘1‘ = ‘1
-
可以进行欺骗,以最高权限进行登录,获取到所有人员列表
-
6、数字型 SQL 注入(Numeric SQL Injection)
-
步骤:
-
在菜单栏中选择
Injection Flaws
,展开页面中选择LAB: SQL Injection
,展开页面中选择Numeric SQL Injection
-
使用用户名 Larry,密码 larry 登录,点击
ViewProfile
查看用户信息 -
右键点击页面,选择
inspect Element
审查网页元素源代码,我们可以看到数据库索引的依据是员工ID,推测返回的是每次查询到的第一条数据。 -
老板应该是工资最高的,所以将员工ID的value改成
101 or 1=1 order by salary desc
,使得Boss的信息作为查询到的第一条数据(始终是最高的)。 -
更改后再次点击
ViewProfile
,即可查询到最高纪录的结果
-
xss攻击
存储型XSS攻击(Stored XSS Attacks)
- 这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
-
步骤:
- 在菜单栏中选择
Cross‐Site Scripting
,展开页面中选择Stored XSS Attacks
- 在title中任意输入字符,留言板中输入
<script>alert("I am 20175232. You‘ve been attacked!!!");</script>
- 在菜单栏中选择
CSRF攻击
跨站请求伪造(Cross Site Request Forgery (CSRF))
-
原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:
<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/>
,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。 -
步骤:
-
在菜单栏中选择
Cross‐Site Scripting
,展开页面中选择Cross Site Request Forgery (CSRF)
-
查看页面右侧Parameters中的src和menu值,分别为331和900
-
在title中输入任何参数(学号),message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=331&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交。 -
在Message List中生成以Title命名的消息。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
-
三、实验问题回答及心得
-
- SQL注入攻击原理,如何防御
-
原理:
- SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
- Web应用对后台数据库查询语句处理存在的安全漏洞。即为:在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查,例如:
‘,--,#
这些特殊字符 - 后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。
-
防御:
- 使用正则表达式过滤传入的参数。
- 关闭或删除不必要的交互式提交表单页面;
- jsp中调用函数检查是否包函非法字符,做好规范的校验工作,比如搜索框不能输入非法字符、限制输入的长度等。
- 使用prepared statements语句绑定变量来执行SQL字符串。没有使用prepared statements语句绑定变量可能很容易受到攻击。
-
- XSS攻击的原理,如何防御
-
原理:
- 攻击者利用网站漏洞(如网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
-
防御:
- 特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击;
- 对所有用户提交内容进行可靠的输入验证,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤;
- HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie;
- 使用验证码:防止脚本冒充用户提交危险操作。
-
- CSRF攻击原理,如何防御
-
原理:
- CSRF :跨站请求伪造。即冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器;主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码防御。
-
防御:
- 添加加随机验证,每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
-
- SQL注入攻击原理,如何防御
- 实验体会:本次实验难度不大,主要是使用webgoat让我们体验web的一些基础攻击方式,让我了解到sql注入攻击、xss攻击、CSRF攻击的表现形式,也使得我对于web的安全使用有了更好的心得。