lovemath
本文最后更新于:2025年10月19日 下午
这个题似乎好久以前做过,但是这次又忘了这茬,还是记录一下吧
1 | |
代码没啥分析的,就是给了个白名单,只有白名单的函数能使用,然后会过滤一些字符
这里就要提到一个点了,36进制实际上就是0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,也就是说可以通过36进制获得任意字母
1 | |

但是此时还是没法执行cat /flag,需要想办法绕过一下
这里利用hex2bin获取任意ascii
1 | |
按道理说应该是可以执行了,但是好像太长了

比较常规的思路是通过$_GET[]传参,但是[]被过滤了,php中的数组也可以用{}来访问,仅限于低版本。
PHP7.4不再能够使用花括号来访问数组或者字符串的偏移.需要将{}修改成[]
1 | |
上面的payload可以获得_GET
如果构造完整的payload还是超长了,可以把以上payload存入变量,然后复用两次变量,一个作为system,一个作为参数。
1 | |
这里get的参数值直接用了int,可以不用管引号,经过测试是可行的

因为复用了一次get,所以长度也没有超标,至此完成完美getshell,执行cat /flag获得flag
其实还是走了一段弯路,可以构造getallheader来得到请求头,利用请求头传参来实现rce
1 | |
lovemath
http://gensokyo.cn/2022/11/02/lovemath/