bluecms v1.6 SQL注入

一、环境搭建

 pupstudy_pro + php5.4.45 + MySQL5.7.26

下载源码进行搭建,将\install\compile\目录下的php文件删除
访问127.0.0.1/bluecms/install/ 配置好信息后访问index.php即可

二、源码审计

 phpstorm2023.1载入源码,利用IDE的正则语法搜索有sql语句的地方

全局搜索 (update|select|insert|delete|).*?where.*= (点击右上角*开启正则)

三、定位漏洞文件----前台SQL注入

1、全局正则搜索后定位到ad_js.php文件,发现一处sql语句执行 $ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
2、查看getone()的声明,里面有个$sql,目前不清楚$sql从哪里传来的,下面的语句是对象实例化的$this会指向query方法,query()方法里面也有$sql,继续追踪query()

 

3、query()方法是自定义执行sql语句的函数,$sql就是要执行的sql语句,sql语句执行错误输出sql语句,正确将返回

4、再来到ad_js.php,看下sql语句,查询的表后缀是ad,条件是$ad_id,当$ad_id有了就会执行getone($sql),再去执行query($sql),query($sql)执行完成后将sql信息返回给getone(),getone()再赋值给$ad ,$ad_id是get传参,可以控制,而且传入时没有过滤

5、看下blue_ad表,time_set、end_time、ep_content、content是字段名,默认都为空,替换都不影响,最后以html注释形式输出结果

6、ad_js.php是前台文件,查询的表只有7个字段,访问地址 127.0.0.1/ad_js.php?ad_id=1 使用联合查询进行注入
127.0.0.1/ad_js.php?ad_id=1 and union select 1,2,3,4,5,6,7
7是回显位

7、查询数据库用户  127.0.0.1/ad_js.php?ad_id=1 and union select 1,2,3,4,5,6,user()

 四----后台SQL注入

1、全局搜索 (update|select|insert|delete|).*?where.*= ,定位到admin_log.php

2、当act==del时候进入循环,当checkboxes不为空时进行foreach循环,获取$key和$val,对以admin_log后缀的表执行sql语句删除某条日志,条件为$val,foreach只适用于数组,猜测应该是获取键值对,$key应该就是主键的索引下标,$val应该就是主键的值,$val直接拼接,没有过滤

3、初始blue_admin_log没有数据,添加几条数据

4、checkboxes以POST进行传参,方法为del,访问路由抓包 127.0.01/admin/admin_log.php 

5、状态码200,但是日志没有删除掉,返回代码段,输出$key和$val看下

6、key为0,val为1,获取的就是主键的id值,0为数组下标,后台删除日志抓包看下数据包,发现checkboxes参数带有中括号

7、输出一下$_POST['checkboxes'],显示为array

8、data:checkboxes[0]=1&act=del sql语句拼接的是$val,对checkboxes[0]的参数进行注入,尝试报错、联合都不行,只能进行时间盲注

(如果没有日志进入最后一个else语句,无法注入)

 

 

 

posted @ 2023-12-28 16:18  Fengzun  阅读(743)  评论(0)    收藏  举报