php命令执行

lolydawn / 2024-01-23 / 原文

LD_PRELOAD绕过原理介绍

  • mail 函数
    • 内嵌在php里
    • 先vim demo.php
      • 里面写入mail(",",",")
      • 然后用strace -o 1.txt -f php demo.php
      • 这一句是用文档的形式记录我php demo.php 执行的内容
      • 然后用cat 1.txt | grep execve
      • 这一句是 检查有哪些是执行文件被调用里
      • 发现里面有sendmail这个文件
      • 使用readelf -Ws /usr/sbin/sendmail
      • 然后发现一个 geteuid 函数
      • 这个时候我们编辑一个库文件 demo.c
      • void payload(){
      • system("echo 'xx' ")
      • }
      • int geteuid(){
        • unsetenv("LD_PRELOAD");
        • payload();
      • } 然后把这个文件编译成.so文件 生成动态链接库文件
      • gcc -shared -fPIC demo.c -o demo.so
      • 然后把一开始那个demo.php在开头加上一行
      • putenv("LD_PRELOAD=./demo.so");
      • 表示执行前先加载这个库文件
    • 绕过条件
      • 能够上传自己的.so文件
      • 能够设置LD_PRELOAD变量的值,比如putenv函数并且未被禁止
      • 存在可以控制php启动外部程序的函数并且能够执行
      • 因为新的进程会加载LD_PRELOAD中的.so文件
      • 比如mail()等
  • imagick
    • 需要扩展安装

操作系统连接符

    • 用分号链接 前后都能执行 而且前面命令正确与否都不影响后面命令的执行
  • &
    • 提交后必须要url编码
    • 而且前面命令不影响后面的执行
  • 两个$
    • 如果前面的命令执行成功,才能执行后面的
    • 如果前面不成功,则两条都无法执行
  • |
    • 把前面命令的结果 作为 | 后面命令的参数
    • 然后执行后面的命令
  • ||
    • 类似于if else语句
    • 如果前面的命令执行成功,则后面的命令不再执行
    • 反之执行后面的命令

空格过滤

  • 大括号{}
    • {cat,flag.txt} 第一个作为命令,第二个作为参数
  • 使用$IFS ${IFS} $IFS$9
  • 重定向字符<,<>;
    • <表示的是输入重定向的意思,就是把<后面的文件取代键盘成为新的输入设备
  • %09 TAB %20 SPACE

文件名过滤绕过

  • ?代表单个字符,前提是这个字符要存在
    • 比如flag.php 可以写成????.???
  • *代表任意字符
    • 比如f*.php *
  • 单双引号
    • 比如fla""g.p""hp 或者fla''g.p''hp
  • \ 反斜线
    • 比如 fla\g.ph\p
    • \在Linux里是命令连接符
  • 特殊变量
    • 比如$1到$9、$@和$*等
    • 因为他们的输出都为空
  • 内联执行
    • 定义变量 比如$a=f;
    • 然后cat $alag.php
  • 环境变量
    • $
    • 意思是使用环境变量PATH里的第五个字符里的第一位
    • 从0开始数

文件读取命令的绕过

  • tac 反向显示
  • more 一页一页显示 在linux里按空格翻页
  • less 与more 相似
  • tail 查看末尾几行 最多十行
  • nl 显示的时候 顺便输出行号
  • od 二进制的方式读取
  • xxd 读取二进制文件
  • sort 主要用来排序文件
  • uniq 报告或删除文件中重复的行
  • file -f 报错出具体内容
  • grep
    • grep 搜索的字符 匹配的文件
    • grep { fla*.php

编码绕过

  • base64编码
  • echo base64编码后的字符串 | base64 -d | /bin/bash 最后一项有很多能用的 比如直接bash 或者sh
  • base32编码
    -HEX编码 即ASCII编码
    -echo 编码后字符串 | xxd -r -p | /bin/bash
  • shellcode编码
  • shellcode是ASCII编码用/x来表示
  • 这里用printf替代echo即可

无回显时间盲注

  • sleep 3
    • 表示三秒之后再执行
  • awk NR==1
  • 表示返回第一行的结果
  • cut -c 1
  • 表示返回第一个字符的结果
  • if语句
  • if [];then ;fi
  • 表示[]里面是判断 ,如果真就执行then后面的语句 假就fi 注意if和[]中间要用空格隔开
  • if [$(cat flag | awk NR1 | cut -c 1)a];then echo "right";fi
  • 可以用python写一个脚本跑值 类似于sql盲注的思路

长度过滤绕过前置知识

  • 例如 echo dada > a
  • 就会把dada写到a里面 如果还是一个大于号写入值 就会覆盖原有的内容 可以用两个大于号去新增内容
  • 使用>>追加内容
  • 使用/进行命令换行 上面提到过 就是命令链接的作用
  • ls-t
  • 表示先近后远的按照时间来排序