二次注入是在ajax.php中发生的
主要流程是uploadcloud时在写入的内容,在save_as时被读取,但是没有进行过滤,造成了二次注入
来具体看看代码,首先是uploadcloud
虽然data使用base64加密,并且serialize,但是重新读入的时候都做了escape处理,确保了该函数不会有注入
继续看下save_as
其中有两个注入点,都是因为对rs的数据没有过滤造成的
由于这套系统没有显示mysql错误,因此注入点1的select查询只能进行盲注,这样的话需要次数比较多,比较麻烦,所以考虑通过注入点2的insert进行注入,看能否直接爆出数据
这个时候就出现了问题,要让语句先通过第一个select语句不报错才能进入注入点2
看了一下,注入点1中只用了3个参数name,size,extension,还有一个description是我们可控的参数,那么如果我们通过description进行注入,就能成功通过注入点1到达注入点2
先调用uploadcloud,在description中写入单引号,然后换一个帐号(一定要换个帐号!)调用save_as,调出调试信息看一下语句,像是这样
可以发现二次注入确实存在,但是注入点的位置很尴尬,能在页面中显示的name字段在注入点之前,其他能显示的字段就剩下description本身
那么想在name处直接爆信息是不可能了,description已经有了一个单引号,导致
这样的方式也不可能了
首先想到了一个解决方案,用类似盲注的方法,看图
通过这种方式,将password每一位都爆在description处,直接查看,总共需要32次,比盲注好了不少,不过还是不够给力
所以又想到了方案2,还是看图
用hex的方式,可以爆多位内容了,离成功更近了一步,不过尝试爆password的时候,问题出现了
由于password是md5,应该是32位,而hex后应该是64位,果断太长了
最终折中的方案是,32位的password通过分段来爆,每次最多爆7位,这样最少只要5次就解决了
水平有限,只能这样了~
以爆前password的前7位来证明,首先登陆帐号A,进行uploadcloud的操作
通过代码,得到data的值为YTo0OntzOjE2OiJmaWxlX2Rlc2NyaXB0aW9uIjtzOjY1OiIwJytzdWJzdHIoaGV4KChTRUxFQ1QgcGFzc3dvcmQgZnJvbSBwZF91c2VycyBsaW1pdCAwLDEpKSwxLDE0KSsnMCI7czo5OiJmaWxlX25hbWUiO3M6MToiMSI7czo5OiJmaWxlX3NpemUiO3M6MToiMSI7czoxNDoiZmlsZV9leHRlbnNpb24iO3M6MToiMSI7fQ==
folder_id是已创建的文件夹id
看下文件已经创建了,并且文件id为7(看链接就知道)
看下文件管理,成功爆出数据了