预期解法

首先我们用脚本扫描目录得到

我们发现 index.php~

config.php~

我们猜测还有个 user.php~

这些文件都是被一些编辑器留下的备份文件

通过审计 index.php~, 我们可以看到目录 views, 这里可以列目录,然后就可以得到剩下的源码

现在我们已经获得了全部的源码,接下来就是代码审计环节了

首先我们审计 config.php~ , 他对所有的输入用了 addslashes()

但是我们发现其他有趣的东西 , 在函数 insert() , 我们发现他替换了所有的 [grave accent]xxx[grave accent]'xxx' , 所以就有机会进行注入

通过审计 user.php, 我们发现了一个利用点在 publish().

这个利用点的调用方式为 action=publish, 但是想要发布心情需要注册并登陆
index.php?action=register
index.php?action=login

你可以写脚本来过这些验证码

import multiprocessing
from os import urandom
from hashlib import md5
import sys

processor_number = 8


def work(cipher):
    for i in xrange(100):
        plain = urandom(16).encode('hex')
        if md5(plain).hexdigest()[:5] == cipher:
            print plain
            sys.exit(0)


if __name__ == '__main__':
    cipher = raw_input('md5:')
    print 'Processor Number:', multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=processor_number)
    while True:
        plain = urandom(16).encode('hex')
        pool.apply_async(work, (cipher, ))
    pool.close()
    pool.join()

当我们成功登陆后,开始测试sql注入

通过注入,我们能获得库中的数据

table ctf_users

一些参赛选手私戳我说不知道如何去判断是不是admin,通过审计代码,很容易发现admin的索引

select * from ctf_users where is_admin<>0;

得到了用户名和密码的hash后,我们可以通过公告里面的地址复原明文

http://47.52.137.90:20000/getmd5.php?md5={your md5}

或者使用一些在线的网站解密
http://www.cmd5.org/

密码是 nu1ladmin

但是你还是登录不了,为什么?

因为admin关闭了这个选项 allow_diff_ip,既不能异地登录

你必须来自 127.0.0.1 才行

我们来看下获取ip的函数 getip()

他看上去是让你绕过 $_SERVER['REMOTE_ADDR'] 伪造ip, 但是如果你能找到一个ssrf的话,同样可以以127.0.0.1的身份登录

SSRF在哪里呢?

在寻找SSRF的过程中我们发现了另一个漏洞:反序列化漏洞

他在 user.php 函数 showmess()

他看上去会因为sql注入引发反序列化漏洞。

所以我们可以注入

a`, {serialize object});#

到库中
然后他会在你访问
index.php?action=index 的时候触发

但是我们找不到一个可以利用的类

如果你看了 phpinfo 然后目标一开始就定在了 SSRF ,你的思路在魔术函数上

你会发现一个类 SoapClient

这个类是用来创建soap数据报文,与wsdl接口进行交互的

点击收藏 | 8 关注 | 3
登录 后跟帖