Exp9 Web安全基础 ——20164325王晓蕊
1.实验后回答问题
(1)SQL注入攻击原理,如何防御
原理:向Web应用程序输入一段精心构造的SQL查询指令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作。
防范:输入过滤、参数化sql语句或直接使用存储过程、提供更少的错误信息
(2)XSS攻击的原理,如何防御
原理:由于Web应用程序的输入验证机制不完善,攻击者在服务器端网页中插入一些恶意的客户端代码,在Web服务器上产生出一些恶意攻击页面。
防御:HttpOnly防止劫取Cookie;输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如<、>、'、"等,如果发现存在特殊字符,则将这些字符过滤或者编码。
(3)CSRF攻击原理,如何防御
原理: CSRF攻击的主要目的是让用户在不知情的情况下攻击自己已登录的一个系统,类似于钓鱼。如用户当前已经登录了邮箱,或bbs,同时用户又在使用另外一个,已经被你控制的站点,我们姑且叫它钓鱼网站。这个网站上面可能因为某个图片吸引你,你去点击一下,此时可能就会触发一个js的点击事件,构造一个bbs发帖的请求,去往你的bbs发帖,由于当前你的浏览器状态已经是登陆状态,所以session登陆cookie信息都会跟正常的请求一样,纯天然的利用当前的登陆状态,让用户在不知情的情况下,帮你发帖或干其他事情。
防御:通过referer、表单令牌token或验证码来检测用户提交、避免全站通用的cookie,严格设置cookie的域、不用在页面链接中暴露用户隐私信息。
2.实践过程记录
2.1WebGoat安装
- 因WebGoat默认使用8080端口,所以开启前先用 netstat -tupln | grep 8080 查看端口是否被占用,如果被占用,用kill 进程号终止占用8080端口的进程。
- 在网上下载 webgoat-container-7.0.1-war-exec.jar :https://github.com/WebGoat/WebGoat/releases?after=8.0.0
- 普通安装,命令行输入 java -jar webgoat-container-7.0.1-war-exec.jar (输入命令的时候记得改名字)
- 浏览器转:localhost:8080/WebGoat 直接用默认用户名密码登录即可(下面有用户名和密码)。
注:我参考了杨正辉学长的博客,解决了旁边无实验内容的情况。
2.2 SQL注入攻击(Injection Flaws)
2.2.1命令注入(Command Injection)
- 右键点击页面,选择 inspect Element 审查网页元素对源代码进行修改,在复选框中任意一栏的代码,右键单击后,选择 Edit At Html 进行修改,添加 "& netstat -an & ipconfig"
- 添加的时候注意要添加在 AccessControlMaerix.help 后面,然后再点击view可以看到执行指令后的网络端口使用情况和IP地址。攻击成功。
2.2.2数字型 SQL 注入(Numeric SQL Injection)
- 右键点击页面,选择 inspect Element 审查网页元素对源代码进行修改,在选中的城市编号 Value 值中添加 or 1=1
- 点击 Go! ,攻击成功,显示所有城市的天气情况:
2.2.3 日志欺骗(Log Spoofing)
- 本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名: wxr Login Succeeded for username admin ,这样用户名后面的信息会在同一行显示,而不是在新的一行:
- 这样咱们可以往该应用中注入回车(0D%)和换行符(%0A)。在 username中填入 wxr%0d%0aLogin Succeeded for username: admin ,这样就完成了该课程:
2.2.4字符串注入(String SQL Injection)
- 正常查询结果应该只有员工Smith的信息:
- 根据我们的经验,将""提前闭合,插入永真式然后注释掉后面内容应该就可以了,因此输入以下两个代码之一即可完成本课程内容:
1 Smith' or 1=1 -- 2 ' or 1=1 --
2.2.5 SQL 注入(LAB: SQL Injection)
字符串型注入(Stage 1: String SQL Injection)
- 右键点击密码栏,选择 inspect Element 审查网页元素对源代码进行修改,将password密码框的最大长度限制改为18。
- 以用户 Neville(admit) 登录,输入密码 hello' or '1' = '1
- 得到所有人员列表,成功!
数字型 SQL 注入(Stage 3: Numeric SQL Injection)
- 使用用户名 Larry,密码 larry 点击login登录,点击 ViewProfile 查看用户信息
- 在多行文本框中被选中的员工Larry Stooge(employee)上右键审查网页元素,可以看到此处是用员工ID作为索引来传送数据的,感觉这里的数据库应该是以员工ID作为索引,返回的是每次查询到的第一条数据。用社会工程学解释老板应该是工资最高的,所以为了把老板排到第一个咱们应该在员工ID101后面给他加上这么一些东西进行SQL注入排序,即:
101 or 1=1 order by salary desc
- 得到老板的账户信息,成功!
- 还可以修改老板信息:
2.2.6 数据库后门(Database Backdoors)
- 输入 101 ,得到该用户的信息。我们可以看到,输入的语句没有验证,很容易进行 SQL 注入
- 输入注入语句 101; update employee set salary=10000 执行两个语句
- 使用以下查询条件,添加触发器: FOR EACH ROW BEGIN UPDATE employee SET email='wxr@hackme.com' WHERE userid = NEW.userid
2.2.7 数字型盲注入(Blind Numeric SQL Injection)
- 本节课程中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句。查询语句如下:
SELECT * FROM user_data WHERE userid=accountNumber;
- 如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。例如下面两个查询方式:
1 101 AND 1=1 2 101 AND 1=2
- 在第一条语句中,两个条件都成立,所以页面返回帐号有效。而第二条则返回帐号无效。现在可以针对查询语句的后半部分构造复杂语句。下面的语句可以告诉我们PIN数值是否大于10000:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
- 页面提示帐号无效,说明PIN<=10000。不断调整数值,可以缩小判断范围,并最终判断出PIN数值的大小。最终如下语句返回帐号有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
2.3CSRF攻击
2.3.1 跨站请求伪造(Cross Site Request Forgery (CSRF))
- 要完成这一课,我们需要在消息框中嵌入HTML代码。这段代码中包含一个图片,链接到一个网站。在HTML中图片的格式是:
<img src="[URL]" width="1" height="1" />
- 查看页面右侧Parameters中的src和menu值,分别为267和900
- 创建一个新消息,命名为“Test”,消息中加入这段HTML代码:
<img src="http://localhost:8080/WebGoat/attack?Screen=267&menu=900&transferFunds=10000" width="1" height="1" />
- 以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交
- 点击提交后,我们会在消息列表中看到一个新的消息20164325。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的10000元,从而达到CSRF攻击的目的。可以从左侧的任务栏看到任务已完成。
2.4 XSS攻击
2.4.1存储型XSS攻击(Stored XSS Attacks)
- title中任意输入字符,留言板中输入 <script>alert("wo zui ku");</script>
3. 实验总结与体会
这次实验还是比较好做的,通过实验我了解到了很多攻击的方法;实验中我出现的问题就是开始软件没有左半边的任务栏,原因是我kali的jdk太新了,所以我就下了个1.8.0版本的,就成功了。