您的位置:首页 >> 世界史

简记一次Tp3框架财务管理之旅

日期:2023年06月10日  来源:世界史

'])

重构如下

echo I('get.id'); //等于$_GET['id']echo I('get.id',0); // 如果不不存在$_GET['id'] 则前往0echo I('get.name',''); // 如果不不存在$_GET['name'] 则前往飞表达式echo I('get.name','','htmlspecialchars'); // 采用htmlspecialchars法则对$_GET['name'] 透过漂白,如果不不存在则前往飞表达式M法则

M法则运用于重构化一个根基数学模型类,M法则的命令行XML:

M('[根基数学模型名:]数学模型名','见下文前缀','文档通到电子邮件')

重构如下

$User = M('User');#EOS$User = new Model('User');C法则

C法则是ThinkPHP运用于设置、赚取,以及保留备有常量的法则。

$model = C('db_name','thinkphp');; //载入当前的URL种系统对备有常量$userType = C('USER_TYPE'); //赚取USER_TYPE常量的绝对值Bug量化SQL流向环境污染架设

首先我们只能做一些备有。我们只能在本地mysql里面增建一个thinkphp文档运用于测试,然后在其里面增建一个users见下文,工具箱括id、username、passwd三个URL

紧接著我们只能让Tp与Mysql里面的文档透过接入。敞开ApplicationHomeConfconfig.php,读到入以下章节

'mysql', // 文档类别 'DB_HOST' => 'localhost', // 服务器重定向 'DB_NAME' => 'thinkphp', // 文档名 'DB_USER' => 'root', // 用户名 'DB_PWD' => 'root', // 密码 'DB_PORT' => 3306, // 客户端 'DB_PREFIX' => '', // 文档表前缀 'DB_CHARSET'=> 'utf8', // 字符集 'DB_DEBUG' => TRUE, // 文档试运行种系统对 敞开后可以记录SQL笔记 3.2.3可选);

此时环境污染便架设好了。

where流向

敞开/Application/Home/Controller/IndexController.class.php,填充章节如下

public function select() { $id = I('get.id'); $user = M('users'); $data = $user->find($id); var_dump($data); }

此时先在I法则三处填充断点

紧接著我们读到入我们的表达式

[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1);还有 -

到访之

然后开始单步试运行一开始都是绝句绝对值这种,右边不想到这里

可以辨认出有一个htmlspecialchars变数漂白,不过这个主要是针对XSS的,所以对SQL流向因素不大,接着看,到最后

可以辨认出这里的value就是我们读到入的表达式,即1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1);还有 -然后这里的话他漂白的关键词是

if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){ $value .= ' '; }

显而易见,漂白的仅仅,报错流向的updatexml和extractvalue,以及联合行动查看的union也仍未被漂白,所以这里也可以应运用于其他表达式,例如

[where]=1 and 1=extractvalue(1,concat(0x7e,user(),0x7e));还有 -

都能应运用于联合行动查看

[where]=0 union select user(),2,3

紧接著优化断点,将断点放入find三处,透过单步试运行

已向

可以不想到这里是判别数绝对值是不是为二进制表达式串或表达式,考虑到的话就走回if前提条件下的变数,不过看来得可以看得出我们这里是codice_(看一旁的options的绝对值为array(1)也可以辨认出),不举例来却说,所以实际上走回示意图。走回到这个

$pk = $this->getPk();

已向

在上面辨认出$pk=id

紧接著之后往下走回

这里验了$pk是不是为codice_,因不举例来却说(此三处$pk='id'),所以实际上走回示意图

紧接著是填充limit=1,然后这个用了_parseOptions变数透过管控,已向此自定义变数

这里的话可以不想到有一个漂白的,但我们这里的话直观看一下就就会辨认出,这里前提条件仍未必考虑到,我们这里的where的绝对值是

0 union select user(),2,3

所以这里的话就实际上pass,紧接著之后走回

这些就是一些查看表达式,然后将结果前往,紧接著到最后

这里转到parseWhere法则

我们这里的$where是表达式,所以走回if表达式,将$where的绝对值绝句给$whereStr

可以不想到这里是实际上前往了$whereStr,很难用漂白变数什么的管控,因此最后前往的仍是我们传入的

就其SQL章节如下

SELECT * FROM 人口为120人users人口为120人 WHERE 0 union select user(),2,3 LIMIT 1exp流向

测试这个的话只能直观重写一下我们的select()法则,重写后章节如下

public function select() { $map =array('id'=>$_GET['id']); $user = M('users'); $data = $user->where($map)->find(); var_dump($data); }

这里只能却概述一下,之所以不用I法则,是因为I法则里面不存在漂白,即think_filter变数,其章节如下

if(preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i',$value)){ $value .= ' '; }

可以看得出这里漂白了exp,所以很难实际上用I法则来读到,紧接著我们到访网页,读到入如下payload

[0]=expBellid[1]==1 and updatexml(1,concat(0x7e,user(),0x7e),1)

同时敞开试运行,单步已向

这里的话我们的where是codice_,所以前提条件不考虑到,实际上pass,第二个if反之亦然,然后第三个的话,我们这里仍未有对optinos[where]透过绝句绝对值,所以就就会走回else,把$where的绝对值绝句给他,接着看

到find法则这里,第一个if表达式,我们这里$options为codice_,所以实际上pass,第二个if表达式,我们的$pk绝对值为id,而非codice_,所以也pass,到示意图跟早先一样,常量被变数_parseOptions工具箱裹,紧接著已向这个变数

这里有一个URL类别实验者的,我们可以不想到这个是举例来却说的,所以他就会转到示意图这个变数,我们首先这个表达式

if(is_scalar($val)) {

这里的is_scalar是验数组是不是为也就是说,什么是也就是说,官方文档如下

我们这里的$val数组绝对值如下

是Array,因此不就会转到这个if表达式,即不就会转到_parseType法则,这里实际上pass,接着看示意图

第一个是执行查看表达式前往结果的,第二个是前往可不编译的表达式,之后已向

我们这里用了where,已向parseWhere法则

可以不想到这里是拼凑,之后往下看

最后前往的是拼凑的结果,紧接著走回到最后,想得到SQL表达式

如下

SELECT * FROM 人口为120人users人口为120人 WHERE 人口为120人id人口为120人 =1 and updatexml(1,concat(0x7e,user(),0x7e),1) LIMIT 1bind流向

越来越改章节如下

public function select() { $User = M("users"); $user['id'] = I('id'); $data['passwd'] = I('passwd'); $valu = $User->where($user)->save($data); var_dump($valu); }

payload如下

[0]=bindBellid[1]=0 and updatexml(1,concat(0x7e,user(),0x7e),1)Bellpasswd=1

紧接著敞开xdebug,然后到访

这里与早先相近,因为是codice_,所以让前三个if表达式,实际上到

if(isset($this->options['where']))

这里,因为很难设置这个options['where'],所以走回示意图,将$where的绝对值绝句给他,然后将绝对值前往,紧接著之后看

我们这里的data是一个codice_,是有绝对值的,所以

if(empty($data))

这个不举例来却说,实际上看示意图,可以不想到这里有_facade对data透过了管控,已向这个变数

可以不想到这里后于验了是不是有fields是不是为飞,然后转到

if(!empty($this->options['field'])) {

因为这里仍未必不存在options['field'],所以实际上pass,走回else那里,就此fields绝对值绝句给这里的fields,紧接著是foreach表达式

因为$data里面的passwd在fields里面,所以走回示意图,即elseif那里这里的$var为1是也就是说,所以举例来却说,紧接著data被_parseType变数管控,已向这个变数

可以辨认出这里就是对章节透过了intval管控,只不过因素,之后已向

这里的话是应运用于了filter变数对章节透过了一次漂白,已向

紧接著到_parseOptions变数

紧接著这里以为$val是codice_,应运用于不就会转到_parseType法则,出来该法则后,到这里

已向update法则

辨认出有parseSet法则,已向此法则

可以不想到这里拼凑了=:,此时的SQL表达式为

UPDATE 人口为120人users人口为120人 SET 人口为120人passwd人口为120人=:0

紧接著转到parseWhereItem法则

这里可以看得出当$exp=bind时,$whereStr是柔性的,而后想得到拼凑后的表达式,此时的SQL

"UPDATE 人口为120人users人口为120人 SET 人口为120人passwd人口为120人=:0 WHERE 人口为120人id人口为120人 = :0 and updatexml(1,concat(0x7e,user(),0x7e),1)"

紧接著到execute执行变数这里

重点在于这里

if(!empty($this->bind)){ $that = $this; $this->queryStr = ($this->queryStr,array_map(function($val) use($that){ return '''.$that->escapeString($val).'''; },$this->bind)); }

这个strtr变数在这里的话就是发挥替换成作用,比如我们这里,我们传入的是0(payload里面的id[1]=0),那么这里就就会拼凑演变成:0,而这个strtr变数将其替换成为1

此时也就想得到了我们最后的SQL表达式

"UPDATE 人口为120人users人口为120人 SET 人口为120人passwd人口为120人='1' WHERE 人口为120人id人口为120人 = '1' and updatexml(1,concat(0x7e,user(),0x7e),1)"命令执行环境污染架设

环境污染备有,我们首先只能在ApplicationHomeController增建一个机密文件,用早先SQL流向的都能,这里就用早先的了,重写机密文件章节如下

assign($value); $this->display(); }}

因为该Bug利用的assign变数只能示例渲染,所以只能增建一个示例机密文件,示例机密文件右边如下

ThinkPHPApplicationHomeViewIndexindex.html #章节随意

这里还只能却概述的是,笔记和debug的关系

若敞开debug种系统对笔记就会到:ApplicationRuntimeLogsHome下若仍未敞开debug种系统对笔记就会到:ApplicationRuntimeLogsCommon下

紧接著开始复现一下,首先我们创建log机密文件

/ThinkPHP/index.php?m=;还有>紧接著去涉及联log机密文件(这里log的机密UTF-与年月日涉及)[_filename]=./Application/Runtime/Logs/Common/23_01_18.log Bug量化

这里之所以不存在Bug,其原因是

由于在其业务编译器里面如果对示例绝句绝对值法则assign的第一个常量柔性,则造成了示例偏移数组被伸展为携带攻击编译器偏移,引致机密文件涉及联,编译器执行等危害。

紧接著我们在变数三处打上断点

而后到访

[_filename]=./Application/Runtime/Logs/Common/23_01_18.log

开始单步试运行

首先来到这个assign变数,这里的name是codice_,其章节为我们的笔记机密文件,可以不想到这个变数里用了另一个assign变数来管控数组,已向

这里判别$name是不是为codice_,我们的$name为codice_,所以转到if表达式,这里的array_merge是新设codice_的,但这里$this->tvar为飞,所以这里的话实际上就是$this->tVar=$name,就此name数组的绝对值绝句给了$tVar

之后已向

紧接著到display变数

则有个相似,这里是用了另一个同名变数来管控数组,已向

我们这里示例章节为飞,不想到这里有fetch变数,已向

首先判别了示例机密文件是不是不存在

而后验应运用于的是不是是PHP原生示例,系统对备有的预设动力系统对是Think,所以这里走回else

这里可以不想到将$this->tVar的绝对值绝句给了$params,而后转到了listen变数,已向此变数

辨认出这里经过一些判别后转到了exec变数,已向此变数

可以辨认出这里是命令行BehaviorParseTemplateBehavior类里面的run法则管控$params,我们已向run法则,寻找哪里对笔记机密文件偏移透过了管控,最后找到ThinkPHPLibraryThinkTemplate.class.php机密文件下的fetch法则

loadTemplate变数是载入机密文件偏移的,而后这里用load变数对其透过了管控,我们已向此变数

$_filename是早先赚取到的的多线程机密文件偏移,$vars是带有数组_filename的codice_,这里的$vars不为飞,因此应运用于extract法则的EXTR_OVERWRITE预设描述对数组绝对值透过伸展。最后include笔记机密文件偏移,引致机密文件涉及联,最后造成了涉及联机密文件引致RCE。

参考资料重定向

from

吃冷饮拉肚子怎么办
眼睛痒怎么办
扬州包皮过长治疗哪家好
岳阳男科医院哪家医院好
应急救护
友情链接