lovemath
本文最后更新于:2024年12月14日 下午
这个题似乎好久以前做过,但是这次又忘了这茬,还是记录一下吧
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/