jjzjj

[BUUCTF 2018]Online Tool

glan想睡觉 2024-07-20 原文

打开题目就是源码,审一下。 

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

if(!isset($_GET['host'])) {
    highlight_file(__FILE__);
} else {
    $host = $_GET['host'];
    $host = escapeshellarg($host);
    $host = escapeshellcmd($host);
    $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
    echo 'you are in sandbox '.$sandbox;
    @mkdir($sandbox);
    chdir($sandbox);
    echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}

知识点:

escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数

功能 :escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,shell 函数包含 exec(), system() 执行运算符(反引号)

定义 :string escapeshellarg ( string $arg )

escapeshellcmd — shell 元字符转义

功能:escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。

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

定义 :string escapeshellcmd ( string $command)

摘取自谈谈escapeshellarg参数绕过和注入的问题

我们详细分析一下:

  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'

回到mail中,我们的 payload 最终在执行时变成了'-fa'\\''\( -OQueueDirectory=/tmp -X/var/www/html/test.php \)@a.com\',分割后就是-fa\(-OQueueDirectory=/tmp-X/var/www/html/test.php)@a.com',最终的参数就是这样被注入的。

 

摘取自PHP escapeshellarg()+escapeshellcmd() 之殇

回到题目

构造payload,参考

[BUUCTF 2018]Online Tool(超详细解析payload)

  • namp <?php phpinfo(); ?> -oG 1.php
    可以写入一个文件
  • namp nmap <?php phpinfo();> -oG 1.php\’
    会写成1.php‘ 而不是 1.php

参考自[BUUCTF 2018]Online Tool

总体思路总结:

1.利用两个函数共同调用产生的漏洞进行命令执行。

2.通过nmap的参数写入webshell

3.连shell搞定。

有关[BUUCTF 2018]Online Tool的更多相关文章

  1. 2018年安徽省机器人大赛单片机与嵌入式系统应用技能竞赛试题(1) - 2

    目录一、试题描述1、任务2、基本功能要求3、发挥要求4、说明二、开发板介绍 三、所用器件:1一个超声波测距传感器2eeprom3电位器44*4矩阵键盘5蜂鸣器6led灯7步进电机8RTC实时时钟9所用芯片 四、主要思路一、试题描述1、任务        设计并制作汽车倒车防撞报警器。开机后,屏幕第一行显示“DCFZBJQ”,第二行显示“抽签号后4位”(如0207),并自下而上滚动,3秒后停止滚动。画出系统各组件连接图,并简要说明,画出键盘图并标注各键功能。画出全部程序流程图。2、基本功能要求        (1)应用超声波传感器实现距离采集,并在12864点阵屏上显示。利用实验桌面到房顶距离(

  2. [BUUCTF 2018]Online Tool - 2

    打开题目就是源码,审一下。 知识点:escapeshellarg —把字符串转码为可以在shell命令里使用的参数功能 :escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,shell函数包含exec(),system()执行运算符(反引号)定义 :stringescapeshellarg(string$arg)escapeshellcmd —shell元字符转义功能:escapeshellcmd() 对字符串中可能会欺骗shell命令执行任意命令的字符进行转义。此函数保证用户输入的数据在传送到 ex

  3. javascript - 2018 年如何在 AWS Lambda 中访问 header - 2

    是的,我知道这是重复的,但是自提供映射模板解决方案以来情况发生了变化here,here和here被设计出来。使用代理集成(AWS推荐的方法),无法访问模板。那么现在如何访问标题?我试过将对象模型用于以下内容:event.headersevent.headers["X-Requested-With"]varheaderItem="x-requested-with"event.headers.headerItem等似乎没有任何定义。根据Cloudwatch的说法,该事件是:{"resource":"/contactformlambda","path":"/contactformlambda

  4. go - 在 golang 中获取日期,例如 "2018-07-13" - 2

    这个问题在这里已经有了答案:convertYYYYMMDDstringtoavaliddateinGo(2个答案)关闭4年前。如何像这样在golang中获取日期formate"2018-07-13"main.go文件packagemainimport("fmt""time")funcmain(){fmt.Println(time.Now())}$gorunmain.go输出:2018-07-1321:25:16.796379489+0500+05m=+0.000120455如何编写函数以像这样的格式“2018-07-13”在字符串中返回日期?

  5. go - 如何解析这个日期2018-10-22T2250? - 2

    如何在golang中解析这个奇怪的日期时间2018-10-22T2250?我找不到日期布局 最佳答案 您可以创建自己的自定义格式。在生产中,您还应该处理错误。packagemainimport("fmt""time")funcmain(){timeString:="2018-10-22T2250"timeFormat:="2006-01-02T1504"t,_:=time.Parse(timeFormat,timeString)fmt.Println(t)}Playgroundlink这将返回UTC时间。您可能需要调整到另一个时区,

  6. windows - 2018年4月更新后,如何在Windows 10上将 “default App”的文件扩展名设置为 “.exe” - 2

    我花了很长时间研究这个。大多数解决方案发布于2018年4月之前,涉及通过“设置”逐步进入“按文件类型选择默认应用”的方法。ChoosedefaultAppsbyfiletype在先前尝试将应用程序分配给“.rex”的过程中,我设法将其分配给记事本。(当时,我找不到在C:驱动器上找到“.exe”的任何方法。)如您所见,如果单击.rex扩展名旁边的记事本,则唯一的选择是转到“应用程序商店”。和预期的一样,如果您单击AppStore,将找不到任何内容...Appstore-noapp'sfound.因此,从我在2018年4月之前在多个论坛上阅读的内容来看,Windows10仍然可以通过“浏览

  7. windows - 发布管理客户端与 tfs 2018 的兼容性 - 2

    有人可以告诉发布管理(客户端/服务器模型)胖客户端是否与TFS2018兼容我们正在使用Releasemanagement2015富客户端和tfs2015并计划升级到TFS2018,并想检查这是否兼容 最佳答案 ReleaseManagementServer已弃用。自TFS2015以来,它没有收到更新,以后也不会收到更新。自TFS2015更新2以来,发布管理功能已集成到TeamFoundationServer(TFS)和VSTS的构建和发布中心中。较新的基于Web的版本是服务器和客户端版本的推荐替代方案。简而言之,是的,您仍然可以将R

  8. windows - Spectre 性能打击在 2018 年 4 月更新后消失了吗? - 2

    几个月来,我们一直在跟踪Windows上的Meltdown和Spectre缓解措施的性能问题。几天前,我们发现了一些奇怪的结果。在我们的Windows10FCU机器上应用2018年4月累积更新(KB4093112)后,突然之间,我们观察到的性能影响消失了,我们运行的所有基准测试都回到了未应用缓解措施时的相同水平。例如,下面是CrystalMark2004R3报告的GDI性能数字(我们运行了多个基准测试以及我们自己的应用程序基准测试,所有这些都使性能数字回到了Meltdown/Spectre之前的水平)Win10FCUVanilla(noMeltdown/Spectremitigatio

  9. 时间:2018-01-08 标签:c#winforms: determine first run of program - 2

    我需要显示一次向导,这是我的Windows窗体应用程序在安装后第一次运行时。我想我可以使用像firstrun=false这样的用户设置。但是我还需要处理卸载程序然后重新安装的情况。该用户设置将如何重置?它已经存在于该用户的...\Users--user--\AppData\Roaming...的配置文件中。我需要在重新安装后运行该向导,因此我需要重置该设置。我是否需要使用自定义安装程序操作来执行此操作? 最佳答案 最好让您的安装程序在注册表中创建FirstRun键并将其设置为true(或1或其他),并确保您的卸载程序完全删除该键。然

  10. 时间:2018-01-08 标签:c#linq: how to retrieve a single result - 2

    对linq有点陌生,使用linq检索单个结果的最简单方法是什么?例子,我的查询varquery=fromcindb.productInfowherec.flavor=="ClassicCoke"&&c.container=="Can"selectc.co2Target;它应该只返回一个具有double值的字段。我如何将其从查询中拉出来?过去我使用过ExecuteScalar。我如何用linq做到这一点?我想保留它的数据类型更新:这就是我现在的位置。问题是我在这里运行的测试查询返回4而不是3.75varquery=(fromaindb.LUT_ProductInfoswherea.fla

随机推荐