应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

简记一次Tp3框架审计之旅

  前言
  MVC框架是代码审计必需学习的知识,这里以TpV3。2。3框架为例,进行一次对MVC框架代码的漏洞审计,简单学一下MVC的相关知识,希望对正在学习MVC框架的师傅有所帮助。框架
  我们这里首先需要了解一下什么是MVC架构,M:Model(模型),其负责业务数据的处理和与数据库的交互V:View(视图),提供了展示数据的各种方式C:Controller(控制器),负责用户请求的调度和处理业务逻辑
  具体如下图
  如果想对MVC框架进行进一步了解,可以参考https:www。kancloud。cnmanualthinkphp1698
  接下来我们需要了解一下ThinkPHP框架。TP3
  如果想了解Tp3常见的操作,可以看一下这篇文章
  https:blog。csdn。netspc007spcarticledetails103489711目录文件
  Tp3的目录如下所示
  wwwWEB部署目录(或者子目录)
  index。php入口文件
  README。mdREADME文件
  Application应用目录
  Public资源文件目录
  ThinkPHP框架目录
  通俗的说的话,这里的index。php就是提供一个对外的接口,Public就是存放一些公共资源的地方,ThinkPHP是我们的核心框架,其内容如下:
  ThinkPHP框架系统目录(可以部署在非web目录下面)
  Common核心公共函数目录
  Conf核心配置目录
  Lang核心语言包目录
  Library框架类库目录
  Think核心Think类库包目录
  Behavior行为类库目录
  OrgOrg类库包目录
  Vendor第三方类库目录
  。。。更多类库目录
  Mode框架应用模式目录
  Tpl系统模板目录
  LICENSE。txt框架授权协议文件
  logo。png框架LOGO文件
  README。txt框架README文件
  ThinkPHP。php框架入口文件路由格式
  Tp3提供了多种路由格式,这里的话对其进行简单介绍。pathinfo模式
  pathinfo模式,是ThinkPHP的默认模式,其规范格式如下:http:网址index。php模块控制器操作方法参数参数值
  示例如下http:127。0。0。1:8080index。phpHomeIndexindexid2
  它的优点显而易见,简化了URL地址。普通模式
  普通模式的规范格式如下http:网址index。php?m模块名称c控制器a方法参数参数值
  示例如下http:127。0。0。1:8080index。php?mHomecindexaindexid1
  兼容模式
  兼容模式的规范格式如下http:网址index。php?s模块名称控制器方法参数参数值
  示例如下http:127。0。0。1:8080index。php?sHomeindexindexid33
  rewrite模式
  这个的话首先需要说一下配置,这个想要使用首先需要Apache开启rewrite拓展,我这里的环境是phpstudy集成环境,具体操作如下。
  首先打开phpStudyPHPTutorialApacheconfhttpd。conf文件,搜索rewritemodule将其前面的删去
  而后去TP的根目录,写一个。htaccess文件,内容如下IfModulemodrewrite。cRewriteEngineonRewriteCond{REQUESTFILENAME}!dRewriteCond{REQUESTFILENAME}!fRewriteRule(。)index。php?s1〔QSA,PT,L〕IfModule
  接下来重启phpstudy
  此时就配置好了。(如若是linux环境,可参考此文https:blog。csdn。netzhazhajiarticledetails80493513)
  rewrite的规范格式如下http:网址模块控制器操作方法参数参数值
  其实相比于默认模式就是少了个入口文件,看着更简洁了一些。
  示例如下http:127。0。0。1:8080Homeindexindexid2
  特殊方法
  ThinkPHP将一些经常使用的方法进行了封装,也就是我们这里的特殊方法,其目的在于使程序更加安全。
  接下来对几个相对较常用的方法进行简单介绍。
  如果想进行仔细了解,可以访问如下链接
  https:www。cnblogs。comkenshinobiyp9165662。html
  https:www。thinkphp。cninfotagI方法
  I方法是ThinkPHP用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:I(变量类型。变量名修饰符,〔默认值〕,〔过滤方法或正则〕,〔额外数据源〕)
  示例如下echoI(get。id);等同于GET〔id〕echoI(get。id,0);如果不存在GET〔id〕则返回0echoI(get。name,);如果不存在GET〔name〕则返回空字符串echoI(get。name,,htmlspecialchars);采用htmlspecialchars方法对GET〔name〕进行过滤,如果不存在则返回空字符串M方法
  M方法用于实例化一个基础模型类,M方法的调用格式:M(〔基础模型名:〕模型名,数据表前缀,数据库连接信息)
  示例如下UserM(User);等效于UsernewModel(User);C方法
  C方法是ThinkPHP用于设置、获取,以及保存配置参数的方法。modelC(dbname,thinkphp);;读取当前的URL模式配置参数userTypeC(USERTYPE);获取USERTYPE参数的值漏洞分析SQL注入环境搭建
  首先我们需要做一些配置。
  我们需要在本地Mysql中新建一个thinkphp数据库用于测试,然后在其中新建一个users数据表,包括id、username、passwd三个字段
  接下来我们需要让Tp与Mysql中的数据库进行对接。
  打开ApplicationHomeConfconfig。php,写入以下内容lt;?phpreturnarray(DBTYPEmysql,数据库类型DBHOSTlocalhost,服务器地址DBNAMEthinkphp,数据库名DBUSERroot,用户名DBPWDroot,密码DBPORT3306,端口DBPREFIX,数据库表前缀DBCHARSETutf8,字符集DBDEBUGTRUE,数据库调试模式开启后可以记录SQLahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a3。2。3新增);
  此时环境便搭建好了。where注入
  打开ApplicationHomeControllerIndexController。class。php,添加内容如下publicfunctionselect(){idI(get。id);userM(users);datauserfind(id);vardump(data);}
  此时先在I方法处添加断点
  接下来我们写入我们的语句http:127。0。0。1:8080index。phphomeindexselect?id〔where〕1and1updatexml(1,concat(0x7e,user(),0x7e),1)
  访问之
  然后开始单步调试
  一开始都是赋值这种,后面看到这里
  可以发现有一个htmlspecialchars函数过滤,不过这个主要是针对XSS的,所以对SQL注入影响不大,接着看,到最后
  可以发现这里的value就是我们写入的语句,即1and1updatexml(1,concat(0x7e,user(),0x7e),1)
  然后这里的话他过滤的关键词是if(pregmatch((EXPNEQGTEGTLTELTORXORLIKENOTLIKENOTBETWEENNOTBETWEENBETWEENNOTINNOTININ)i,value)){value。;}
  显而易见,过滤的很少,报错注入的updatexml和extractvalue,以及联合查询的union也未被过滤,所以这里也可以使用其他语句,例如http:127。0。0。1:8080index。phphomeindexselect?id〔where〕1and1extractvalue(1,concat(0x7e,user(),0x7e))
  亦可使用联合查询http:127。0。0。1:8080index。phphomeindexselect?id〔where〕0unionselectuser(),2,3
  接下来调整断点,将断点放在find处,进行单步调试
  跟进
  可以看到这里是判断数值是否为数字字符串串或字符串,满足的话就走if条件下的函数,不过看明显可以看出我们这里是数组(看旁边的options的值为array(1)也可以发现),不满足条件,所以直接走下面。
  走到这个pkthisgetPk();
  跟进
  在上面发现pkid
  接下来继续往下走
  这里检验了pk是否为数组,因不满足条件(此处pkid),所以直接走下面
  接下来是添加limit1,然后这个用了parseOptions函数进行处理,跟进此自定义函数
  这里的话可以看到有一个过滤的,但我们这里的话简单看一下就会发现,这里条件并不满足,我们这里的where的值是0unionselectuser(),2,3
  所以这里的话就直接pass,接下来继续走
  这些就是一些查询语句,然后将结果返回,接下来到最后
  这里进入parseWhere方法
  我们这里的where是字符串,所以走if语句,将where的值赋给whereStr
  可以看到这里是直接返回了whereStr,没有用过滤函数什么的处理,因此最终返回的仍是我们传入的
  具体SQL内容如下SELECTFROMusersWHERE0unionselectuser(),2,3LIMIT1exp注入
  测试这个的话需要简单修改一下我们的select()方法,修改后内容如下publicfunctionselect(){maparray(idGET〔id〕);userM(users);datauserwhere(map)find();vardump(data);}
  这里需要说明一下,之所以不用I方法,是因为I方法中存在过滤,即thinkfilter函数,其内容如下if(pregmatch((EXPNEQGTEGTLTELTORXORLIKENOTLIKENOTBETWEENNOTBETWEENBETWEENNOTINNOTININ)i,value)){value。;}
  可以看出这里过滤了exp,所以不能直接用I方法来写,接下来我们访问网页,写入如下payloadhttp:127。0。0。1:8080index。phphomeindexselect?id〔0〕expid〔1〕1andupdatexml(1,concat(0x7e,user(),0x7e),1)
  同时开启调试,单步跟进
  这里的话我们的where是数组,所以条件不满足,直接pass,第二个if同理,然后第三个的话,我们这里并未对optinos〔where〕进行赋值,所以就会走else,把where的值赋给他,接着看
  到find方法这里,第一个if语句,我们这里options为数组,所以直接pass,第二个if语句,我们的pk值为id,而非数组,所以也pass,到下面跟之前一样,参数被函数parseOptions包裹,接下来跟进这个函数
  这里有一个字段类型验证的,我们可以看到这个是满足条件的,所以他会进入下面这个函数,我们首先这个语句if(isscalar(val)){
  这里的isscalar是检验变量是否为标量,什么是标量,官方文档如下
  我们这里的val变量值如下
  是Array,因此不会进入这个if语句,即不会进入parseType方法,这里直接pass,接着看下面
  第一个是执行查询语句返回结果的,第二个是返回预编译的语句,继续跟进
  我们这里用了where,跟进parseWhere方法
  可以看到这里是拼接,继续往下看
  最终返回的是拼接的结果,接下来走到最后,得到SQL语句
  如下SELECTFROMusersWHEREid1andupdatexml(1,concat(0x7e,user(),0x7e),1)LIMIT1bind注入
  更改内容如下publicfunctionselect(){UserM(users);user〔id〕I(id);data〔passwd〕I(passwd);valuUserwhere(user)save(data);vardump(valu);}
  payload如下http:127。0。0。1:8080index。phphomeindexselect?id〔0〕bindid〔1〕0andupdatexml(1,concat(0x7e,user(),0x7e),1)passwd1
  接下来开启xdebug,然后访问
  这里与之前相同,因为是数组,所以让前三个if语句,直接到if(isset(thisoptions〔where〕))
  这里,因为没有设置这个options〔where〕,所以走下面,将where的值赋给他,然后将值返回,接下来继续看
  我们这里的data是一个数组,是有值的,所以if(empty(data))
  这个不满足条件,直接看下面,可以看到这里有facade对data进行了处理,跟进这个函数
  可以看到这里先是检验了是否有fields是否为空,然后进入if(!empty(thisoptions〔field〕)){
  因为这里并不存在options〔field〕,所以直接pass,走else那里,即将fields值赋给这里的fields,接下来是foreach语句
  因为data中的passwd在fields中,所以走下面,即elseif那里
  这里的var为1是标量,所以满足条件,接下来data被parseType函数处理,跟进这个函数
  可以发现这里就是对内容进行了intval处理,没什么影响,继续跟进
  这里的话是使用了filter函数对内容进行了一次过滤,跟进
  接下来到parseOptions函数
  接下来这里以为val是数组,使用不会进入parseType方法,出来该方法后,到这里
  跟进update方法
  发现有parseSet方法,跟进此方法
  可以看到这里拼接了:,此时的SQL语句为UPDATEusersSETpasswd:0
  接下来进入parseWhereItem方法
  这里可以看出当expbind时,whereStr是可控的,而后得到拼接后的语句,此时的SQLUPDATEusersSETpasswd:0WHEREid:0andupdatexml(1,concat(0x7e,user(),0x7e),1)
  接下来到execute执行函数这里
  重点在于这里if(!empty(thisbind)){thatthis;thisqueryStr(thisqueryStr,arraymap(function(val)use(that){return。thatescapeString(val)。;},thisbind));}
  这个strtr函数在这里的话就是起到替换作用,比如我们这里,我们传入的是0(payload中的id〔1〕0),那么这里就会拼接变成:0,而这个strtr函数将其替换为1
  此时也就得到了我们最终的SQL语句UPDATEusersSETpasswd1WHEREid1andupdatexml(1,concat(0x7e,user(),0x7e),1)命令执行环境搭建
  环境配置,我们首先需要在ApplicationHomeController新建一个文件,用之前SQL注入的亦可,这里就用之前的了,修改文件内容如下lt;?phpnamespaceHomeController;useThinkController;classIndexControllerextendsController{publicfunctionindex(value){thisassign(value);thisdisplay();}}
  因为该漏洞利用的assign函数需要模板渲染,所以需要新建一个模板文件,模板文件位置如下ThinkPHPApplicationHomeViewIndexindex。html内容随意
  这里还需要说明的是,日志和debug的关系
  若开启debug模式日志会到:ApplicationRuntimeLogsHome下
  若未开启debug模式日志会到:ApplicationRuntimeLogsCommon下
  接下来开始复现一下,首先我们创建log文件ThinkPHPindex。php?mlt;?phpinfo();?接下来去包含log文件(这里log的文件名与年月日相关)http:127。0。0。1:8080ThinkPHPindex。php?mHomecIndexaindexvalue〔filename〕。ApplicationRuntimeLogsCommon230118。log
  漏洞分析
  这里之所以存在漏洞,其原因是
  由于在业务代码中如果对模板赋值方法assign的第一个参数可控,则导致模板路径变量被覆盖为携带攻击代码路径,造成文件包含,代码执行等危害。
  接下来我们在函数处打上断点
  而后访问http:127。0。0。1:8080ThinkPHPindex。php?mHomecIndexaindexvalue〔filename〕。ApplicationRuntimeLogsCommon230118。log
  开始单步调试
  首先来到这个assign函数,这里的name是数组,其内容为我们的日志文件,可以看到这个函数里用了另一个assign函数来处理变量,跟进
  这里判断name是否为数组,我们的name为数组,所以进入if语句,这里的arraymerge是合并数组的,但这里thistvar
  为空,所以这里的话其实就是thistVarname,即将name变量的值赋给了tVar
  继续跟进
  接下来到display函数
  同上个相似,这里是用了另一个同名函数来处理变量,跟进
  我们这里模板内容为空,看到这里有fetch函数,跟进
  首先判断了模板文件是否存在
  而后检验使用的是否是PHP原生模板,系统配置的默认引擎是Think,所以这里走else
  这里可以看到将thistVar的值赋给了params,而后进入了listen函数,跟进此函数
  发现这里经过一些判断后进入了exec函数,跟进此函数
  可以发现这里是调用BehaviorParseTemplateBehavior类中的run方法处理params,我们跟进run方法,寻找哪里对日志文件路径进行了处理,最终找到ThinkPHPLibraryThinkTemplate。class。php文件下的fetch方法
  loadTemplate函数是读取文件路径的,而后这里用load函数对其进行了处理,我们跟进此函数
  filename是之前获取到的的缓存文件路径,vars是带有变量filename的数组,这里的vars不为空,因此使用extract方法的EXTROVERWRITE默认描述对变量值进行覆盖。
  最后include日志文件路径,造成文件包含,最终导致包含文件造成RCE。参考链接
  https:www。freebuf。comarticlesweb345544。html
  https:www。freebuf。comvuls282906。html
  https:mp。weixin。qq。comsOqfruwHf9CAt2dQQfNJw
  https:forum。butian。netshare546
  fromhttps:www。freebuf。comarticlesweb355571。html

白天人间,晚上天堂,世界开放之都泰国芭提雅质朴又狂野在亚洲有这么一个地方,当地人在白天的时候,有着宁静的生活;但在夜幕降临的时候,这里却有着极为开放的夜生活,大家知道这是哪里吗?(此处已添加小程序,请到今日头条客户端查看)……全台最美办公楼新北古迹如今破败不堪参观民众惊讶大门旁窗框毁坏却未见修缮。记者李定宇摄影日据时期拥有全台最美办公大楼美称的三峡庄役所,随着时代演变如今变身历史文物馆并列为新北市定古迹。日前民众前往参观,却发……中医治耳鸣的5个基础方!刷到这篇太幸运了【调理原则】去除引起耳鸣的因素,调节心理平衡,均衡饮食,改善居所、工作环境等,补肾充髓。应注重对象具体因素,辨证调理。【调理方法】中医辨证(1)肾阳不足,湿困中焦,……活法时间与书籍,哪个才是人类的朋友?书海茫茫,人间天堂。错!错!错!书有五毒五益。好书终身受用,坏书误人子弟!虽然有金山银海,但是免不了有……热搜第一!苹果曝出严重安全漏洞,黑客可全面控制设备!iPho每经编辑:李泽东8月20日,苹果曝出严重安全漏洞的话题登上热搜第一。据央视财经援引美联社20日报道,美国苹果公司当地时间本周三发布两份安全报告,两份报告披露,公司旗……台积电3nm工艺9月量产?苹果成大赢家,三星又输了据《每日经济新闻》报道,8月18日,台积电(中国)有限公司技术总监陈敏,在南京举行的2022世界半导体大会上表示,台积电3nm工艺将在今年下半年量产,2nm工艺的量产会在202……北京密云水库环湖跑山,潮河主坝威风凛凛,发现有趣单车小隧道2022年8月11日,去密云兜了一大圈,多半箱油没了,除去跑山的快乐,也是收获满满的一天。在去巨各庄镇沙厂水库路上,发现一条有意思的乡级小山路,叫久黄路。来到沙厂水……肿眼泡大眼袋黑眼圈等问题该如何解决?眼袋熊师博士帮您解答黑眼圈形成原因的不同,可以分为3类:色素型、血管型、结构型。需要根据不同的类型进行采用不同的治疗方式肿泡眼最合适的改善方式是全切双眼皮术,通过双眼皮切口切除多余脂肪组织,……郑智没有魔法郑智回来了,似乎广州队也回来了。迎来顶替刘智宇出任广州队主帅之后的首秀,郑智不辱使命,率队4比1大胜深圳队,取得了本赛季开赛以来,广州队最酣畅淋漓的一场大胜。这场球……PBE美测服安装注册下载汉化一条龙服务最近PBE美测服又更新了一波新内容,很多小伙伴都迫不及待地想要在美测服体验一下,但是有很多人都没有下载过pbe美测服,因为这个是测试服,所以下载方式与正常的也并不相同,大家都找……喜大普奔!RNG或直接躺进世界赛RNGV5相继出局之后,季后赛就是剩下四只队伍的了,由于复活甲的原因,打满六个bo5才能决出最后的排名,不过RNG春季赛积分很高,即使季后赛一轮游,积分也有130分,比较其他队……肝血不足的表现,你有几个?为何会肝血不足?原因的话,多是保养不当所致,常见的伤害性行为。过劳透支熬夜晚睡血的化生出问题了。潜在消耗因素。(可能有些未知的疾病,潜藏体内,暗耗气血,甚至经常性出血)……
丰田和铃木将加强与资本联盟的伙伴关系2017年,两家全球最大的汽车制造商丰田(Toyota)和铃木(Suzuki)之间的合作关系成为现实,双方达成了合作开发电动汽车的协议。从那时起,合作伙伴关系扩大到共享混合动力……gpa多少算优秀(5分制gpa对照表)GPA成绩是美国大学考核申请者的重要指标,是成功申请美国大学的重要竞争力。对于想要去美国留学的同学,恐怕对GPA并不陌生。GPA即GradePointAverage,即将……福特野马将同时抵达美国和欧洲它已经得到福特的正式确认。大约一个月前,我们报告说,福特计划在车型到达美国之前首先在欧洲的土壤上推出野马马赫E。事实证明,这份报告并不完全准确,因为该公司的发言人已经向Moto……中国男篮11月日程出炉,杜锋携五将首发战伊朗,22岁爱徒有望随着CBA第一阶段的比赛已经结束,接下来有些球员会选择轮休好好休息一下,像赵继伟、郭艾伦这些球员都会缺席国家队的比赛。另外一方面,像徐杰这些核心球员则会继续赶赴广州长隆进行集训……聚英电子智慧农业解决方案助力农业数字化转型升级我国智慧农业的发展仍处于初级阶段,其根本原因在于农业系统的复杂性极大限制了生产方式向智能化演进的过程,具体表现为以下几个痛点:生产不规范,管理措施不统一;防灾减灾能力弱,……洗衣袋怎么用(洗衣机用法步骤)想真正宝贝衣服就要了解洗衣袋的特性。(图unsplash)编辑借借在家洗衣为了保护衣服,许多民众会使用洗衣袋,但洗衣袋大大小小,加上材质、孔洞不同,其实都有不同用法……本周你需要知道的关于汽车的一切20年3月1日是奔驰A35赛隆。它不是奔驰CLA。你可以用同样的发动机和底盘得到它,但你会再付1300英镑的特权。时尚的代价就是如此。Pininfarina正在准备一辆非常特别的车,大……2020年6月18日丰田RAV4在马来西亚上市据UMW丰田汽车公司在社交媒体上发布的视频预告,第五代丰田RAV4将于6月18日在马来西亚正式亮相。虽然我们还没有完整的细节,比如规格和价格,但这些短片确实给了我们一些预期的想……112?兴戈新旗舰EA2000是否名副其实?之前在入手EN1000时就有聊到,兴戈在其上还有一款新的旗舰耳机玻色子EA2000。作为一款在价位上比EN1000翻了一倍、定价去到2K价位的产品,EA2000是否名副其实地能……项目职责怎么写(项目个人总结怎么写)作者:环环来::PM圈子。洞察50W项目经理的苦与乐每一个项目从开始到结束,都需要有一个项目总结。如何写一份优秀的项目总结报告,是项目经理必须掌握的一项技能。……经常放屁是肝不好吗?医生提醒放屁频繁,这3个因素应重视人都是吃五谷杂粮长大的,食物在体内分解,难免会产生一些气体,不管你身体多健康,多优雅,每天都会放几个屁。体内产生的气体窜来窜去,寻找出去的门路,正好肠道在蠕动,这些气体就……一把子期待住了!雷军透露小米首台工程车已正式下线在2022年度雷军演讲上,小米CEO雷军公布了小米造车的最新进展,并公布了部分自动驾驶的演示画面,小米汽车再次进入大众的视野。日前,小米汽车再度传出消息,有爆料称,小米汽车的首……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网