NSSCTF第11页(1)

[HUBUCTF 2022 新生赛]Calculate

进到主页

NSSCTF第11页(1)_第1张图片 翻译

回答以下数学问题20次;你有3秒钟的时间来解决每个问题;
为了保护服务器,你不能在1秒内回答一个问题
您已回答0个问题;

让我们3秒速算,没那个实力,提示说是写脚本,之前从来没写过,趁这次学习一下

NSSCTF | 在线CTF平台

看了这个大佬的思路,很清晰

脚本

import re
import time

import requests
pattern='
(.*?)
' url="http://node5.anna.nssctf.cn:28750/" sess=requests.session() res=sess.get(url) time.sleep(1) for i in range(30): time.sleep(1) result=re.findall(pattern,res.text) print(result) num='' for i in range(len(result)-1): num+=result[i] print(num) ans=eval(num) res=sess.post(url,data={"ans":ans}) print(res.text) # time.sleep(1)

这段代码使用Python编写,实现了一个循环请求网页并进行简单计算的功能。下面是对代码逐行的解释:

  1. import语句导入了所需的模块:time用于控制时间间隔,requests用于发送HTTP请求,re用于正则表达式匹配。

  2. url变量存储了要请求的网页地址。

  3. ses变量创建了一个会话对象,用于发送HTTP请求。

  4. reg变量使用正则表达式编译了一个匹配模式。该正则表达式用于提取网页响应中的某个标签内的内容。

  5. 进入无限循环,通过不断地发送请求、提取标签内容、进行计算的过程,直到得到符合条件的响应为止。

  6. get变量使用会话对象发送GET请求,并将响应保存到get.text中。

  7. math变量使用之前编译的正则表达式匹配模式,从网页响应中提取出需要的内容。

  8. final变量使用''.join(math)[:-1]的方式将提取到的内容拼接成字符串,并去掉最后一个字符。

  9. result变量使用eval(final)将提取到的内容作为表达式进行求值,并转换为字符串。

  10. time.sleep(1)暂停1秒,以控制请求的时间间隔。

  11. p变量使用会话对象发送POST请求,将计算结果作为数据参数传递。

  12. 检查POST响应中是否包含"NSS"字符串。如果包含,则打印响应内容,并跳出循环。

  13. 再次暂停1秒,以控制请求的时间间隔。

 得到flag

NSSCTF第11页(1)_第2张图片

[NCTF 2018]Flask PLUS 

看到了ssti注入

NSSCTF第11页(1)_第3张图片 

随便找了一个payload,发现被过滤了,到这里其实就可以用bp来fuzz测试

NSSCTF第11页(1)_第4张图片

过滤的

  • __init__
  • file
  • __dict__
  • __builtins__
  • __import__
  • getattr
  • os

看起来GG了,很多方法被ban了之后,几乎无法访问到我们所需要的方法。

这里我们注意到了__enter__方法,查看其内容,发现也有__globals__方法可用,而且与__init__一模一样。

这里摘抄下一段stack overflow的一段话

  • __init__ (allocation of the class)
  • __enter__ (enter context)
  • __exit__ (leaving context)

因此__enter__仅仅访问类的内容,但这已经可以达到我们所需要的目的了。

构造payload:

{{lipsum.__globals__['o''s']['pop''en']('ls /').read()}}

NSSCTF第11页(1)_第5张图片 cat flag

NSSCTF第11页(1)_第6张图片 [NSSRound#13 Basic]flask?jwt?

注册admin发现不行,先随便注册一个

有一个拿flag

NSSCTF第11页(1)_第7张图片 发现不行,说不是admin

NSSCTF第11页(1)_第8张图片

看到提示说是session伪造

NSSCTF第11页(1)_第9张图片

 看到了session,但是没有key

NSSCTF第11页(1)_第10张图片

 

在忘记密码的页面找到了flask的key

secretkey: th3f1askisfunny

NSSCTF第11页(1)_第11张图片 解密session

NSSCTF第11页(1)_第12张图片

猜测admin的user_id应该是1

进行session加密

NSSCTF第11页(1)_第13张图片

抓包,改session,得到flag

NSSCTF第11页(1)_第14张图片

[FSCTF 2023]源码!启动!

f12发现被禁了

NSSCTF第11页(1)_第15张图片

ctrl+u看源码

NSSCTF第11页(1)_第16张图片 

[GWCTF 2019]枯燥的抽奖 

看到主页啥也没有,扫一下看看

在js源代码里看到了check.php

NSSCTF第11页(1)_第17张图片

源代码

NSSCTF第11页(1)_第18张图片

就是伪随机数生成,----伪随机数就是可预测的随机数

PHP mt_srand()函数 - 经验笔记mt_srand()函数

先用这个python脚本将字符转变为 数字 让工具去随机

str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
str2='20S7rgtCU9'
str3 = str1[::-1]
length = len(str2)
res=''
for i in range(len(str2)):
    for j in range(len(str1)):
        if str2[i] == str1[j]:
            res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' '
            break
print(res)

 得到的随机数NSSCTF第11页(1)_第19张图片

接下来去获取种子 然后 在 php7.1以上的环境运行 

利用 https://github.com/Al1ex/php_mt_seed这个工具

先make一下,让他可以运行

NSSCTF第11页(1)_第20张图片

然后通过php_mt_seed这个脚本,破解seed 

出来了伪随机数

NSSCTF第11页(1)_第21张图片 然后运行脚本

mt_srand(380973312);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str = '';
$len1 = 20;
for ($i = 0; $i < $len1; $i++) {
    $str .= substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo "

" . $str . "

";

?>

NSSCTF第11页(1)_第22张图片

 得到flag

NSSCTF第11页(1)_第23张图片

 

 

你可能感兴趣的:(做题)