ThinkPHP3.2.3 find注入
2022-07-28 14:14:58
131
{{single.collect_count}}

find(),select(),delete()注入方法类似

主要是在解析完$options之后,还对$options['where']判断了一下是否为空

在 D:\phpstudy_pro\WWW\thinkphp3\Application\Home\Controller下的IndexController.class.php添加代码

在这里插入图片描述

一样的思路,首先用id=1 and走一遍流程

一直走,注意到这个地方,我们条件满足进入parseType函数

注意,这时候我们的data还是1 and

在这里插入图片描述

经过强制转换后我们变成了int类型

说明这样注入是行不通。我们来分析原因,M()->I()->find()

重点看

这儿$options已经变成数组,紧接着进入条件判断 不成立

往下走来到

进入函数

满足条件,然后来到parseType函数

由此可见,我们不进入parseType函数就可以不会被强转即我们不满足第一个条件(is_array$options[‘where’])即可

回过头来看find函数,里面有构造options的重要方法

在这里插入图片描述

如果传入的是id,那么$options就会变成一个二维数组,$options[where][id]才是字符串,$options[where]是一个数组

在这里插入图片描述

如果传入的是id[where],那么$options[where]就是一个字符串

那么我们就由此构造参数id[where]

在这里插入图片描述

明显,这样options[where]就是一个字符串了

如果这样构造参数也会带来一个问题,

data就会是一个数组,那么会进入think_filter函数的校验

但,正是上一个文章所说,这个函数没有过滤and updatexml

所以可以构造报错注入(还需看后面有没有限制)后面是无限制的

在这里插入图片描述

payload:

http://127.0.0.1/thinkphp3/index.php/home/index/getuserid?id[where]=1%20and%201=updatexml(1,concat(0x7e,(database()),0x7e),1)

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}