PHP反序列化-hellounser
First Post:
Last Update:
Word Count:
Read Time:
Last Update:
Word Count:
510
Read Time:
2 min
hellounser [DASCTF 2021 Sept]
Analyze
先上题
PHP - 43 lines
expand
1 |
|
稍加分析,在类B
中,函数show()
包含了flag.php
,而函数__toString()
调用了函数show()
,
__toString()
:类被当成字符串时的回应方法
而在类A
中,函数show()
会输出字符串var
,那么我们可以将var
定义为B
的对象,而类A
中的函数show()
又被函数__invoke()
调用
__invoke()
:调用函数的方式调用一个对象时的回应方法
POP链清晰了,那么现在就看看如何获取flag
,很显然,我们既不能满足preg_match('/^[a-z0-9]*$/isD', $this->func)
,又不能满足preg_match('...', $this->arg)
,前一个正则表达式限制了func
不能为纯字母或数字,i
为不区分大小写,s
为匹配任何不可见字符,包括空格、制表符、换页符…,等价于[fnrtv]
,D
为如果使用$
限制结尾字符,则不允许结尾有换行,而后一个则是普通的字符过滤。
在这里可以考虑使用函数create_function()
fcreate_function()
:会创造一个匿名函数 (lambda
样式),且会在内部调用函数eval()
进行代码注入:return(1);}???;//
随后进行简单的绕过即可
POC
PHP - 32 lines
expand
1 |
|
reward
Alipay


Wechat


v1.5.2