桐桑又开始摸鱼了 ctfshow的比赛整的一手好活。djb杯。

web1_veryphp

打开就是源码:

 1  <?php
2 error_reporting(0);
3 highlight_file(__FILE__);
4 include("config.php");
5 class qwq
6 {
7 function __wakeup(){
8 die("Access Denied!");
9 }
10 static function oao(){
11 show_source("config.php");
12 }
13 }
14 $str = file_get_contents("php://input");
15 if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)){
16 die("I am sorry but you have to leave.");
17 }else{
18 extract($_POST);
19 }
20 if(isset($shaw_root)){
21 if(preg_match('/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/', $shaw_root)&& strlen($shaw_root)===29){
22 echo $hint;
23 }else{
24 echo "Almost there."."<br>";
25 }
26 }else{
27 echo "<br>"."Input correct parameters"."<br>";
28 die();
29 }
30 if($ans===$SecretNumber){
31 echo "<br>"."Congratulations!"."<br>";
32 call_user_func($my_ans);
33 }
34
35 Input correct parameters

    解析代码,在第四行对我们未知的文件config.php进行了包含,我们要去读取config.php就需要去触发qaq这个类中的oao函数。于是我们去尝试触发这个函数。并且我们可以看到在代码第32行出现了究极危险函数call_user_func,这个函数能把后面的参数当成函数进行调用。参数可以是系统函数,也可以是已经定义过的函数。比如我们将这里的$my_ans参数值调为phpinfo(此参数不能含有括号,所以无法执行含有参数的函数),效果和phpinfo()效果是一样的。

  之前类中的oao函数就是我们要进行调用的函数,于是可以在此处将参数值设定为qaq::oao就能成功读到config.php。于是我们此时的重点应该放在去控制$my_ans这个参数上面。在前面有一个考点是extract的参数变量覆盖,具体考点百度,于是我们可以通过post参数值对已经存在的参数进行覆盖。要触发危险函数call_user_func需要让$ans和$SecretNumber数值相等。如何相等我们只能去获得22行中的$hint。

  用接地气的话来说要获得这个hint很简单但也很操蛋。因为那个正则匹配看起来强的雅痞,但实际上稍微会一些正则匹配就不会被难倒。这里挂一篇wh1sper的文章,讲的很详细足够web手去掌握正则匹配(zmr yyds)http://wh1sper.com/%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0/

  放出我的本地bypass吧,其实不能算bypass,因为绕过确实是很简单

  

1 <?php
2 $str = '-a9<b>wdnmd>>>>kkkkabcphp@Rsd';//payload
3 if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)) {
4 echo 'wdnmd';
5 }
6 else{
7 echo 'nice!!!';
8 }

  绕过之后会获得hint,内容是Here is a hint : md5("shaw".($SecretNumber)."root")==166b47a5cb1ca2431a0edfcef200684f && strlen($SecretNumber)===5

  这个md5的值是对已知开头和结尾的字符串的md5加密,看似很nb,实际上只需要去爆破中间的$SecretNumber,因为毕竟是五位数字,也就100000种情况。爆破脚本如下

  

 1 #Here is a hint : md5("shaw".($SecretNumber)."root")==166b47a5cb1ca2431a0edfcef200684f && strlen($SecretNumber)===5
2 import hashlib
3 for i in range(1,99999):
4 a = str(i).zfill(5)
5 payload = 'shaw'+a+'root'
6 hl = hashlib.md5()
7 hl.update(payload.encode(encoding='utf-8'))
8 b = hl.hexdigest()
9
10 if b == '166b47a5cb1ca2431a0edfcef200684f':
11 print(a)

  其中zfill()就是将不足五位数字的数在数字空缺位置上补零,生成由00000到99999所有的五位数字,爆出来结果是21475

  然后post传值覆盖$ans就能成功触发危险函数。并且绕过了黑名单(因为思路正确,和出题人完全一致,通过考点),最终payload:

    shaw root=-a9<b>wdnmd>>>>kkkkabcphp@Rsd&ans=21475&my ans=qwq::oao

哦对了还有一个考点:传入参数前shaw_root中间有_过不了正则的限制,这里利用了一个特性,在传入一些非法字符的时候php会把它解析为下划线_,有空格和[和+

web_spaceman

  这题。。。出的翻车了,本来打算靠反序列化字符串逃逸的,结果用空格绕过_的conter就能直接对$user_name和$pass_word进行赋值。本身的反序列化字符串逃逸也不是很难。给个源码吧:

 1  <?php
2 error_reporting(0);
3 highlight_file(__FILE__);
4 class spaceman
5 {
6 public $username;
7 public $password;
8 public function __construct($username,$password)
9 {
10 $this->username = $username;
11 $this->password = $password;
12 }
13 public function __wakeup()
14 {
15 if($this->password==='ctfshowvip')
16 {
17 include("flag.php");
18 echo $flag;
19 }
20 else
21 {
22 echo 'wrong password';
23 }
24 }
25 }
26 function filter($string){
27 return str_replace('ctfshowup','ctfshow',$string);
28 }
29 $str = file_get_contents("php://input");
30 if(preg_match('/\_|\.|\]|\[/is',$str)){
31 die("I am sorry but you have to leave.");
32 }else{
33 extract($_POST);
34 }
35 $ser = filter(serialize(new spaceman($user_name,$pass_word)));
36 $test = unserialize($ser);
37 ?>

web3|4_虎山行

  这两个会在明天的phar反序列化合集中出现。即当你看到这句话的下一天。

ctfshow_djb杯的更多相关文章

  1. 2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名

    蛮牛杯启动了,大家开始报名! http://cup.manew.com/ 这不是一篇普通的通稿,别着急忽略它.它是一篇可以让你梦想变现的通稿! 从某一天开始,游戏蛮牛就立志要为开发者服务,我们深知这一 ...

  2. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

  3. 欧冠杯:葡萄牙VS法国——葡萄牙首次夺冠!

    北京时间7月11日凌晨3点,2016欧洲杯决赛,葡萄牙在法兰西大球场1-0击败东道主法国,历史上首次夺冠.C罗伤退落泪,替补出场的埃德尔在加时赛第109分钟完成绝杀. 昨晚上本来准备熬夜看球赛的!而且 ...

  4. 自罚一杯-PHP基础(一)

    hi 懒癌是最可怕的癌了吧,在即将迎来本命年时,给自己定下每天必干的几件成习惯的事情,望不再鸽!! php是我一直在学习的东西,但总以为php简单,难点在需要掌握大量的相关知识,其实并不完全对,php ...

  5. 2012年 蓝桥杯预赛 java 本科 题目

    2012年 蓝桥杯预赛 java 本科 考生须知: l  考试时间为4小时. l  参赛选手切勿修改机器自动生成的[考生文件夹]的名称或删除任何自动生成的文件或目录,否则会干扰考试系统正确采集您的解答 ...

  6. [文字雲產生器] Tagxedo 把文字串成雲、變成畫,印在 T-Shirt、馬克杯、詩袋….

    http://www.tagxedo.com/app.html 有種東西叫「Word Clouds」,就是把一堆文字依照不同的大小.顏色.角度與位置拼湊在一起,讓他變成像一朵雲一般.組合成各種不同的形 ...

  7. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  8. 蓝桥杯---数独(模拟 || dfs)

    [编程题](满分33分) "数独"是当下炙手可热的智力游戏.一般认为它的起源是"拉丁方块",是大数 学家欧拉于1783年发明的. 如图[1.jpg]所示:6x6 ...

  9. 蓝桥杯---剪格子(DFS&BFS)(小总结)

    问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...

随机推荐

  1. Python基础入门:注释、变量、运算符与数据类型

    一.为什么要学习python? python的特点 python作为一门脚本语言,在越来越多的行业和领域发挥着重大作用,比如机器学习.网站开发.数据分析.爬虫.自动化测试. 同时,python具备以下 ...

  2. JDBC(六)—— 数据库事务

    数据库事务 事务 一组逻辑操作单元,使数据从一种状态变换到另一种状态 事务处理 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式. 当在一个事务中执行多个操作时,要么所有事 ...

  3. 手摸手带你用Hexo撸博客(三)之添加评论系统

    原文地址 注: 笔者采用的是butterfly主题, 主题内置集成评论系统 butterfly主题开启评论 开启评论需要在comments-use中填写你需要的评论. 以Valine为例 commen ...

  4. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  5. mysql源码分析-启动过程

    mysql源码分析-启动过程 概要 # sql/mysqld.cc, 不包含psi的初始化过程 mysqld_main: // 加载my.cnf和my.cnf.d,还有命令行参数 if (load_d ...

  6. Apache本机不同端口多站点配置:httpd-vhosts.conf(转载)

    环境:Apache2.2.9,Resin-3.1.6,Win Server 2003 1.解压Resin至任意目录,我的是D:; 2. 安装Apache,具体操作下一步.下一步即可,其中要配置的地方是 ...

  7. MySQL -- insert ignore语句

    项目实战 用户登记激活码记录插入接口 数据库测试实例,其中手机号和父设备id为唯一索引 当我们使用普通的insert语句插入一条数据库中已存在的手机号和父设备id的数据时,会报重复的key的错 当我们 ...

  8. 在.NET Core中使用Channel(三)

    到目前为止,我们一直在使用所谓的"Unbounded"通道.你会注意到,当我们创建通道时,我们这样做: var myChannel = Channel.CreateUnbounde ...

  9. 洛谷 P4396 [AHOI2013]作业

    题目描述 题目传送门 分析 因为询问是关于区间的,并且没有强制在线,所以能用莫队解决 但是还要支持查询区间内大于等于 \(a\),小于等于 \(b\) 的数的个数和数值的个数 所以还要套一个数据结构 ...

  10. new ArrayList(0) 和 new ArrayList() 和一样吗?

    第一感觉是一样的,盲猜后者调用了前者,并传入参数 0.然而,无论是 JDK 7 还是 JDK 8,这两个方法构造的结果都是不一样的.JDK 开发人员在这方面作了优化. JDK 7 在 Java 7 中 ...