风の愿 » SEC

0CTF 2016 Quals - rand 2 Writeup

Challenge

<?php
include('config.php');
session_start();

if($_SESSION['time'] && time() - $_SESSION['time'] > 60) {
    session_destroy();
    die('timeout');
} else {
    $_SESSION['time'] = time();
}

echo rand();
if (isset($_GET['go'])) {
    $_SESSION['rand'] = array();
    $i = 5;
    $d = '';
    while($i--){
        $r = (string)rand();
        $_SESSION['rand'][] = $r;
        $d .= $r;
    }
    echo md5($d);
} else if (isset($_GET['check'])) {
    if ($_GET['check'] === $_SESSION['rand']) {
        echo $flag;
    } else {
        echo 'die';
        session_destroy();
    }
} else {
    show_source(__FILE__);
}

Solve

Obviously, we need to predict the 5 random number generated in ?go and submit it via ?check[]=num1&check[]=num2&check[]=num3&check[]=num4&check[]=num5 to get the flag.

We know that rand() is a PRNG and for a fixed seed it will generate exactly the same random number sequence. In other words, the number from rand() is decided if we give the seed and know how much rand() calls has been made before this call (the index in the sequence).

Thus in order to predict the random number, we seperate the challenge into two parts:

  1. Assume that the outputed rand() is the first number in the sequence and we search the seed so that the first number of the sequence is the number we got from the page.

  2. Enforce the creation of PHP process so that the outputed rand() we got is indeed the first number in the sequence.

Read More »
Published @ 16th March, 2016

HSTS

强制使用 HTTPS 一定能保障网站安全吗?并不是。虽然中间人在 HTTPS 协议下会被发现,然而中间人还可以阻止用户使用 HTTPS,强制使用不安全的 HTTP 从而截获和篡改流量,即使服务端只允许 HTTPS 也无法完全避免该攻击。

原理很简单,用户在浏览器中输入地址时,大多数时候是不包含 https: 的,也就是初始访问很可能是 http: 。中间人此时只需屏蔽服务端发送的 HTTPS 重定向 header (例如 location: https://example.com),并修改响应主体中的 HTTPS 地址到 HTTP,最后以 HTTP 方式继续和客户端交互数据就可以了。对于客户端来说,它以 HTTP 和中间人通信;对于中间人来说,它以 HTTPS 和服务端通信,因此服务端无法防御此类攻击。没有专业知识的客户端一般不会留意非 HTTP 通信,因此这种攻击往往很有效。

该攻击叫做 SSL stripping,具体可参见该演讲:https://www.youtube.com/watch?v=MFol6IMbZ7Y

HSTS 机制可以一定程度上降低该攻击风险,提高安全性。HSTS 是一个 header,告诉浏览器未来该域名(或该域名和子域名)的访问一律使用 HTTPS 协议。浏览器一旦收到 HSTS header,那么在有效时间内,域名下的后续请求都会强制使用 HTTPS,从而避免了后续访问中的 SSL stripping 攻击。

Read More »
Published @ 19th August, 2015

ALICTF 2015 Writeup

Vijos.org 开发组另两名同学一起去参加了 ALICTF 2015

由于自己和队友们并不是从事信息安全的,并且自己也是第一次参加 CTF (Capture The Flag) 类比赛,所以最初就是想打打酱油混个最低奖项的。结果一不小心进了决赛,还最后拿了三等奖(不过名义上是第三名呢!:-)

虽然并没有渗透经验,决赛时候状态很不好,没有达到预期成果,有点遗憾,不过这次比赛还是有非常多收获的。

由于近几年一直在从事 Web 前后端开发,自初中以来已有很长时间没接触二进制安全了,并且还没有二进制调试环境,因此在初赛和决赛中,我主要负责 Web 安全部分,包括前端和 PHP 后端。

二进制安全方面全部由 PSNull 作者、Vijos NT 作者、Google offer 获得者 iceboy 神队友负责。

Java 相关部分由 blackbbc 完成。

Read More »
Published @ 30th March, 2015

Cryptography I 第一周作业解题报告

Cryptography I 第一周作业:已知 11 条使用了相同的 Stream Cipher key 加密的密文(cipher text),尝试解出第 11 条的明文(plain text)。

Read More »
Published @ 22nd September, 2014

S2-016 & S2-017 Filter Patcher

S2-016 是一个最近爆出来的高危任意代码执行漏洞,struts2 官方给出的修复方案是升级到最新版本。然而在很多使用了 struts2 的系统中,struts2 版本号都比较低,在没有网站源代码的情况下直接升级 struts2 组件容易出现兼容性问题。

在这种情况下可以使用 Servlet 的过滤器来对参数进行过滤,快速修补漏洞。这种方案不需要修改网站代码,兼容性高,方便快捷。

Read More »
Published @ 27th July, 2013

struts2 (S2-016) exploit script

最近冒出来了一个 struts2 的 0day ( S2-016 )。

FreeBuf 26# 上有人贴了一个 Python 版的 exploit,由于我不熟悉 Python,并且那个脚本有一些很不爽的 bug(如不支持多参数),所以我对它进行了一些改进并改成了 Node.js 版,供大家娱乐。

Read More »
Published @ 21st July, 2013
1