在BMZCTF中,有一道题是shell_exec,在尝试做了该题后,又翻看了现有的write-up,发现现有的write-up语焉不详,对于不原理和微操讲解不细,因此写了这篇文章,主要是在前人的基础上对此题进行进一步描述,主要针对刚接触此领域的小白用户,希望能够对他们理解这道题提供帮助。
首先,打开本题,可以看到如下界面:

进行测试,发现输入一个IP地址或者域名后,可以PING测试对应的IP,然后把结果反馈到界面上来。
之后,查看页面源代码(不要问我为什么要查看页面源代码,做CTF题查看页面源代码应该是本能的反应),可以发现如下提示:

可以看出,题目将以POST的形式上传名为IP的变量,并且将其作为目标地址,把PING测试的结果显现出来。因此,可以断定,这道题是一道命令执行相关的题目。
在这里,有些人不明白2>&1的作用,查询后,得到的标准答案是将标准错误重定向到标准输出,为了保证小白们可以理解这句话,在这里我稍微解释一下。
在Linux中,一条命令可以被正常运行,也有可能出错(出错的原因可能是尝试打开不存在的文件、给定的参数错误等,在这里即PING后面的host错误)。在命令行模式下,命令正常运行时会给予一个输出,出错时会给予一个反馈,表面上看上去都会显示一些信息,但是在本质上,正常运行时输出的是正常运行时的结果,而程序错误时输出的是错误提示。这就好像在写C语言程序时,正常的C程序会显示正常的运行结果,但是错误的C程序会报错一样。将标准错误重定向到标准输出,意思就是如果程序出错,那么将出错信息作为程序正常运行时的输出处理。2>&1这条附加命令,在命令行情况下加与不加不会有明显的区别,但是本质上,就是这条语句是否被正确执行的根本性区别。
回到这道题,既然是在命令执行上做文章,首先想到的就是构造特殊形式的payload,把自己想要执行的命令附加在id参数中,然后执行命令,拿到flag。
最简单的命令拼接的方式是管道符(&&,||等)、分号(;)但是经过实验,都被后台的WAF拦截,经过实验发现,反引号(``)和$()的方式可以使得我们的命令正常执行而不被拦截。

反引号和$(),本质上都属于命令嵌套,本意是Linux为了执行嵌套式的命令而设计的一种命令模式,比如我如果想echo whoami指令执行后的结果,在Linux中直接执行:

echo whoami

是不可以的!
但是,我们可以这样:

echo `whoami`

或者是:

echo $(whoami)

Linux系统就会先执行whoami命令,然后将其执行后的结果显示出来。
因此,在这里我们可以利用命令嵌套,来执行我们想要的代码,只需要用反引号或者是$符号把我们想要执行的命令作为嵌套命令即可。

明确了如何嵌套我们的想要执行的命令,经过实验发现题目还设置了防火墙,对特定的格式进行了过滤,比如“cat”、“flag”以及空格等,这里,针对这些过滤,我们可以通过替代的方式绕过,比如说经过实验,可以使用${IFS}替换空格,可以使用head替换cat,也可以使用%9插在字符串中间,起到防范的作用,这样,我们精心构造的payload就可以拿到flag了!
最后,我把我拿到flag的payload公布一下:

ip=www.baidu.come.$(ec$9ho$IFS$9s$9h$IFS$9d.txt$IFS$9|s$9h$IFS$9>f.txt)


执行成功后,访问f.txt,就可以看到flag了!!!

关于BMZCTF中 shell_exec的解法详解相关推荐

  1. html5代码转换为视频,HTML5中的视频代码详解

    摘要 腾兴网为您分享:HTML5中的视频代码详解,智学网,云闪付,易推广,小红书等软件知识,以及360win10,流量魔盒,fitbit,上港商城,安卓2.3.7,全民惠,五年级下册英语单词表图片,t ...

  2. VMware虚拟机文件夹中各文件作用详解

    VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...

  3. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  4. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  5. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  6. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  7. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  8. java中的进制输出转换_Java I/O : Java中的进制详解

    作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...

  9. PHP开发中常见的安全问题详解和解决方法

    PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...

  10. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

最新文章

  1. idea 批量修改同一列_学会这个,1秒就可以批量处理文件
  2. Leetcode 113. 路径总和 II 解题思路及C++实现
  3. 最简单的方式实现一棵二叉树
  4. django链接mysql网页显示数据_使用Django连接mysql数据库并显示在网页上
  5. C++---string类接口整理与深浅拷贝
  6. 计算机教育杂志社投稿送样刊,电脑校园杂志征稿论文发表--期刊发表网网
  7. 【Go】使用压缩文件优化io (二)
  8. 系统补丁不适用计算机,无法安装IE11 安装补丁“此更新不适用于你的计算机”解决办法...
  9. 迪普交换机恢复出厂设置_LSW交换机初始化配置指导
  10. c语言 输入英文 字符串,C语言编程:从键盘中输入一个英文字符串
  11. Ink脚本语言学习笔记(一)
  12. android系统开机默认设置修改记录
  13. 计算机图形驱动程序原理,您知道更新计算机图形驱动程序的作用吗?怎么做
  14. java计算器课程报告_java计算器课程设计报告
  15. 为什么说Vue是单页面应用呢?
  16. LAMP配置DISCUS
  17. Google收购Moto:天使还是魔鬼?
  18. 【20】WAV格式歌曲
  19. 如何在hexo上创建一篇文章
  20. 怎样手动开立方?(开立方术)

热门文章

  1. PyTorch学习—12.损失函数
  2. numpy—np.logspace
  3. 类加载与 Java主类加载机制解析
  4. IT项目管理之系统设计
  5. DEP机制的保护原理
  6. HTML - 元素/标签和属性基础
  7. 深度学习:卷积神经网络CNN
  8. fiddler实现将http请求的js转为本地的js文件
  9. c语言如何在手机上运行程序,各位前辈这两个程序怎么在手机上运行
  10. python入门程序例子_Python 爬虫从入门到放弃(11 个有趣的 Python 爬虫例子)