不忘初心,方得始终。 收藏本站
登陆 / 注册 搜索

阅读: 1.2K   回复: 2

[# 网络安全] Discuz 任意伪造 IP 漏洞

小执念 古黑浩劫论坛大牛 2020-1-6 14:52 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员
Discuz! X(所有版本) 的默认代码允许攻击者任意伪造 IP,伪造 IP 的方法请看 3 楼。

因为DZ在设计上,是优先获取代理IP,然后才会检测代理服务器是否将用户真实IP传输过来,也就是说获取代理IP优先于用户真实IP。

代码如下:
  1. source/class/discuz/discuz_application.php
复制代码

全屏查看
  1. private function _get_client_ip() {
  2.                 // 这个 ip 地址没问题, 是真实用户的
  3.                 $ip = $_SERVER['REMOTE_ADDR'];
  4.                
  5.                 if (!$this->config['security']['onlyremoteaddr']) {

  6.                         // $_SERVER['HTTP_CLIENT_IP'] 这个可以伪造
  7.                         
  8.                         if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  9.                                 $ip = $_SERVER['HTTP_CLIENT_IP'];

  10.                         // $_SERVER['HTTP_X_FORWARDED_FOR'] 这个也可以伪造
  11.                         
  12.                         } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
  13.                                 foreach ($matches[0] AS $xip) {
  14.                                         if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
  15.                                                 $ip = $xip;
  16.                                                 break;
  17.                                         }
  18.                                 }
  19.                         }
  20.                 }
  21.                 return $ip == '::1' ? '127.0.0.1' : $ip;
  22.         }
复制代码


2020年1月19日更新:

  1. config/config_global.php
复制代码

这个文件中的
  1. $_config['security']['onlyremoteaddr'] = 1;
复制代码

只在 Discuz X3.5 中有效
参见:https://gitee.com/ComsenzDiscuz/DiscuzX/pulls/342

------------------------沙雕分割线-------------------------------


我也不知道为什么这样设计代码,可能是考虑小白站长使用 cdn 后的问题?
因为我已经用 nginx 转换了代理(CDN)的 ip 地址,所以修改成如下:

全屏查看
  1. private function _get_client_ip() {
  2.                 $ip = $_SERVER['REMOTE_ADDR'];
  3.                 return $ip == '::1' ? '127.0.0.1' : $ip;
  4. /*               
  5.                 if (!$this->config['security']['onlyremoteaddr']) {
  6.                         if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  7.                                 $ip = $_SERVER['HTTP_CLIENT_IP'];
  8.                         } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
  9.                                 foreach ($matches[0] AS $xip) {
  10.                                         if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
  11.                                                 $ip = $xip;
  12.                                                 break;
  13.                                         }
  14.                                 }
  15.                         }
  16.                 }
  17.                 return $ip == '::1' ? '127.0.0.1' : $ip;
  18. */
  19.         }
复制代码


$_SERVER['REMOTE_ADDR'] 获取到用户 ip 之后 ,直接返回,不执行后面的代码了。

如果你没使用 CDN,这样修改就可以了。如果使用了 CDN,那么还要修改 nginx,把访客的 ip 转发,参考 https://www.guhei.net/post/jb1759


林中落叶的猫 「初入古黑」 2020-1-6 14:52 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

我想说我什么也不想说、
小执念 古黑浩劫论坛大牛 2020-1-6 15:08 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员
如何伪造 ip ?

如果使用  curl
  1. curl http://192.168.1.4/t.php -H 'X-Forwarded-For: 1.1.1.1' -H 'X-Real-IP: 2.2.2.2'
复制代码

Discuz 任意伪造 IP 漏洞 TIM截图20200106150732.png

火狐浏览器可以编辑重发请求头

Discuz 任意伪造 IP 漏洞 Img-1.png

您需要登录后才可以回帖 登录 | 注册账号  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2020-9-29 11:53 , Processed in 0.037239 second(s), 25 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表