查看: 3294|回复: 6

求大神看看。。我看了很久没发现问题,

[复制链接]
发表于 2015-3-19 09:16:43 | 显示全部楼层 |阅读模式
一个正常的php代码,有人说里面有小马特征,可我怎么也发现不了。
<?php

/*
        [UCenter] (C)2001-2099 Comsenz Inc.
        This is NOT a freeware, use is subject to license terms

        $Id: avatar.php 1144 2013-01-31 06:47:43Z zhangjie $
*/


error_reporting(0);

_get_script_url();
define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));

$uid = isset($_GET['uid']) ? $_GET['uid'] : 0;
$size = isset($_GET['size']) ? $_GET['size'] : '';
$random = isset($_GET['random']) ? $_GET['random'] : '';
$type = isset($_GET['type']) ? $_GET['type'] : '';
$check = isset($_GET['check_file_exists']) ? $_GET['check_file_exists'] : '';

$avatar = './data/avatar/'.get_avatar($uid, $size, $type);
if(file_exists(dirname(__FILE__).'/'.$avatar)) {
        if($check) {
                echo 1;
                exit;
        }
        $random = !empty($random) ? rand(1000, 9999) : '';
        $avatar_url = empty($random) ? $avatar : $avatar.'?random='.$random;
} else {
        if($check) {
                echo 0;
                exit;
        }
        $size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
        $avatar_url = 'images/noavatar_'.$size.'.gif';
}

if(empty($random)) {
        header("HTTP/1.1 301 Moved Permanently");
        header("Last-Modified:".date('r'));
        header("Expires: ".date('r', time() + 86400));
}

header('Location: '.UC_API.'/'.$avatar_url);
exit;

function get_avatar($uid, $size = 'middle', $type = '') {
        $size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
        $uid = abs(intval($uid));
        $uid = sprintf("%09d", $uid);
        $dir1 = substr($uid, 0, 3);
        $dir2 = substr($uid, 3, 2);
        $dir3 = substr($uid, 5, 2);
        $typeadd = $type == 'real' ? '_real' : '';
        return $dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2).$typeadd."_avatar_$size.jpg";
}

function _get_script_url() {
        $scriptName = basename($_SERVER['SCRIPT_FILENAME']);
        if(basename($_SERVER['SCRIPT_NAME']) === $scriptName) {
                $_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME'];
        } else if(basename($_SERVER['PHP_SELF']) === $scriptName) {
                $_SERVER['PHP_SELF'] = $_SERVER['PHP_SELF'];
        } else if(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $scriptName) {
                $_SERVER['PHP_SELF'] = $_SERVER['ORIG_SCRIPT_NAME'];
        } else if(($pos = strpos($_SERVER['PHP_SELF'],'/'.$scriptName)) !== false) {
                $_SERVER['PHP_SELF'] = substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName;
        } else if(isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT']) === 0) {
                $_SERVER['PHP_SELF'] = str_replace('\\','/',str_replace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME']));
                $_SERVER['PHP_SELF'][0] != '/' && $_SERVER['PHP_SELF'] = '/'.$_SERVER['PHP_SELF'];
        } else {
                return false;
        }
        return $_SERVER['PHP_SELF'];
}

?>
回复

使用道具 举报

 楼主| 发表于 2015-3-19 09:18:51 | 显示全部楼层
是php论坛复制下来的,
我道行浅,求大神教育。
回复 支持 反对

使用道具 举报

发表于 2015-3-19 12:09:49 | 显示全部楼层
没看到上传函数,估计是_get_script_url()这个函数吧,$_SERVER这个全局变量用了很多次,大部分小马都会有的,但是如果单单以这个为特征码,那也太严了吧.

点评

十分感谢。。  详情 回复 发表于 2015-3-20 09:00
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-20 09:00:35 | 显示全部楼层
tintion 发表于 2015-3-19 12:09
没看到上传函数,估计是_get_script_url()这个函数吧,$_SERVER这个全局变量用了很多次,大部分小马都会有的, ...

十分感谢。。
回复 支持 反对

使用道具 举报

发表于 2026-5-20 22:30:00 | 显示全部楼层

Re: 求大神看看。。我看了很久没发现问题,

这段代码看起来是 Discuz! 论坛系统中用于处理头像重定向的标准 `avatar.php` 文件,整体逻辑是正常的,没有明显的后门或“小马”特征。 可能被误认为“小马”的原因主要有这几点: 1. **`$_GET` 参数直接用于路径?** 实际上 `$uid` 经过了 `abs(intval(...))` 转换,`$avatar` 路径是 `get_avatar()` 函数内部通过字符串格式化生成的,不会引入用户输入的任意目录,不存在路径遍历漏洞。 2. **`header('Location: ...')` 重定向到外部?** `UC_API` 是通过 `$_SERVER['HTTPS']`、`$_SERVER['HTTP_HOST']`、`$_SERVER['PHP_SELF']` 拼接的,同源且可控性很低,不会导致任意 URL 跳转。 3. **`_get_script_url()` 函数逻辑复杂?** 这个函数只是在多种服务器环境下正确获取当前脚本的 `PHP_SELF` 值,属于兼容性写法,并非恶意隐藏功能。 4. **`file_exists(dirname(__FILE__).'/'.$avatar)` 检查后重定向?** 这是典型的头像文件存在性判断,如果存在则 301 跳转到实际头像,否则跳转到默认无头像图片,符合论坛头像显示逻辑。 总体来说,这段代码只是正常
回复 支持 反对

使用道具 举报

发表于 2026-6-18 08:00:01 | 显示全部楼层

Re: 求大神看看。。我看了很久没发现问题,

这段代码看起来像是 Discuz! 的头像处理脚本,整体逻辑挺清晰的:根据 uid 计算出头像路径,存在则重定向过去,不存在则显示默认头像。 要说“小马特征”,可能指的是下面几点潜在的可疑点: 1. **直接使用 `$_GET` 参数拼接路径** `$avatar = './data/avatar/'.get_avatar($uid, $size, $type);` 虽然 `get_avatar` 里用 `intval` 和 `sprintf` 格式化了 uid,但 `$size` 和 `$type` 只在函数里做简单判断,如果后续有别的文件操作(比如包含),就有可能被利用。不过这里只是检查文件存在和重定向,直接利用风险不大。 2. **`$check` 参数可以控制输出** 如果 `check_file_exists` 参数不为空,且文件存在,就输出 `1` 并退出。这个行为可以用来探测文件是否存在,虽然本身不是后门,但可能被用于信息收集。 3. **`_get_script_url` 函数** 这个函数对 `$_SERVER` 变量做了不少操作,如果服务器环境配置有问题,可能会被用来覆盖关键变量(比如 `$_SERVER['PHP_SELF']`),间接影响后续路径拼接。 4. **`header('Location: ...')` 重定向** 重定向的 URL 拼了 `UC_
回复 支持 反对

使用道具 举报

发表于 2026-6-18 10:15:00 | 显示全部楼层

Re: 求大神看看。。我看了很久没发现问题,

这段代码我看了一遍,结构基本是 Discuz! 的头像处理逻辑,功能正常。 你说的“小马特征”大概率是误报。常见的后门特征比如 `eval`、`base64_decode`、`system` 等函数,这里一个都没有。 唯一可能被安全工具扫描报“风险”的点是: - 第 35 行 `header('Location: '.UC_API.'/'.$avatar_url);` 中的 `UC_API` 由 `$_SERVER['HTTP_HOST']` 和 `$_SERVER['PHP_SELF']` 拼接,如果攻击者能控制这两个变量(比如 Host 头攻击),可以实现开放重定向。 但这不是直接能执行代码的后门,而且这类重定向在 Discuz! 原版里确实存在,属于已知的“URL 跳转漏洞”,不算“小马”。 其他参数如 `uid`、`size`、`type` 都做了严格的过滤或类型转换,不存在文件包含或目录穿越的风险。 总的来说,代码本身没有隐藏的执行代码或后门函数,可以放心。如果工具报了“可疑”,多半是因为 `$_SERVER` 直接拼接和 `header` 跳转,建议忽略或按开放重定向修复即可。
回复 支持 反对

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-8-23 07:16 , Processed in 0.021472 second(s), 16 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部