一 ·漏洞原理:
可以让攻击者直接向后台服务器直接注入操作命令或者代码,从而实现控制后台系统。
常见的系统命令执行函数:
system():能将字符串作为OS命令执行,且返回命令执行结果。对某些指令进行执行的函数,比如:ls、cat、whoami、ifconfig等指令;
exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显);
shell_exec():能将字符串作为OS命令执行与``作用相同,但无回显,需要echo或其他的输出函数使得其回显;
反引号中的字符会被解析成OS命令
常见的代码执行函数:
eval():将字符串作为php代码执行;
assert():将字符串作为php代码执行;
preg_replace():正则匹配替换字符串;
create_function():主要创建匿名函数;
call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数;
call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数参数的数组;
二·RCE绕过
管道符
管道符 | 实例 | 描述 |
; | A;B | 无论真假,A与B都执行 |
& | A&B | 无论真假,A与B都执行 |
&& | A&&B | A为真时才执行B,否则只执行A |
| | A|B | 显示B的执行结果 |
|| | A||B | A为假时才执行B,否则只执行A |
cat替换命令
more:一页一页输出 | less | cat | tac:是cat的反向显示 |
head:查看头几行 | tail:查看尾几行 | vi | vim |
nl:显示时同时输出行号 | od:二进制方式查看 | sort | uniq |
空格过滤
以下可代替空格 | ||
< | <> | %20(即space) |
%09(即tab) | $IFS$9 | ${IFS} |
$IFS | {cat,/flag} |
无回显RCE
//无回显RCE,如exce()函数,可将执行结果输出到文件再访问文件执行以下命令后访问1.txt
- 1. ls / | tee 1.txt
- cat /flag | tee 2.txt
- //eval()无输出
- eval(print`c\at /flag`;)
无参数RCE
无参数RCE通常发生在应用程序未能正确验证用户输入的情况下,当攻击者利用精心构造的数据输入触发了意外的执行代码路径。 利用getallheaders()、get_defined_vars()、session_id等;
正则绕过
1.取反绕过
符号“~”可以将URL编码取反,并且PHP函数中的urlencode可以将字符进行编码,所以我们可以先用命令将其取反,随后使用~再次取反从而实现绕过。以下是php脚本:
<?php
$a = "system";
$b = "('cat /flag')";
echo urlencode(~$a);
print("\n");
echo urlencode(~$b);
2.异或绕过
在PHP中,对两个字符串进行异或操作,结果仍然是一个字符串。如果正则表达式过滤掉了所有的字母和数字,可以通过选择两个非字母数字的字符进行异或操作,得到任意想要的字母或数字。比如如果想要得到字母a
,可以找到两个非字母数字的字符,它们的异或结果为a
。在ASCII表中,a
的十进制值是97,二进制是01100001
。可以选择两个字符,比如@
和!
,它们的ASCII值分别是64和33,二进制分别是01000000
和00100001
。按照异或规则,这两个字符异或的结果正好是a。
黑名单绕过
关于黑名单绕过,这是一种网络安全领域中常见的攻击手段,用于规避服务器上设置的文件上传限制。通常,服务器会设定一个黑名单,列出不允许上传的文件类型,以防止恶意文件的上传。然而,攻击者可能会尝试使用各种技术来绕过这些限制。
1.0X0截断:0x开头表示16进制,0在十六进制中是00, 0x00就是%00解码成的16进制。在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
2.双写绕过:攻击者可能会尝试上传文件名中包含重复后缀的文件,例如shell.pphphp
,利用服务器处理文件名时的漏洞来绕过黑名单。
3.大小写绕过:由于某些服务器对文件名的大小写不敏感,攻击者可能会尝试通过改变文件后缀的大小写来绕过黑名单,例如使用.PhP
代替.php。