thinkphp的一些漏洞解析
2023-08-29 19:58:51

think5.1 反序列化

入口点
image.png
windows的__destruct –>removeFiles
image.png
file_exists可触发tostring,filename可控
image.png
payload这样写,触发Pivot的父类下修饰类Conversion的toString
image.png
进toJson
image.png进入toArray
image.png
往下看
image.png
别的不管,就这些玩意
首先$this->append不能为空,遍历其键值,并且值得是个array
进入getRelation
relation得为空才能进入if,所以我们要这里函数返回为空
image.png
传入的key为Aecous,使name不为空,判断$this->relation中是否存在name键,很显然也没有,所以直接返回
image.png
满足条件,进入getAttrimage.png
name为传入的key值Aecous进入getData
image.png
因name不为空,进入elseif判断this->data总是否存在name键,并返回其值,这里我们可以控制,编写poc
image.png
因存在,所以返回new Request类赋值给$value
image.png
回到getData,直接返回$value赋值给$relation
image.png
调用Request->visible,因不存在此方法进入魔术函数call,mothod为函数名,args为Reuqest类
image.png
通过控制$this-hook[$method],可以进行任意方法调用,进入isAjax
image.png
this->config[‘var_ajax’]也可以进行控制,进入param方法
image.png
进入input方法
image.png进入getData方法,name为$this->config[‘var_ajax’]的值,data为get的传参,从传参中获取参数为name所对应的值image.pngimage.png获取传的Aecous=whoami
image.png进入getFilter
image.png如果为空,则赋于this->filter的值,所以poc已形成
image.pngimage.png将filter赋值后转成数组,并加个新键,返回image.png
image.png
进入filterValue
image.png对filters进行遍历取值,value为whoami
call_user_func进行任意函数调用 system(‘whoami’)
分析结束

thinkphp5.0.23 rce

记得开app_debugimage.png
payload
image.png

ip/public/?s=captcha

_method=__construct&filter[]=system&method=get&get[]=calc

image.png
image.png
进入run,找到关键函数image.png进入routeCheck
image.png
进入Route::check
image.png进入$request->method()
image.png关键点
判断是否存在_method参数,进入if
image.png
image.png
一个任意函数调用,通过控制_method,进入__construct方法,post作为传参image.png
这里对post数组进行了遍历取出键值,检查当前类中是否存在该键,并且对该键进行赋值
image.png
这里会将 filter=[‘system’] method=”get” get=[“calc”]
回到App
image.png
进入$request->param
image.png
image.png对$this->param赋值,合并多个值,param为空数组,vars为空,进入get
return一个input函数,进入input,第一参数为get,是我们覆盖过的[“calc”]
image.png
image.png
因为name为false,所以直接返回[“calc”]
再看看route
image.png
也是一样,只不过传入的第一参数是$this->route
image.png
返回是空数组
所以最后$this->param为[“calc”]image.png
image.png
继续往下走,还是一个input,传入$this->param
image.png
进入input的getFilter
image.png因为filter为空,一个条件表达式,把this->filter赋给filter ,this->filter是我们之前覆盖的[“system”]
image.png
添加了个空键值,返回
image.png
通过array_walk_recursive调用$this->filterValue
image.png
从filter数组中遍历取值,call_user_func执行

thinkphp3 sql注入

image.png
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函数
image.png对传入的数据进行了判断,因options是数组,所以不进入if,这样options[‘where’]就不会变为数组
image.png进入_parseOptions函数
image.png
image.png
因options[‘where’]为字符串,所以不进入if,绕过了_parseType中的intval处理,最终返回
image.pngimage.png传入select函数中
image.png
进行参数绑定处理,最终的语句为
image.png
执行后返回结果
image.png

Prev
2023-08-29 19:58:51
Next