think5.1 反序列化
入口点
windows的__destruct –>removeFiles
file_exists可触发tostring,filename可控
payload这样写,触发Pivot的父类下修饰类Conversion的toString
进toJson
进入toArray
往下看
别的不管,就这些玩意
首先$this->append不能为空,遍历其键值,并且值得是个array
进入getRelation
relation得为空才能进入if,所以我们要这里函数返回为空
传入的key为Aecous,使name不为空,判断$this->relation中是否存在name键,很显然也没有,所以直接返回
满足条件,进入getAttr
name为传入的key值Aecous进入getData
因name不为空,进入elseif判断this->data总是否存在name键,并返回其值,这里我们可以控制,编写poc
因存在,所以返回new Request类赋值给$value
回到getData,直接返回$value赋值给$relation
调用Request->visible,因不存在此方法进入魔术函数call,mothod为函数名,args为Reuqest类
通过控制$this-hook[$method],可以进行任意方法调用,进入isAjax
this->config[‘var_ajax’]也可以进行控制,进入param方法
进入input方法
进入getData方法,name为$this->config[‘var_ajax’]的值,data为get的传参,从传参中获取参数为name所对应的值获取传的Aecous=whoami
进入getFilter
如果为空,则赋于this->filter的值,所以poc已形成
将filter赋值后转成数组,并加个新键,返回
进入filterValue
对filters进行遍历取值,value为whoami
call_user_func进行任意函数调用 system(‘whoami’)
分析结束
thinkphp5.0.23 rce
记得开app_debugimage.png
payload
ip/public/?s=captcha
_method=__construct&filter[]=system&method=get&get[]=calc
进入run,找到关键函数进入routeCheck
进入Route::check
进入$request->method()
关键点
判断是否存在_method参数,进入if
一个任意函数调用,通过控制_method,进入__construct方法,post作为传参
这里对post数组进行了遍历取出键值,检查当前类中是否存在该键,并且对该键进行赋值
这里会将 filter=[‘system’] method=”get” get=[“calc”]
回到App
进入$request->param
对$this->param赋值,合并多个值,param为空数组,vars为空,进入get
return一个input函数,进入input,第一参数为get,是我们覆盖过的[“calc”]
因为name为false,所以直接返回[“calc”]
再看看route
也是一样,只不过传入的第一参数是$this->route
返回是空数组
所以最后$this->param为[“calc”]
继续往下走,还是一个input,传入$this->param
进入input的getFilter
因为filter为空,一个条件表达式,把this->filter赋给filter ,this->filter是我们之前覆盖的[“system”]
添加了个空键值,返回
通过array_walk_recursive调用$this->filterValue
从filter数组中遍历取值,call_user_func执行
thinkphp3 sql注入
https://www.anquanke.com/post/id/250537#h2-1
使用find函数进行注入
https://static.kancloud.cn/manual/thinkphp/1715
在index.php通过参数s直接访问sql路由,也可以像上面那样访问
?s=/Home/index/sql&id=sql注入payload
进入find函数
对传入的数据进行了判断,因options是数组,所以不进入if,这样options[‘where’]就不会变为数组
进入_parseOptions函数
因options[‘where’]为字符串,所以不进入if,绕过了_parseType中的intval处理,最终返回
传入select函数中
进行参数绑定处理,最终的语句为
执行后返回结果