网鼎杯第四场Some Web Writeup

栏目: 编程工具 · 发布时间: 6年前

内容简介:comment出的还可以,里面有很多小细节的坑,学习一下。HCoin就比较难受,对此类型题目无思路。这个题目是我以前出在SCTF2018上面的简版,不过被一些地方坑了一下。当时一直在用

comment出的还可以,里面有很多小细节的坑,学习一下。HCoin就比较难受,对此类型题目无思路。

NoWafUpload

这个题目是我以前出在SCTF2018上面的简版,不过被一些地方坑了一下。

当时一直在用 python print 然后进入管道,然后再用 linux 的md5命令

这个时候会多出一个 \x0a ,导致一直算不对,换为 sys.stdout.write 输出就好了

import zlib
import hashlib
import sys
from struct import pack

def dec_(file_):
    f = open(file_,'r').read()
    f = f[48:]
    tmp = ''
    for i in f:
        tmp += chr(ord(i) ^ ord("\f"))
    f = zlib.decompress(tmp)
    return f

def enc_(file_):
    f = open(file_,'r').read()
    data_dec_len = pack('<Q',len(f))

    f = zlib.compress(f)

    tmp = ''
    for i in f:
        tmp += chr(ord(i) ^ ord("\f"))

    m2 = hashlib.md5()   
    m2.update(tmp)   
    md5_ = m2.hexdigest()

    data_enc_len = pack('<Q',len(tmp))

    enc_data = md5_ + data_dec_len + data_enc_len + tmp
    return enc_data

#print dec_('sdfasgerwtytc.php')
print enc_('test.php')

comment

git泄露

console里面可以看到一些提示: 程序员GIT写一半跑路了,都没来得及Commit :)

借此也聊一下git的一些 工具 以及它们的原理,从目前的测试工具来看,BugScanTeam团队的 GitHack 应该是最稳的。

先铺垫一下基础,先初始化一个 git init 没有任何东西的GIT目录

然后只 git add 一个文件,这里并没有 git commit

网鼎杯第四场Some Web Writeup

在这里要区分三个概念词:版本库、工作区、暂存区(stage),更详细的内容可以看 这篇文章

盗图一张:

网鼎杯第四场Some Web Writeup

提交一个文件的时候是分为 git addgit commit 两步的

git add 的时候,是把文件临时放在临时区stage中

git commit 的时候,是把临时区stage的所有内容提交到当前分支

当然这两个在objects目录都会生成一个对象文件,来存储数据。

可以看下当前目录结构为如下:

├── HEAD   
├── config # 存放git的一些信息
├── description
├── hooks
├── index
├── info
│   └── exclude
├── objects # 存放对象文件
│   ├── 0c
│   │   └── 14454dd8d472ef27843ac8c86bdba161c27a03
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

其中index的内容其中就包含了一些当前版本下的文件信息以及对应的objects目录下的对象文件

网鼎杯第四场Some Web Writeup

对于git中的对象,推荐 阅读此文

它包含了Blob对象(用来存储文件内容)、Tree对象(表示内容之间的目录层次关系)、Commit对象(相关的描述信息)

网鼎杯第四场Some Web Writeup

接下来进行 git commit ,多出了 0c31 两个目录

网鼎杯第四场Some Web Writeup

对象用zlib解压即可看到内容

f = open("14454dd8d472ef27843ac8c86bdba161c27a03","r").read()
import zlib
print zlib.decompress(f)

可以看到下面是新生成了一个tree对象、commit对象

看下commit对象内容,可以找到tree对象的一些信息

网鼎杯第四场Some Web Writeup

再通过 git ls-tree 31d459 查看到tree对象里面存放的内容,即一些目录结构,以及对应的Blob对象的object id,也就是通过tree我们可以找到对应文件的object id。

网鼎杯第四场Some Web Writeup

所以获取源码的整个过程就是 commit -> tree -> blob

***

接下来我们再多添加一个文件,进行 git addgit commit 操作

├── objects
│   ├── 0c
│   │   └── 14454dd8d472ef27843ac8c86bdba161c27a03
│   ├── 2b
│   │   └── ccc291c71cc92898645cdc8990056027108580
│   ├── 31
│   │   └── d459eb83ed7f3d9195b2bd24d4e2cbdc7e299c
│   ├── 85
│   │   └── 66ddc152da79a3e2fd4a00123aeea397e574c4
│   ├── 8e
│   │   └── 63e6627218b1e455a5ae4bc45135316cf39055
│   ├── 98
│   │   └── 0411cbd21c224e546111360d20775d62c33349
│   ├── info
│   └── pack

这下新增了 2b8598 三个目录,分别代表着blob、tree、commit

看下commit的内容

网鼎杯第四场Some Web Writeup

可以看到上面的tree是指向了 85/66ddc1 ,然后parent是指向了 8e6366 的commit,也就是上一次的commit内容

网鼎杯第四场Some Web Writeup

下面就讲下Git使用过程中的几种情况,以及对应如何去恢复代码

1、当年git泄露漏洞特别火,lijiejie师傅写了一个 利用工具 ,流传大江南北。

网鼎杯第四场Some Web Writeup

因为index是存储工程中 最新状态 的文件,所以它就是获取了其中的blob的objects的hash,然后去得到文件,最后解压得到源码。

2、 rip系列工具 ,当初在做P师傅出的 XDCTF2015代码审计全解 时候学习到的

对于获取其他的分支、tag,都可以从 /.git/refs/heads/.git/refs/tag 里面拿到最新的commit对象id,然后就是顺着这个可以爬到parent commit

假设获取master,最新的commit的object id可以在 /.git/refs/heads/master 获取到

3、具有场景型,协同合作时,远程代码有更新,即本地代码不是最新版本。为了避免出现版本冲突可以使用 git stash 将这部分暂存起来,然后便可以执行 git pull ,暂存的内容便会存放到 /.git/refs/stash ,此处我 并未使用 git commit

╭─l3m0n@l3m0ndeMacBook-Pro  ~/work/tools/src_tools/test/demo/.git/refs  ‹dev›
╰─$ cat stash
e0945bc49106ac493f0d8c3b32370374b2d36a28

网鼎杯第四场Some Web Writeup

所以通过上面的commit我们依旧能够通过 commit -> tree -> blob 这种模式得到源码

4、使用了 git reset --hard HEAD 回滚时候

这个时候可以获取一下 /.git/logs/HEAD 文件,它会记录所有历史

网鼎杯第四场Some Web Writeup

比如上面便是reset之前的commit id

5、 git gc ,会打包object生成pack文件。但是有种情况便是 git push失败的时候 ,一般push时候会打包一下,但是失败的时候并不会解压出来

网鼎杯第四场Some Web Writeup

这个场景的话,便可以获取 /.git/objects/info/packs 得到pack文件名

使用 git verfy-pack -v xxx.idx 可以看到一些内容信息

网鼎杯第四场Some Web Writeup

使用 git unpack-objects < xxx.pack 便可恢复

网鼎杯第四场Some Web Writeup

注入坑

这里就可以找一下stash留下的object恢复一下,便可以看到源码

printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" | cat - f569f235780f24c42b60f50d528a03f7238c80 | gunzip

网鼎杯第四场Some Web Writeup

比较明显的二次注入,但是坑就在他是换行的,没法多行注释,一下子没想起这个梗,一直都是 # 注入导致很蛋疼。

创建一个 CATEGORYaaa',content=user(),/* ,然后留言回复 */# ,便可回显注入

因为用的是 mysql->query ,也可以也能用 %00 截断一下, aaa',content%3d(user()),bo_id%3d'1'%3b%00%23a

参考文章

https://blog.csdn.net/zssureqh/article/details/53056095

https://www.cnblogs.com/lianghe01/p/5846525.html

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013745374151782eb658c5a5ca454eaa451661275886c6000

https://ring0.me/2015/05/recover-code-from-corrupt-git-repo/

https://www.jianshu.com/p/fbc9eca95e26


以上所述就是小编给大家介绍的《网鼎杯第四场Some Web Writeup》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript核心技术

JavaScript核心技术

Shelley Powers / 苏敬凯 / 机械工业出版社 / 2007-6 / 45.00

Ajax是当今Web开发领域最流行的词汇。而JavaScript与CSS、XML和DOM几种老技术,加上XMLHttpRequest就构成了Ajax的四大基石。对于JavaScript,一些更资深的同事告诉我的感觉是失望。面对不同的浏览器和浏览器的不同版本,没有优秀的调试开发工具,JavaScript成了软件开发的泥潭。. 而本书的出版则给我们增加了一丝解决这些问题的信心。 它从最简单......一起来看看 《JavaScript核心技术》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换