实践目标
本实践目标是理解常用网络攻击技术的基本原理。
回答实践问题
1.SQL注入攻击原理,如何防御?
- 原理:
- SQL 注入是最常见的 Web 黑客技术。SQL 注入攻击包括通过从客户端到应用程序的SQL查询输入来插入或“注入”恶意代码。如果处理不当,将这种代码注入应用程序可能会对例如数据完整性和安全性产生严重影响。
- 当来自客户端的未经过滤的数据(例如搜索字段的输入)进入应用程序本身的 SQL 解释器时,可能会发生 SQL 注入。如果未检查来自客户端的输入是否包含 SQL 命令,则黑客可以轻松地利用其基础 SQL 语句,以发挥其优势。
- 防御:
- 验证输入内容;
- 参数化查询(Parameterized Queries):使用正则表达式等等;
- 从 存储过程(Stored Procedures) 入手:安全存储过程、注入式存储过程。
2.XSS攻击的原理,如何防御?
- 原理:
- 跨站点脚本(通常称为 XSS )是一种 漏洞 或 缺陷,它将 html 或 脚本标记 作为输入组合在一起,渲染到浏览器中而无需进行编码或清理。
- 防御:
- 编写完善的用户输入过滤、编码体系;
- 对网页内容的特定字符进行编码、转义;
- 对 URL 请求进行格式检测、或进行编码或转义。
3.CSRF攻击原理,如何防御?
-
原理:
- 跨站请求伪造,是一种对网站的恶意攻击,在这种攻击中,未经授权的命令由网站信任的用户发送。跨站点脚本攻击( XSS )利用用户对特定站点的信任,而 CSRF 则利用站点对用户浏览器的信任。从而盗用用户身份,执行操作。
- 真正容易受到CSRF攻击的领域是IoT设备、“智能”设备和许多消费级路由器。
-
防御:
-
SameSite Cookie 属性。
对于 SameSite Cookie 属性有两种模式:严格和宽松。严格模式不允许跨站点请求。这时,请求不附加相同站点的cookie。
-
许多(Web)应用程序框架现在都带有内置支持,可以处理CSRF攻击。例如,Spring和Tomcat默认情况下启用此功能。
-
不将GET请求用于状态更改操作。
-
使用自定义请求标头。
-
使用标准标题验证来源。
-
使用双重提交 Cookie。
-
实践注意
本实验是 建立在 WebGoat 8.0 基础上的 ,与其他同学使用的 WebGoat 7.0 在以下等方面 有着明显的不同 。
- 教学内容;
- 教学提示;
- 训练题目;
- 等等。
所以解题过程肯定有所不同。
实践准备
docker 启动 WebGoat 容器
由于 kali 虚拟机出现了些莫名奇妙的错误,暂时不想搞这个东西,本次实验通过 Ubuntu 20.04 的 docker 安装 WebGoat 容器来进行。
-
docker hub 搜索 webgoat,拉取
webgoat/webgoat-8.0
镜像。 -
拉取
webgoat/webgoat-8.0
image。 -
以此构建运行
lamp
容器。-
映射端口:
11201 -> 80
、11202 -> 443
和11203 -> 8080
。 -
以交互式容器运行:
-i -t
。 -
设置加入网络和固定 IP (可略)。
可以看到容器列表:
-
-
以 Ubuntu
IP + 端口 + 路径
访问容器的 Web 服务。-
注意:这里的端口是映射容器 8080 端口的主机端口。
-
示例,登录界面,浏览器输入:
http://192.168.3.40:11203/WebGoat/login
-
-
注册:
-
点击
Register new user
。 -
注册完后,即可进入功能页面。
-
SQL注入攻击
字符串SQL注入
通过串联字符串以使其易于进行字符串 SQL 注入。
示例
-
点击 “(A1) Injection -> SQL Injection (intro) -> 9” 。
-
选择选项使得 SQL 语句为真。
-
这时,SQL 语句:
SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or '1' = '1';
其中
or '1' = '1'
必为真。
-
破坏机密性
查看所有数据。
-
点击 “(A1) Injection -> SQL Injection (intro) -> 11” 。
-
选择选项使得 SQL 语句为真。
-
使得
last_name
和auth_tan
判断都为 真 。Smith' or last_name !='Smith 3SL99A' or auth_tan !='3SL99A
-
破坏完整性
更改数据表。
-
点击 “(A1) Injection -> SQL Injection (intro) -> 12” 。
-
选择选项使得 SQL 语句为真。
-
WebGoat 的数据库使用
--
为注释符,MySQL 则使用#
。所以使用
;
直接结束查询语句,添加更新修改数据表语句,再将后文注释——即可更新数据表。 -
Employee Name
处输入:更新 Smith 工资为 1000000 。
'; update employees set salary=1000000 where last_name='Smith';-- -
-
破坏可用性
删除数据表。
-
点击 “(A1) Injection -> SQL Injection (intro) -> 13” 。
-
选择选项使得 SQL 语句为真。
-
使用
;
直接结束查询语句,添加删除数据表语句,再将后文注释——即可删除数据表。 -
Employee Name
处输入:'; drop table access_log;-- -
-
数值SQL注入
尝试从用户表中检索所有数据。
-
点击 “(A1) Injection -> SQL Injection (intro) -> 10” 。
-
这里有多种思路。
-
(1):之前观察数据表得知:所有人的
userid
都大于0,且没有Login_Count
。所以,
Login_Count
判定为 0 ,userid
判断大于 0 或为 真 即可。SELECT * From user_data WHERE Login_Count = 0 and userid= 1 or userid !=1; 或 SELECT * From user_data WHERE Login_Count = 0 and userid= 1 or userid > 1;
-
(2):整个 SQL 语句都判定为 真 。
这时
Login_Count
和userid
输入判定的值是什么都没有关系。SELECT * From user_data WHERE Login_Count = -1 and userid= -1 or true;
-
跨站点脚本 XSS
反射型 XSS
-
点击 “(A7) Cross-Site Scripting (XSS) -> Cross Site Scripting -> 7” 。
-
在
Enter your credit card number:
栏中填入提示框代码,即可完成支付:<script>alert(20175223);</script>
Dom 型 XSS
路由的测试代码
通常可以通过在客户端代码中查找路由配置来找到基于DOM的XSS。
-
点击 “(A7) Cross-Site Scripting (XSS) -> Cross Site Scripting -> 10” 。
-
根据题目提示:
start.mvc#lesson/
之后的CrossSiteScripting.lesson/9
是由 JavaScript 路由处理程序处理的参数。 -
所以只需要刷新页面就可以看到路由的测试代码。
- 打开浏览器开发者工具,点击 “Console” 控制台。
- 刷新正在访问的页面,即可在控制台看到调试信息。
- 点击 “GoatRouter.js:88” 即可在控制台
Sourse
项中查看路由的测试代码GoatRouter.js
。
-
参数
var GoatAppRouter
的自定义函数中,可以看到路由转发代码'lesson/:name/:pageNum': 'lessonPageRoute'
和'test/:param': 'testRoute'
:-
'lesson/:name/:pageNum'
功能可以从当前网页 URL 发现端倪:http://192.168.3.40:11203/WebGoat/start.mvc#lesson/CrossSiteScripting.lesson/9
访问
lesson/
下的name = CrossSiteScripting.lesson
、pageNum = 9
的页面。 -
所以
'test/:param'
类似同上。
-
-
回答问题:生产期间留在应用程序中的测试代码的路线:
start.mvc#test/
基于 DOM 的 XSS
可以使用路由中的参数而无需进行编码进行 XSS 攻击。
-
点击 “(A7) Cross-Site Scripting (XSS) -> Cross Site Scripting -> 11” 。
-
在上一点的
GoatRouter.js
中可以看到webgoat.customjs.phoneHome()
函数内容: -
根据题目提示,在 “Console” 控制台中输入函数命令,响应将以随机数到达浏览器的控制台:
webgoat.customjs.phoneHome()
-
提交随机数。
存储型 XSS
webgoat-8.0 没有更新 存储型 XSS 的攻击课程。
-
原理:
将 XSS 攻击代码写入类似于拥有评论模块的网页中,每次网页被访问时(无论被谁访问),只要加载这个评论,就会执行 XSS 攻击代码。
CSRF 跨站请求伪造
外部来源触发表单
登录时从外部来源触发以下表单。响应将包括“标志”(数字值)。
-
点击 “(A8:2013) Request Forgeries -> Cross-Site Request Forgeries -> 3” 。
-
右键检查 “提交” 按钮,可以看到隐藏的表单。
-
编写 “CSRF1.1.html” 并保存,通过浏览器打开,发送
POST
表单。- 修改
csrf
为true
。
<body> <form accept-charset="UNKNOWN" id="basic-csrf-get" method="POST" name="form1" target="_blank" successcallback="" action="http://192.168.3.40:11203/WebGoat/csrf/basic-get-flag"> <input name="csrf" type="hidden" value="true"> <input type="submit" name="submit"> </form> </body>
- 修改
-
复制返回值网页中
flag
的值到Confirm Flag
,点击提交。-
如果成功,会提示:
Congratulations! Appears you made the request from your local machine.
-
攻击未受保护的 API
-
点击 “(A8:2013) Request Forgeries -> Cross-Site Request Forgeries -> 7” 。
-
根据要发送的表单,编写
CSRF1.2.html
以构造POC
进行本地访问获取flag
。form
表单中包含四个参数:name
、email
、subject
、message
。
<body> <form name="attack" enctype="text/plain" action="http://192.168.3.40:11203/WebGoat/csrf/feedback/message" METHOD="POST"> <input type="hidden" name='{"name": "WebGoat", "email": "webgoat@webgoat.org", "subject": "service", "message": "' value='WebGoat is the best!!"}'> </form> <script>document.attack.submit();</script> </body>
-
通过浏览器打开,发送
POST
表单。 -
核对
flag
,提交。
实现总结与体会
- 实验主要从 SQL 注入、XSS 脚本、CSRF 三个方面进行攻击实验。
- 对于实验中的攻击,其实现在都已经有现成可用的防御解决方案,虽然现目前的网站攻击五花八门,但是如果满足编码、转义等优秀的编程方案、URL 或表单等信息数据处理方法、良好的网站结构、防火墙等完善的过滤机制以及其他等等安全条件,大部分平常乃至一些特殊的攻击手段都可以防御。
- 所以对于不从事网络安全行业的所谓 “个人” 来说,使用现成已有的、商业化的 Web 服务,比如个人云盘 ownCloud、个人博客 WordPress 等等,都提供了基本可用的安全功能。