Web应用程序安全攻防
- Web应用程序安全攻防
- 0. 总体结构
- 1. 实践内容
- 1.1 Web应用程序体系结构及其安全威胁
- 1.2 Web应用安全攻防技术概述
- 1.3 SQL注入攻击
- 1.4 XSS跨站脚本攻击
- 2. 实践过程
- 2.1 SEED SQL注入攻击与防御实验
- 2.1.1 实验环境
- 2.1.2 熟悉SQL语句
- 2.1.3 对SELECT语句的SQL注入攻击
- 2.1.4 对UPDATE语句的SQL注入攻击
- 2.1.5 SQL对抗,修复上述SQL注入攻击漏洞
- 2.2 SEED XSS跨站脚本攻击实验(Elgg)
- 2.2.1 实验环境
- 2.2.2 发布恶意消息,显示警报窗口
- 2.2.3 弹窗显示cookie信息
- 2.2.4 窃取受害者的cookies
- 2.2.5 成为受害者的朋友
- 2.2.6 修改受害者的信息
- 2.2.7 编写XSS蠕虫
- 2.2.8 对抗XSS攻击
- 2.1 SEED SQL注入攻击与防御实验
- 3. 学习中遇到的问题及解决
- 4. 学习感悟、思考
- 参考资料
0. 总体结构
本次作业属于哪个课程 | 网络攻防实践 |
---|---|
这个作业要求在哪里 | Web应用程序安全攻防 |
我在这个课程的目标是 | 学习网络攻防相关技术和原理 |
这个作业在哪个具体方面帮助我实现目标 | Web应用程序攻防知识,常用Web攻击方式 |
1. 实践内容
第十一章的主要内容是Web应用程序的安全攻防,从了解Web应用程序的体系框架开始,到学习Web应用的信息收集,并介绍了几种常用的Web攻击,最后主要从SQL注入攻击和XSS跨站脚本攻击两个方面进行介绍和实践。所以本文主要从如下几个部分进行介绍。
- Web应用程序体系结构及其安全威胁
- Web应用安全攻防技术概述
- SQL注入攻击
- XSS跨站脚本攻击
1.1 Web应用程序体系结构及其安全威胁
-
Web应用体系结构
-
定义:Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,也造就了B/S计算结构,提升了部署和应用的便捷性。web应用体系结构如下图所示,浏览器主要完成数据显示与展示渲染,服务器主要完成业务计算处理,浏览器与服务器之间的通信通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。当然这只是一个简单的体系架构,其他架构参考大型Web系统架构详解。
-
浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取信息。
-
Web服务器:不仅仅是一个HTTP守护程序,还有对各种Web动态编程语言的支持。
-
数据库:Web应用存储数据的地方。
-
Web应用程序:负责服务器端的业务逻辑处理,最为常见的三层体系结构:
- 表示层:接受Web客户端的输入并显示结果。
- 业务逻辑层:从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层。
- 数据层:以数据库或本地文件的形式,提供非易失的信息存储。
-
传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议使用HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。
-
-
Web应用安全威胁
1.2 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服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
- 服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache扩展组件模块都存在漏洞。
- 样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。
- 源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
- 资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称 的过程。
- 流行的Web服务器软件主要分为两类:
- 攻击Web应用程序
- Web应用程序的不安全性
- Web应用程序编码质量和测试均有限: 安全最薄弱环节。
- Web应用的复杂性和灵活性进一步恶化了其安全性。
- Web应用程序安全威胁类型
- 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
- 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
- 客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
- 命令执行攻击:在web站点执行远程命令的攻击手段。
- 信息暴露:获取web站点具体系统信息的攻击手段。
- 逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。
- Web应用程序的不安全性
- 攻击Web数据内容
- 安全敏感数据泄露
- web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。
- 利用web服务器的上传目录临时中转文件。
- 在web站点公开的文档资料中包含个人隐私、企业秘密。
- 网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换,表达入侵成功或某种观点诉求。
- 不良信息内容上传:网站被攻陷后可能成为不良信息的存储和中转仓库。
- 安全敏感数据泄露
- Web应用安全防范措施
- Web站点网络传输安全设防措施:使用HTTPS、SFTP等安全协议等。
- Web站点操作系统及服务安全设防措施:定期进行操作系统及服务的补丁更新、漏洞扫描等。
- Web应用程序安全设防措施:在设计时就应该谨慎考虑,并且要多设置日志信息。
- Web站点数据安全设防措施:提高个人的安全意识,提高系统的数据保护能力。
1.3 SQL注入攻击
- 代码注入攻击定义:代码注入利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码。包括恶意读取、修改与操纵数据库的SQL注入攻击;在Web服务器端安装、执行Webshaell等恶意脚本的PHP注入或ASP注入攻击;在Web服务器端恶意执行操作系统命令的shell注入攻击还有其他攻击等。
- SQL注入攻击原理:利用Web应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。由于用户输入没有被正确地过滤以消除SQL语言中的转义字符,或没有进行严格的类型判断,使得用户可以输入并执行一些非预期的SQL指令代码。
- SQL注入攻击例子:最常见的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注入点:存在
http://SITE/xxx.asp?some_rec=yyy
的动态网页时,当some_rec
字段为整形参数,通过不同的三种字符串可判断该动态页面是否存在SQL注入点。同理也可以对字符型做,下面展示整型情况。yyy
修改为yyy'
造成SQL出错,动态页面返回错误提示信息。yyy
修改为yyy and 1=1
不对查询条件造成任何影响,返回正常页面。yyy
修改为yyy and 1=2
查询不到任何信息。
- 判断后台数据库类型
- 利用数据库服务器的系统变量。
- 利用数据库服务器的系统表进行判断。
- 利用SQL注入进行后台口令拆解
- 猜解后台口令表表名。
- 猜解字段名。
- 猜解字段值: 二分法逼近。
- 口令可能为MD5散列后的密文。
- 上传ASP后门,得到默认账户权限:在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,对Web站点进行远程控制。
- 本地特权提升
- 利用数据库扩展存储过程执行shell命令:通过SQL注入点执行相应的扩展存储过程。
- 发现SQL注入点:存在
- SQL注入攻击工具:这是比较新的工具10个SQL注入工具。
- 自动化SQL注入漏洞发现
- Wposion:能够在动态Web文档中找出SQL注入漏洞的工具。
- mieliekoek.pl:以网站镜像工具生成的输出为输入,找出含有表单页面。
- 自动化SQL注入测试
- SPIKE Proxy工具:允许使用者对待注入字符串进行定制。
- SPI Toolkit工具包中的“SQL Injector”工具。
- 自动化SQL注入漏洞发现
- SQL注入攻击防范措施
- 使用类型安全(type-safe)的参数编码机制。
- 凡是来自外部的用户输入,必须进行完备检查。
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象。
- 加强SQL数据库服务器的配置与连接。
1.4 XSS跨站脚本攻击
-
定义:XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等后果。
-
XSS攻击技术原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为
alert(/xss/)
,这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。 -
持久性XSS漏洞
- 漏洞形式: Web应用程序允许用户输入内容并持久保存并显示在网页上。
- 攻击方式: 攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害。
- 典型案例: 留言本/论坛/博客/wiki等。
-
非持久性XSS(例子讲解)
-
XSS攻击防范措施
- 服务器端防范措施:“限制、拒绝、净化”
- 输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
- 输出净化: HTMLEncode()方法。
- 消除危险的输入点。
- 客户端防范措施
- 提高浏览器访问非受信网站时的安全等级。
- 关闭Cookie功能,或设置Cookie只读。
- 建立安全意识和浏览习惯。
- 服务器端防范措施:“限制、拒绝、净化”
2. 实践过程
说明:SQL注入实验和XSS实验由于本人的SEED Ubuntu均升级到了16.04,原来的实验指导书存在严重的问题,所以下面的实验是根据官方最新的16.04的实验指导书来进行的,诸多问题与之前有所不同,同时这两个实验指导书我附在GitHub上,下面的实验均按照最新的实验指导书的任务进行。
2.1 SEED SQL注入攻击与防御实验
任务:我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。 该Web应用程序是一个简单的员工管理应用程序。 员工可以通过此Web应用程序查看和更新数据库中的个人信息。 此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。 员工是一般角色,可以查看或更新自己的个人资料信息。 完成以下任务
- 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。 该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。 在此任务中,您需要使用数据库来熟悉SQL查询。
- 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
- 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
- SQL对抗,修复上述SQL注入攻击漏洞。
2.1.1 实验环境
- SEED Ubuntu 16.04
- Web应用网站:http://www.SEEDLabSQLInjection.com 及其本地文件夹路径
/var/www/SQLInjection/
。这部分可以在Firefox的收藏夹以及hosts中查看到。 - 托管网站的Apache2服务器,请先使用指令
sudo service apache2 start
启动Apache服务。
2.1.2 熟悉SQL语句
-
这部分的内容比较简单,以前学习数据库都学学习过。简单说明,如果没学过数据库的建议复习MySQL 教程。首先使用指令
mysql -u root -pseedubuntu
登陆MySql数据库,-u
指定用户名,-p
指定密码。 -
如果我们要使用哪个数据库,可以使用指令
use Users;
,show tables;
查看该数据库下面的表。 -
下面我们使用指令
select * from credential;
来打印所有员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。
2.1.3 对SELECT语句的SQL注入攻击
-
审查:这是必须的一步,我们应该查看当前的Web界面源代码中有哪些东西。在这里我们看到前端提交表单数据到unsafe_home.php进行校验。那么我们开始查找这个unsafe_home.php文件,如第二张图所示,上面的SQL语句从凭据表中选择个人员工信息,例如ID,姓名,薪水,SSN等。 SQL语句使用两个变量输入uname和散列的pwd,其中输入uname保留用户在登录页面的用户名字段中键入的字符串,而散列的pwd保留用户键入的密码的sha1哈希。 程序检查是否有任何记录与提供的用户名和密码匹配;如果存在匹配项,则表明用户已成功通过身份验证,并获得了相应的员工信息。 如果不匹配,则认证失败。
-
现在我们知道管理员的账户名是
admin
,在不知道密码的情况下实行SQL注入攻击进入Web应用。通过上面的观察,我们发现,我们只需要在用户名输入特定的语句,导致不进行password的校验就可以跳过验证。所以我们使用字符串admin '#
进行登录即可,#
后面的语句被注释,无法执行。所以只进行了用户名的校验。我们发现确实登录成功。并且在登录界面能够看到所有用户的数据,和之前查表的结果一致,证明我们的攻击有效。 -
接下来的任务是利用命令行完成管理员的登录。在这里要注意的问题就是几个特殊符号要进行转义,就是找到几个特殊符号的十六进制,譬如
#
用%23
表示,这里由于在命令行,所以我们需要用到cURL,这是一个利用URL语法在命令行下工作的文件传输工具。使用指令curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
就可以成功登录系统。通过返回的HTML代码,我们可以看到信息和我们上面看到的信息相同,证明我们的攻击时成功的。 -
最后的任务是追加新的SQL语句达到修改数据库的效果。按照上面的想法我们只要追加一个
delete
或者update
语句就好了,我们通过追加指令'1=1;delete from the credential where name 'Alice';#
发现并不成功。这是因为MySql中的对策阻止了从php调用多个语句的执行,因此攻击未成功。
2.1.4 对UPDATE语句的SQL注入攻击
-
首先我们也应当找到UPDATE语句。这部分的内容在unsafe_edit_backend.php中。这个UPDATE语句可以看到员工只能修改基本的信息,无权修改工资,这条UPDATE语句也没有进行任何的保护如权限等,所以我们估计是可以被注入攻击的。
-
首先我们的任务是修改Alice的工资。首先用类似前面管理员登录的方式登录Alice的账号,进去之后可以看到Alice的相关信息,记住EID要用的。然后进行edit profile修改信息。在NickName那里输入语句
', salary='500000' where EID='10000';#
,这样#
后面的就会被注释,所以就直接执行set salary='500000' where EID = '10000'
这个指令,所以直接修改了工资。这个时候回去看自己的profile应该能看到是已经修改成功的,证明我们的攻击成功。 -
下面的任务是修改其他人的工资。那么我们只要在Alice修改的界面的nickname输入
', salary='1' where name='Boby';#
,再进入Boby的界面,我们发现工资已经成功修改。这个原理和上面相同。 -
最后一个任务是修改其他用户的密码。我们知道密码在数据库中是以sha1的形式存储的,那么就简单了,那么首先我们需要获取一个指定密码的sha1值。使用指令
echo -n '123456'|sha1sum
输出密码123456
的sha1值为7c4a8d09ca3762af61e59520943dc26494f8941b
。 -
接下来继续以Alice的账户登录,继续在edit profile那里修改用户名,填上以下指令进行sha1值的修改
', Password='7c4a8d09ca3762af61e59520943dc26494f8941b' where Name='Boby';#
。这个时候我们正常登陆Boby的账户,发现通过我们修改的123456
密码已经能够完成正常的登录。此时我们成功的完成了攻击。
2.1.5 SQL对抗,修复上述SQL注入攻击漏洞
-
SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。那么预处理语句是什么呢,参考SQL预处理语句(Prepared Statements),可以简单的理解为编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。下图是一个SQL语句的执行过程,你可以更好的了解预处理语句的作用。
-
在了解了预处理语句的写法之后,下面就是将原来的代码改成带预处理语句的代码了。原来的代码数据库查询代码如下,在unsafe_home.php中。这部分的主要含义就是进行了数据库的查询,然后转为了json格式,这里的SELECT语句代码和数据放在一起,所以容易遭受攻击。下面我们进行代码的修改。
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'"; if (!$result = $conn->query($sql)) { echo "