攻防世界做题

news/2024/11/27 15:46:20/

xff_referer

进来之后显示ip地址必须为123.123.123.123

抓包看一下

要求ip是123.123.123.123

就可以用xff伪造即X-Forwarded-For: 123.123.123.123

得到显示:

 说必须来自google,伪造referer Referer: https://www.google.com

我的要在右边的 inspector中加才可以

得到flag

http请求头中Referer的含义和作用_referer头的作用_小刘学安卓的博客-CSDN博客

这里引用一篇大佬的博客给大家解释Referer是什么

web2 

这段代码主要是一个使用逆向加密算法的 PHP 脚本

下面来解析一下:

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";//定义了一个变量 $miwen,它包含了一个加密后的字符串

function encode($str){//定义了一个名为 encode 的函数,该函数接受一个字符串作为参数并返回加密后的结果
    $_o=strrev($str);//通过 strrev 函数对输入字符串进行反转操作,将其赋值给变量 $_o
    // echo $_o;
        
    for($_0=0;$_0<strlen($_o);$_0++){//使用一个 for 循环遍历 $_o 中的每个字符
       
        $_c=substr($_o,$_0,1);//使用 substr 函数从 $_o 中取出当前位置的字符,并将其赋值给变量 $_c
        $__=ord($_c)+1;//通过 ord 函数获取 $_c 的 ASCII 值,并将其加一
        $_c=chr($__);//使用 chr 函数将加一后的 ASCII 值转换为对应的字符,并将其赋值给 $_c
        $_=$_.$_c;  // $_c 添加到变量 $_ 的末尾   
    }
    return str_rot13(strrev(base64_encode($_)));//使用 base64_encode 函数进行 Base64 编码,然后使用 strrev 函数进行反转,最后使用 str_rot13 函数进行 ROT13 编码
}

highlight_file(__FILE__);//这行代码用于在浏览器中显示当前文件的源代码
/*
   逆向加密算法,解密$miwen就是flag
*/
?>

先时将flag字符串逆序,

然后每一个ascii码数值+1,

然后base64加密,

然后逆序,

然后再rot13加密

得到加密的密文:a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws

根据这个思路把他反过来就可以了

<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";//定义了变量 $miwen,其中包含了经过加密的密文字符串
$miwen=base64_decode(strrev(str_rot13($miwen)));//使用 str_rot13 函数进行 ROT13 解码,然后使用 strrev 函数对解码后的字符串进行反转
 
//echo $miwen;
 
$m=$miwen;//将解密后的字符串赋值给变量 $m
 
for($i=0;$i<strlen($m);$i++){//使用一个 for 循环遍历 $m 中的每个字符
 
$_c=substr($m,$i,1);//使用 substr 函数从 $m 中取出当前位置的字符,并将其赋值给变量 $_c
$__=ord($_c)-1//使用 ord 函数将 $_c 转换为对应的 ASCII 值,并将其减一
$__=chr($__);//chr 函数将减一后的 ASCII 值转换为对应的字符,并将其添加到变量 $_ 的末尾
 
$_=$_.$__;//使用 strrev 函数对 $_ 进行反转操作
 
}
 
echo strrev($_);//反转字符串
?>

 得到flag

warmup

查看源代码得到:

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)//定义了一个名为 emmm 的类,其中包含了一个静态方法 checkFile,该方法用于检查指定文件是否在白名单中定义了一个白名单数组 $whitelist,其中包含了允许包含的文件名
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];//定义了一个白名单数组 $whitelist,其中包含了允许包含的文件名
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;//检查传入的 $page 参数是否存在且为字符串类型,如果不存在或者不是字符串类型,则输出 "you can't see it" 并返回 false
            }

            if (in_array($page, $whitelist)) {
                return true;//$page 在白名单中,则直接返回 true
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );//使用 mb_substr 和 mb_strpos 函数对 $page 进行处理,去除可能存在的查询字符串部分
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );//使用 urldecode 函数对 $page 进行解码,并再次使用 mb_substr 和 mb_strpos 函数处理 $_page
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])//首先检查是否存在名为 file 的请求参数,并且该参数是一个字符串类型
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;//如果满足条件,并且通过 emmm::checkFile 方法检查文件名是否在白名单中,则使用 include 函数包含指定的文件,并终止脚本执行
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";//如果条件不满足,则输出一张图片,并显示 "you can't see it"
    }  
?>

 进入hint.php

输入这个文件发现被限制了

 构造payload有三个条件:

第一个:检查一个变量是否为空

第二个:是否为字符串

第三个:通过函数checkFile来检查

 这个函数是分三步来检查是否满足白名单的

只要我们传的参数是source.php或者hint.php则返回真(因为这一步写死了参数只能为白名单的值,所以无法利用)

如果满足继续往下判断

看mb_strpos的第一个参数是:$page.'?',这结果就是在参数后面拼接一个'?'

接着第二个参数'?',就是要查找第一个参数字符串中首次出现'?'的下标,如下图

获得下标就是为了利用mb_substr提取page参数中第一个?前面的字符串

如果还满足继续往下判断 

先把传进的参数做urldecode

接着就和第二步一样

都不满足就输出"you can't see it"并且返回假

总结:我们需要得到checkFile函数返回true且需要带上

所以构造payload的时候,就需要一步一步绕过

先绕过第二步:

source.php/?file=hint.php?

绕过第三步:

/../../../../../../ffffllllaaaagggg

用这个的原因:

先看include定义(官方)

重点:

被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照include_path 指定的目录寻找。

如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略

include_path,简单理解就是类似系统中的PATH环境变量,在文件包含在没有指出路径就会在前面补充这个include_path,从而形成完整的绝对路径

比如:include_path设置为/var/www/,在执行include "flag.txt",路径就是/var/www/flag.txt

由于我们构造的payload:”source.php?/../../../../../../ffffllllaaaagggg“包含路径

所以会忽略include_path直接按照我们路径去寻找。没错虽然这个payload很奇怪但对于include来说就是一个路径,由于不是/开头,所以还是个相对路径,过程如下

假设source.php所在目录为:/1/2/3/4/5/var/www/html/source.php

1、"source.php(或hint.php)?/":进入这个目录,是的哪怕这个目录不存在,因为include会一直尝试到最后才会报错。这样我们当前路径为:"/1/var/www/html/source.php?/"

2、"../":返回上一级,当前目录为"/1/var/www/html/",回到了php所在路径

3、"../":同理,当前路径为"/1/var/www/"

4、"../":同理,当前路径为"/1/var/"

5、"../":同理,当前路径为"/1/"

6、"../":同理,当前路径为"/",回到根目录,最后找到ffffllllaaaagggg这个文件

所以这里可以用/../../../../../../ffffllllaaaagggg来找flag

得到flag


http://www.ppmy.cn/news/1121482.html

相关文章

珠海建筑模板厂家-能强优品木业:为您提供优质建筑模板解决方案

在珠海这座美丽的沿海城市&#xff0c;建筑行业蓬勃发展&#xff0c;对于高质量的建筑模板需求也日益增加。在这里&#xff0c;有一家备受赞誉的建筑模板厂家&#xff0c;那就是能强优品木业。作为一家专业的建筑模板供应商&#xff0c;他们以优质的产品和卓越的服务在业界享有…

JavaScript学习记录 | DOM事件流 事件冒泡-事件捕获-事件委托

目录 DOM事件流常见面试题事件冒泡与事件捕获事件冒泡使用场景事件捕获使用场景事件冒泡和事件捕获区别 事件委托 - 利用事件冒泡机制事件委托应用场景支持事件委托的事件事件委托的优缺点 DOM事件流 DOM事件流的三个阶段&#xff1a;捕获阶段 -> 目标阶段 -> 冒泡阶段 …

有什么好用的设备管理软件?智慧巡检对后勤运维有什么帮助?

定期巡检在设备管理、后勤管理和运维管理中扮演着不可或缺的角色&#xff0c;以及及时发现异常并控制风险。然而&#xff0c;传统巡检工作存在弊端。为了解决这些问题&#xff0c;“的修”报修系统对巡检管理功能进行了突破性的设计和开发。   “的修”报修巡检管理功能包含了…

如何撤销某个已经git add的文件以及如何撤销所有git add提交的文件?

如果你想撤销已经添加&#xff08;git add&#xff09;到暂存区的单个文件&#xff0c;可以使用 git reset 命令。以下是具体的命令格式&#xff1a; git reset <file>在这里&#xff0c;<file> 是你想要从暂存区中移除的文件名。比如&#xff0c;如果你想要撤销已…

蓝桥杯打卡Day11

文章目录 最长上升子序列最长上升子序列II 一、最长上升子序列IO链接 本题思路:本题是一关于dp问题中的一个类型是最长上升子序列问题&#xff0c;首先我们将状态表示出来&#xff1a;f[i]表示以a[i]结尾的最大的上升序列。状态计算&#xff08;集合划分&#xff09;&#xf…

MyBatis 中的插件可以拦截哪些操作

MyBatis 中的插件可以拦截哪些操作 MyBatis 是一个优秀的持久化框架&#xff0c;在实际项目开发中广泛应用。MyBatis 的插件机制可以方便地对 MyBatis 的各个环节进行扩展和定制。在本文中&#xff0c;我们将详细介绍 MyBatis 中的插件机制&#xff0c;并探讨插件可以拦截哪些…

尝试Redis发布-订阅模型

场景 我有程序&#xff0c;功能大概类似于一个程序进行生产数据&#xff0c;一个程序进行消费&#xff0c;起初我考虑到了各种MQ去解决这件事情&#xff0c;我们现有资源有Redis&#xff0c;引入MQ可能会导致资源&#xff0c;系统复杂性&#xff0c;实时性的一个问题&#xff…

Flink DataStream API

DataStream API是Flink的核心层API。一个Flink程序&#xff0c;其实就是对DataStream的各种转换。具体来说&#xff0c;代码基本上都由以下几部分构成&#xff1a; package com.atguigu.env;import org.apache.flink.api.common.JobExecutionResult; import org.apache.flink.a…