当前位置: 首页 > news >正文

[BUUCTF 2018]Online Tool(特详解)

这段代码块检查请求中是否设置了HTTP_X_FORWARDED_FOR头部。如果设置了,它将REMOTE_ADDR设置为HTTP_X_FORWARDED_FOR的值。这通常用于处理Web服务器位于代理后面的情况。

  • 如果URL中未设置host参数,它使用highlight_file(__FILE__);来显示PHP文件的源代码。

  • $host 字符串传递给 escapeshellarg 后,它会在字符串周围添加单引号,并对一些特殊字符进行转义,以防止它们被解释为特殊命令。

  • escapeshellcmd 函数用于转义字符串,并删除任何特殊字符,使其安全用作单个命令。

  • 如果设置了host参数,它获取该值,使用escapeshellargescapeshellcmd进行一些净化,创建基于客户端IP地址的唯一沙盒目录,然后在该沙盒内对指定的主机执行nmap命令。

注意:使用escapeshellargescapeshellcmd表明试图防止命令注入漏洞

chdir($sandbox);
  • chdir 函数用于改变当前的工作目录(Current Working Directory,CWD)为指定的目录。

  • 在这里,$sandbox 是之前根据用户IP地址创建的沙盒目录的名称(通过 md5("glzjin" . $_SERVER['REMOTE_ADDR']) 计算得到的)。

  • 这意味着 PHP 脚本的当前工作目录将被更改为用户特定的沙盒目录,后续的文件和命令将在这个目录下执行。

1,首先判断客户端提供给服务器和服务器自动获取的ip是否一致。 2,判断get host参数时候传值,没有传值高亮当前代码。 3,传值,host传递参数经过escapeshellarg,escapeshellcmd函数的限制。 4,以’glzjin’+ip通过md5加密形成值,并作为文件名创建文件,当前文件地址更改为创建的文件 5,输出 system执行结果。

通过其他师傅明白了点,原文PHP escapeshellarg()+escapeshellcmd() 之殇 (seebug.org)

1. 传入的参数是:`172.17.0.2' -v -d a=1`
2. 经过`escapeshellarg`处理后变成了`'172.17.0.2'\'' -v -d a=1'`,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
3. 经过`escapeshellcmd`处理后变成`'172.17.0.2'\\'' -v -d a=1\'`,这是因为`escapeshellcmd`对`\`以及最后那个**不配对儿**的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
4. 最后执行的命令是`curl '172.17.0.2'\\'' -v -d a=1\'`,由于中间的`\\`被解释为`\`而不再是转义字符,所以后面的`'`没有被转义,与再后面的`'`配对儿成了一个空白连接符。所以可以简化为`curl 172.17.0.2\ -v -d a=1'`,即向`172.17.0.2\`发起请求,POST 数据为`a=1'`。

但是经过上面的函数处理后变成了一个被单引号包围的字符串,不会当命令去执行,这里我们需要闭合一个单引号。

nmap有一个参数-oG可以实现将命令和结果写到文件

所以我们可以控制自己的输入写入文件,这里我们可以写入一句话木马链接,也可以直接命令 cat flag

flag

?host=' <?php echo `cat /flag`;?> -oG test.php '

这里注意用反引号cat /flag

image-20240128191921643

然后直接读取

image-20240128191936477

其实这里我是不太懂的,因为查資料escapeshellcmd会

反斜线(\)会在以下字符之前插入: *&#;`|*?~<>^()[]{}$*, \x0A\xFF'" 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 %! 字符都会被空格代替。

那么运行结果会是这样的

\<\?php echo \`cat /flag\`\;\?\> -oG test.php

image-20240128190320445

这个在php文件怎么执行呢?

然后

nmap -T5 -sT -Pn --host-timeout 2 -F  \<\?php echo \`cat /flag\`\;\?\> -oG test.php 

image-20240128191343217

在 Linux 中,反斜杠(\)是转义字符,用于改变后面字符的原始意义。它告诉解释器后面的字符应该被特殊对待,而不是按照其原始含义解释。\\ 表示一个反斜杠字符。

就目前来看可以看到\都没有了只剩下了<?php echo `cat /flag`;?>

那一切都合理了\在linux中其实相当于无实义连接符

相关文章:

  • Python笔记14-实战小游戏飞机大战(上)
  • 【大数据】Flink SQL 语法篇(一):CREATE
  • 系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。
  • 设计模式:简单工厂模式
  • 力扣72. 编辑距离
  • 系统架构设计师-22年-论文题目
  • 【Redis】list以及他的应用场景
  • PDF标准详解(一)——PDF文档结构
  • vue中,使用file-saver导出文件,下载Excel文件、下载图片、下载文本
  • C# 命名管道NamedPipeServerStream使用
  • Spring依赖注入
  • 响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-3 getBoundingClientRect()
  • 【基础算法练习】单调队列与单调栈模板
  • LabVIEW扫频阻抗测试系统
  • 回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测(含优化前后预测可视化)
  • [Vue CLI 3] 配置解析之 css.extract
  • 5、React组件事件详解
  • Apache的80端口被占用以及访问时报错403
  • canvas绘制圆角头像
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • iOS小技巧之UIImagePickerController实现头像选择
  • mongodb--安装和初步使用教程
  • rc-form之最单纯情况
  • 百度地图API标注+时间轴组件
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 嵌入式文件系统
  • 为视图添加丝滑的水波纹
  • 小程序开发中的那些坑
  • 写代码的正确姿势
  • 学习笔记:对象,原型和继承(1)
  • Java数据解析之JSON
  • 积累各种好的链接
  • ​​​​​​​​​​​​​​Γ函数
  • ​虚拟化系列介绍(十)
  • #pragma once
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)http-server应用
  • (转)jQuery 基础
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)母版页和相对路径
  • ******之网络***——物理***
  • .NET CF命令行调试器MDbg入门(一)
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @angular/cli项目构建--Dynamic.Form
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @NoArgsConstructor和@AllArgsConstructor,@Builder