代码改变世界

2018-2019-2 网络对抗技术 20165321 Exp9 Web安全基础

2019-05-25 17:19  Ze6Pui3Loeng4  阅读(160)  评论(0编辑  收藏  举报

1.实验目的

本实践的目标理解常用网络攻击技术的基本原理。

2.实验内容

1.General

基础知识

该课目的在于了解浏览器和Web 应用程序之间数据交互的基本知识。
HTTP 是如何工作的呢?所有的HTTP 传输都要遵循同样的通用格式(需要使用IEWatch或WebScarab 类插件协助进行学习)。每个客户端的请求和服务端的响应都有三个部分:请求或响应行、一个报头部分和实体部分。客户端以如下方式启动一个交互:
客户端连接服务器并发送一个文件请求:
GET /index.html?param=value HTTP/1.0
接下来,客户端发送可选头信息,告知接收服务器其配置和文件格式:
User-Agent: Mozilla/4.06 Accept: image/gif, image/jpeg, */*
发送请求和报头之后,客户端可以发送更多的数据。该数据主要用于使用POST方法的CGI程序。

操作方法

Step 1:使用sudo apt-get install webscarab命令安装WebScarab,用来修改编辑http消息等。打开webscarab。
Step 2:WebScarab有两种显示模式:Lite interfacefull-featured interface,可在Tools菜单下进行模式切换,需要重启软件生效,修改http请求信息需要在full-featured interface下进行。

Step 3:点击Proxy标签页->Listeners标签页```,输入url和端口号等,添加listener。 ![](https://img2018.cnblogs.com/blog/1058368/201905/1058368-20190523195251550-581928305.png) Step 4:点击Proxy标签页->Manual Edit标签页, 选中Intercept requests。 ![](https://img2018.cnblogs.com/blog/1058368/201905/1058368-20190523195537451-161966822.png) Step 5:在浏览器中(以Firefox为例),点击Open menu->Preferences->Advanced->Network选项卡,选择右边Settings...进行设置,增加一个localhost代理: ![](https://img2018.cnblogs.com/blog/1058368/201905/1058368-20190523200323935-816909221.png) 修改后重启Firefox生效。 Step 6:在输入框输入姓名,点击Go!``,可以在WebScarab中看到提交的http请求:

2.Code Quality

基础知识

众所周知,很多开发者喜欢在源代码中保存FIXME's、Code Broken、Hack 等语句。通过审查源代码中的相关注释往往能找到密码、后门及一些潜在的问题。
浏览器工具菜单中“view source”功能可以查看网页HTML 源代码。

操作方法

Step 1:首先下载webgoat的软件包,在https://github.com/WebGoat/WebGoat/releases中下载。
Step 2:查看是否安装有JDK:java -version查看jdk版本

Step 3:终止占用8080端口的其他进程
因为WebGoat默认使用8080端口
先查看8080端口是否被占用:netstat -tupln | grep 8080
如果被占用,用kill 进程号kill -s 9 进程号终止占用8080端口的进程

Step 4:开启WebGoat:java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar
在看到信息Starting WebGoat with args: {}这一条消息之后就可以进行下一步了

Step 5:浏览器中打开WebGoat登录界面:http://localhost:8080/WebGoat
在当前页面按F12,选择Inspector。搜索FIXME可看到有关用户名和密码的记录。

3.Phishing with XSS

基础知识

在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
总体目标是,创建一个form,要求填写用户名和密码。

操作方法

Step 1:一个带用户名和密码输入框的表格如下所示:
``




This feature requires account login:



Enter Username:

Enter Password:




`` 搜索这段代码,可以看到页面中增加了一个表单: ![](https://img2018.cnblogs.com/blog/1058368/201905/1058368-20190525155132115-23192301.png) Step 2:还需要一段脚本: `` `` 这段代码会读取在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat。 Step 3:最后,就是要将这两段代码合并。最终需要输入的代码如下: ``



This feature requires account login:



Enter Username:

Enter Password:




`` 搜索这段代码,出现用户名和密码的填写界面: ![](https://img2018.cnblogs.com/blog/1058368/201905/1058368-20190525155240483-1044966275.png) 填写并登录,WebGoat会反馈输入的信息: ![](https://img2018.cnblogs.com/blog/1058368/201905/1058368-20190525160218935-655203549.png)

4.Stored XSS Attacks

基础知识

输入验证是一个很好的方法,尤其是验证那些以后将用做参数的操作系统命令、脚本和数据库查询的输入。尤为重要的是,这些内容将会永久的存放在那里。应当禁止用户创建消息内容。用户的信息被检索时,可能导致其他用户加载一个不良的网页或不良的内容。当一个未经验证的用户的输入作为一个HTTP 响应时,XSS 攻击也可能会发生。在一个反射式XSS 攻击中,攻击者会利用攻击脚本精心制作一个URL 并通过将其发送到其他网站、电子邮件、或其他方式骗取受害者点击它。
在这个练习中,我们尝试执行存储型跨站脚本攻击。

操作方法

在Message中构造语句<script>alert("20165321 attack succeed!");</script>,Title任意。提交后可发现刚创建的帖子test5321:

5.数字型SQL注入(Numeric SQL Injection)

基础知识

在station 字段中注入特征字符,能组合成新的SQL 语句。
SELECT * FROM weather_data WHERE station = [station]
这道题的表单允许用户查看天气数据。需通过注入SQL字符串的方式查看所有的天气数据。

操作方法

Step 1:按F12进入调试界面,选择Inspector对源代码进行修改。
Step 2:在选项列表中,任意选择一个值,比如101,后面加上or 1=1

Step 3:输出如下所示:

6.String SQL Injection

基础知识

基于以下查询语句构造自己的SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'

操作方法

本题的表格,允许用户查看他们的信用卡号码。尝试通过SQL 注入将所有信用卡信息显示出来。尝试的用户名是“Smith”。
输入以下代码即可完成:
’ or 1=1 -- // 或者 Smith' or 1=1 --
如下图所示:

7.日志欺骗(Log Spoofing)

基础知识

这种攻击是在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。

操作方法

Step 1:点击Injection Flaws-Log Spoofing

Step 2:在User Name中填入Smith%0d%0aLogin Succeeded for username: admin,利用回车0D%和换行符%0A让其在日志中两行显示
Step 3:输入密码后点击Login,可以看到SmithLogin Fail那行显示,我们自己添加的语句在下一行显示

3.实验后回答问题

(1)SQL注入攻击原理,如何防御
答:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。
比如登录过程,SQL语句一般为:"select id from users where username = '"+username +"' and password = '" + password +"'",这里的usernamepassword都是我们存取从web表单获得的数据。如果我们在表单中username的输入框中输入' or 1=1--。此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = ''。因为1=1true,后面and password = ''被注释掉了。所以这里完全跳过了sql验证。
以上是最经典的一种情况。但在本次实验中,还涉及到了网页对输入字符长度的限制等等,需要修改相应的代码。
由此可见,对SQL注入攻击的防御,主要有:

  • 关闭或删除不必要的交互式提交表单页面;
  • 对漏洞注入点相关代码进行代码及SQL注入关键字的过滤,以规范代码安全性;
  • 不要在服务器端放置备份的文件以免受到感染,或备份的文件含有漏洞,造成切入点。

(2)XSS攻击的原理,如何防御
答:攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。
浏览器自身可以识别简单的XSS攻击字符串,从而阻止简单的XSS攻击;从根本上说,解决办法是消除网站的XSS漏洞,这就需要网站开发者运用转义安全字符等手段。
一个原则:不相信用户输入的任何数据!

(3)CSRF攻击原理,如何防御
答:CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点相似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。
严格意义上来说,CSRF 不能分类为注入攻击,因为 CSRF 的实现途径远远不止 XSS 注入这一条。通过 XSS 来实现 CSRF 易如反掌,但对于设计不佳的网站,一条正常的链接都能造成 CSRF。
防御的方法可从以下几个角度考虑:

  • 改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。
  • 使用“请求令牌”。首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在Session里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与Session中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份。

4.实验总结与体会

本次实验在Webgoat平台上进行,不需要过于复杂的环境配置过程,每一个小实验测试的知识点也都非常明了。比如Injection Flaws中有很多关于注入的小实验,不同的实验侧重不同的考察点。不管是命令注入、日志欺骗,还是数据库后门,都让我在实践中对理论有了更加深刻地理解。除此之外,在实践的过程中,我参考了WebGoat官方的使用手册,其中对于每一个小实验的原理都介绍得非常清楚。在官方手册的指导下顺利完成了本次实验。