热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

20192020220175313张黎仙《网络对抗技术》Exp9Web安全基础

[TOC]一、实验目标理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。二、预备知识SQL注入通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终

目录
  • 一、实验目标
  • 二、预备知识
  • 三、实验内容
    • 任务一:WebGoat环境搭建
    • 任务二:SQL注入
      • (1)String SQL injection
      • (2)Numeric SQL injection
      • (3)SQL query chaining
      • (4)Compromising Availability
    • 任务三:XSS攻击
      • (1)Reflected XSS
      • (2)DOM-Based XSS
    • 任务四:CSRF攻击
      • (1)Basic Get CSRF Exercise
      • (2)Post a review on someone else’s behalf
  • 四、实验思考
    • (1)SQL注入攻击原理,如何防御?
    • (2)XSS攻击的原理,如何防御?
    • (3)CSRF攻击原理,如何防御?
  • 五、实践体会
  • 六、参考资料


一、实验目标

理解常用网络攻击技术的基本原理。Webgoat实践下相关实验。


二、预备知识

SQL注入



  • 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

  • 就是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

XSS攻击



  • 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。

  • XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的phishing攻击而变得广为人知。

CSRF攻击



  • Cross Site Request Forgery跨站请求伪造

  • CSRF就是冒名登录。跨站请求伪造的核心本质是窃取用户的Session,或者说COOKIE,因为目前主流情况Session都是存在COOKIE中。攻击者并不关心被害者具体帐号和密码,因为一旦用户进行了登录,Session就是用户的唯一凭证。只要攻击者能够得到Session,就可以伪装成被害者进入服务器。

  • 主要是当访问网站A时输入用户名和密码,在通过验证后,网站A产生COOKIE信息并返回,此时登录网站A成功,可正常发送请求到网站A。在未退出网站A前,若访问另一个网站B,网站B可返回一些攻击性代码并请求访问网站A;因此在网站B的请求下,向网站A发出请求。但网站A不知道该请求恶意的,因此还是会执行该恶意代码。


三、实验内容


任务一:WebGoat环境搭建





  • WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。其运行在带有java虚拟机的平台之上,并提供了一系列web安全学习的教程,来指导用户利用这些漏洞进行攻击。

  • WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、COOKIE等。





  • 下载jar包:webgoat-server-8.0.0.M26.jar

  • WebGoat默认使用8080端口,所以开启前先用netstat -tupln | grep 8080查看端口是否被占用,如果被占用,用kill 进程号终止占用8080端口的进程。


技术分享图片




  • 因为WebGoat运行java平台之上,所以使用java -version查看jdk版本


技术分享图片




  • java -jar webgoat-server-8.0.0.M26.jar加载jar包

  • 浏览器中输入http://127.0.0.1:8080/WebGoat打开WebGoat注册界面,先注册后登录即可。


任务二:SQL注入


(1)String SQL injection



题目1

"SELECT * FROM user_data WHERE first_name = ‘John‘ AND last_name = ‘" + lastName + "‘";,输入是lastName。

要求1

在不需要知道任何用户名的情况下,得到整张表的内容。



分析1



  • 上述查询语句简化为SELECT * FROM user_data WHERE first_name = ‘John‘ AND last_name = ‘ + 输入 + ‘;

  • AND优先于OR运算,所以前面部分不论是什么,最终都是一个0/1,只需要OR上一个true,最终就是true

  • 输入部分填写的内容只要最后是类似OR true即可。但是,注意到输入的前面有个后面也有一个,所以得到最终的输入为:(...)‘ OR ‘1‘=‘1


技术分享图片




题目2

"SELECT * FROM employees WHERE last_name = ‘" + name + "‘ AND auth_tan = ‘" + auth_tan + "‘;,输入是name和auth_tan。

要求2

在不需要知道任何用户名的情况下,得到整张表的内容。



分析2



  • 上述查询语句简化为SELECT * FROM employees WHERE last_name = ‘ + 输入name + ‘AND auth_tan =‘ + 输入auth_tan‘;

  • 看到AND,我首先想到的是能不能将其通过注释消除掉,那么通过name = ‘ or true就轻松破了这个题目。


技术分享图片



(2)Numeric SQL injection



题目

"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;输入是Login_Count和User_ID。

要求

Login_Count必须是数字,且通过这两个输入,得到整张表的内容。



分析



  • 上述查询语句简化为SELECT * FROM user_data WHERE login_count = + 输入Login_Count + AND userid = + 输入User_ID;,即在表中查询login_count = 输入1 AND userid =输入2

  • 看到AND,我首先想到的是能不能将其通过注释消除掉,但是这里要求Login_Count必须是数字,那么通过Login_Count=1 or true --这种方式很明显就无法实现。

  • 那么就只能userid入手了,通过userid = 1 or true 这个Solution就能破了这个题目。


技术分享图片



(3)SQL query chaining



题目

"SELECT * FROM employees WHERE last_name = ‘" + name + "‘ AND auth_tan = ‘" + auth_tan + "‘;



  • 已知Tobi和Bob工资比你高,通过修改你的工资,使得你的工资是最高的。

  • 你的名字是John Smith,你现在的TAN是3SL99A。

  • 输入是Employee Name 和 Authentication TAN。

要求

只知道自己的Name和TAN,通过修改自己的工资,使得表中自己的工资最高。



分析



  • 这题与上面的题目有所不同,这道题需要对表中内容进行修改,所以需要用到修改语句update employees set salary=1000000 where last_name=‘Smith‘;,这里随便取了一个数值作为自己工资,觉得应该是够了。

  • 每句SQL都是以;分号作为结束的标志,所以我们应该先使用‘;来结束原本的SQL语句,然后接着上面的修改语句对表中内容进行修改,最后使用--将后面没必要的内容注释掉。

  • 最终SQL语句为SELECT * FROM employees WHERE last_name = ‘‘; update employees set salary=1000000 where last_name=‘Smith‘;


技术分享图片



(4)Compromising Availability

题目



  • 输入为:Action contains

  • 通过输入的内容,查询access_log表中与其对应的部分,将其删除。

分析



  • 这道题目与上一题类似,只不过将注入的SQL修改语句改为SQL删除语句,以达到将日志中记录的相应内容删除,从而隐藏攻击者的攻击行为。

  • 删除语句为:drop table access_log;

  • 同样先使用‘;来结束原本的SQL语句,然后接着上面的删除语句对表中删除相应内容,最后使用--注释后面内容。


技术分享图片



任务三:XSS攻击


(1)Reflected XSS




  • 确定哪个字段易受XSS的影响,验证服务器端的所有输入总是一种很好的做法。 当HTTP响应中使用未经验证的用户输入时,可能会发生XSS;

  • 在反射的XSS攻击中,攻击者可以用攻击脚本制作一个URL,并将其发布到另一个网站,发送电子邮件,或者以其他方式让受害者点击它;

  • 一个简单的方法来确定一个字段是否容易受到XSS攻击,就是使用alert.()或console.log()方法,用其中一个找出哪个领域是脆弱的。


题目


技术分享图片


分析



  • 当我点击Update Cart时,可以看到页面上输出,初步确认卡号字段存在xss

  • 然后我直接注入发现成功了。


技术分享图片



(2)DOM-Based XSS


基于DOM的XSS通常可以通过查找客户端代码中的路由配置来找到。


题目1

通过检查Java脚本源代码,找到test路径。

分析1



  • 没有头绪,我就随便输了个路径点提交,发现回显里有提示:

No, look at the example. Check the GoatRouter.js file. It should be pretty easy to determine.



  • 于是打开调试器,查看GoatRouter.js,里面有一句:‘test/:param‘: ‘testRoute‘,得到答案:start.mvc#test/


技术分享图片


题目2

利用上一题中找到的测试路径,成功出发WebGoat中的内部函数webgoat.customjs.phoneHome()

分析2



  • 题目中说让我们利用上一题中找到的测试路径。那么先尝试直接把函数贴到路径后面执行一下。


技术分享图片



可以看到没有调用函数,而是直接回显了。




  • 网页框里加个标签,再试试


这次没有回显,说明应该是调用成功了。打开控制台,发现结果已经出来,末尾的数字就是答案。
技术分享图片




  • 将控制台中获取到的数字输入后提交,显示答案正确。


技术分享图片



任务四:CSRF攻击


(1)Basic Get CSRF Exercise

题目


技术分享图片


分析1

题目要求我们换个源点击这个提交,那么就用Burp抓个包,把referer随便改一下,就得到了flag,然后把得到的flag填到下面的Confirm Flag Value中,就成功了。


技术分享图片


分析2



  • 用Burp生成一个PoC,PoC大概是验证程序的意思,在这里生成CSRF,PoC就是生成一段能点击这个链接的html代码。


技术分享图片




  • 生成html代码后,点击Test in browser后会生成一个网址,在连接Burp代理的情况下打开就会出现一个有按钮的页面,点击按钮跳转页面,得到flag。


技术分享图片



(2)Post a review on someone else’s behalf

题目

下面的页面模拟评论/评论页面。 这里的区别是,您必须在其他地方启动提交,就像您可能使用CSRF攻击一样,并且类似于前面的练习。


技术分享图片


分析

思路与上一题相似,只不过是把GET方法换成POST方法,这里就不重复叙述。


四、实验思考


(1)SQL注入攻击原理,如何防御?

原理




  • SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作。如通过在用户名、密码登输入框中输入一些‘,--,#等特殊字符,实现引号闭合、注释部分SQL语句,利用永真式实现登录、显示信息等目的。

  • 总的来说,SQL注入就像是把前端输入的内容像填空一样填到后台递交给数据库的搜索语句中,凑成一个完整的SQL表达式,完成相应的任务。


防御


通过各种方式对非法输入进行检查:



  • 检查变量数据类型和格式

  • 对无法确定固定格式的变量,进行特殊符号过滤或转义处理

  • 绑定变量,使用预编译语句



(2)XSS攻击的原理,如何防御?

原理


攻击者通过往Web页面里插入恶意html标签或者Javascript代码,并能够被浏览器成功的执行。


防御




  • 在表单提交或者url参数传递前,对需要的参数进行过滤

  • 检查用户输入的内容中是否有非法内容



(3)CSRF攻击原理,如何防御?

原理


攻击者借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。CSRF的攻击分为两步:



  • 注入恶意URL

  • 然后在该地址中写入攻击代码,利用技术分享图片等标签或者使用Javascript脚本


防御




  • 通过referer、token或者验证码来检测用户提交

  • 尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作

  • 避免全站通用的COOKIE,严格设置COOKIE的域



五、实践体会


本次实验相对而言比较有意思,一下子一个SQL注入就吸引了我的眼球,虽然自己写的代码中数据库平时不经常接触到,但是在这个大数据的时代,数据库安全变得尤为重要。如果信息系统的安全性不够,简简单单的一个SQL注入有可能就获得了国家机密。想想真是可怕。



六、参考资料



  • WebGoat 8安装、配置、使用教程(CentOS)

  • BurpSuite实战指南

  • 0x63_Web_Webgoat安装.md


推荐阅读
  • 解析 HTTP 头 'Vary: Accept-Encoding' 的作用与重要性
    本文详细探讨了 'Vary: Accept-Encoding' HTTP 头的作用,即指导缓存系统(如代理服务器和 CDN)根据不同的编码需求存储和提供适当的资源版本,确保不同类型的客户端能够接收到适合自己的内容。 ... [详细]
  • 本文探讨了Lua中元表和元方法的使用,通过具体的代码示例展示了如何利用这些特性来实现类似C语言中的运算符重载功能。 ... [详细]
  • 拖拉切割直线 ... [详细]
  • Python中调用Java代码的方法与实践
    本文探讨了如何在Python环境中集成并调用Java代码,通过具体的步骤和示例展示了这一过程的技术细节。适合对跨语言编程感兴趣的开发者阅读。 ... [详细]
  • VS Code 中 .vscode 文件夹配置详解
    本文介绍了 VS Code 中 .vscode 文件夹下的配置文件及其作用,包括常用的预定义变量和三个关键配置文件:launch.json、tasks.json 和 c_cpp_properties.json。 ... [详细]
  • 本周六上午11点左右到达公司,回顾了一周的行业动态并完成了昨日的任务。下午主要解决了Axis2缓存问题以及DBS和KMS的相关技术难题。由于服务替换导致平台访问错误,经过多方查找未能解决,最终决定暂时搁置。此外,还分享了与朋友之间的沟通障碍及个人成长的思考。 ... [详细]
  • Pandas中使用sort_values方法进行数据排序
    本文介绍了如何利用Python的Pandas库中的sort_values方法对DataFrame对象进行排序。首先通过Numpy库生成随机数据,然后详细解释了DataFrame的创建过程及其参数,并重点探讨了sort_values方法的使用技巧。 ... [详细]
  • Python与Java在Appium中的应用:混合APP自动化测试方法详解
    本文详细探讨了如何使用Python和Java语言结合Appium框架进行混合APP的自动化测试,特别针对面试中常见的问题进行了整理和解答。 ... [详细]
  • 抽象工厂模式 c++
    抽象工厂模式包含如下角色:AbstractFactory:抽象工厂ConcreteFactory:具体工厂AbstractProduct:抽象产品Product:具体产品https ... [详细]
  • 本文通过一个具体的例子,展示如何利用枚举思想来解决特定的算术表达式构建问题,即通过插入不同的运算符(加、减、乘、除)使给定数字序列满足特定条件。 ... [详细]
  • 代码生成器实战教程:提升编程效率的利器
    本系列文章旨在通过一系列实践案例,详细介绍如何利用代码生成器提高开发效率。本文将引导您完成从下载安装到实际应用的全过程。 ... [详细]
  • 本文提供最新的CUUG OCP 071考试题库,包含70道题目,旨在帮助考生更好地准备Oracle Certified Professional (OCP) 考试。 ... [详细]
  • 四月个人任务:Linux基础操作与网络管理
    本文介绍了两项主要任务:编写一个脚本来检测192.168.1.0/24子网中当前在线的IP地址,以及如何在Linux系统中挂载Windows网络共享目录。通过具体步骤和代码示例,帮助读者理解和掌握相关技能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置单节点的Redis服务,包括下载、解压、编译安装以及启动服务的具体步骤。 ... [详细]
  • Flask中路由的基础定义与应用
    本文介绍了如何在Flask框架中通过装饰器为视图函数指定访问路径,并详细讲解了带参数路由及指定请求方法的实现方式。 ... [详细]
author-avatar
雨里漾_968
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有