bluecms审计
黑盒审计
1.登录处验证码没有刷新,并且密码没有经过加密,可以爆破密码
2.注册处暴露了用户已注册,可以爆破账号
1与2结合起来就可以爆破出管理员密码
邮箱中存在xss
1、& (和号)成为 &
2、” (双引号)成为 ”
3、’ (单引号)成为 ‘
4、< (小于)成为 < > (大于)成为 >
地址处有htmlspecialchars() 绕过
注册的邮箱可以是绕过,注册邮箱没有检查后面的内容,可以进行xss
登录的时候密码注入 可直接忽略账号并且可以注入 就因为过滤了一个单引号
在评论的地方存在一个http头xff注入
bluecms存在一个文件包含,其他的地方没看
白盒审计
1.开启了gpc 并且get post cookie request都是addslashes()函数
if(!get_magic_quotes_gpc())
{
$_POST = install_deep_addslashes($_POST);
$_GET = install_deep_addslashes($_GET);
$_COOKIES = install_deep_addslashes($_COOKIES);
$_REQUEST = install_deep_addslashes($_REQUEST);
}
2.可能存在php %00截断
if(PHP_VERSION > '5.1')
{
date_default_timezone_set($timezone);
}
3.数据库配置
define('BLUE_CHARSET','gb2312'); 不存在宽字节注入
4.重复安装install
if(file_exists(BLUE_ROOT.'data/install.lock')){
install_showmsg('您已经安装过本系统,如果想重新安装,请删除data目录下install.lock文件', '../index.php');
}
如果这个地方最后一句加die()就可以避免了
5.ad_js.php存在注入
$ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
if(empty($ad_id))
{
echo 'Error!';
exit();
}
$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
如果getone没有限制,那么就存在sql注入
function getone($sql, $type=MYSQL_ASSOC){
$query = $this->query($sql,$this->linkid);
$row = mysql_fetch_array($query, $type);
return $row;
}
可以看到getone函数就是对数据库进行一个筛选,并没有过滤操作就可以进行注入,可以先不使用单引号,先进行判断union oreder by
select 12345678进行判断数据库
等到
尝试16进制编码可以绕过
6.user.php注册&编辑个人资料产生xss
$user_name = !empty($_POST['user_name']) ? trim($_POST['user_name']) : '';
$pwd = !empty($_POST['pwd']) ? trim($_POST['pwd']) : '';
$pwd1 = !empty($_POST['pwd1']) ? trim($_POST['pwd1']) : '';
$email = !empty($_POST['email']) ? trim($_POST['email']) : '';
$safecode = !empty($_POST['safecode']) ? trim($_POST['safecode']) : '';
$from = !empty($from) ? base64_decode($from) : 'user.php';
if(strlen($user_name) < 4 || strlen($user_name) > 16){
showmsg('用户名字符长度不符');
}
if(strlen($pwd) < 6){
showmsg('密码不能少于6个字符');
}
if($pwd != $pwd1){
showmsg('两次输入密码不一致');
}
if(strtolower($safecode) != strtolower($_SESSION['safecode'])){
showmsg('验证码错误');
}
if($db->getone("SELECT * FROM ".table('user')." WHERE user_name='$user_name'")){
showmsg('该用户名已存在');
}
if($db->getone("SELECT * FROM ".table('admin')." WHERE admin_name='$user_name'")){
showmsg('该用户名已存在');
}
只对邮箱进行了空格验证,所以标准xss,可以进行存储型xss,不需要绕过直接就可以进行xss打击
7.user.php产生万能密码登录
if($act == 'index_login'){
$user_name = !empty($_REQUEST['user_name']) ? trim($_REQUEST['user_name']) : '';
$pwd = !empty($_REQUEST['pwd']) ? trim($_REQUEST['pwd']) : '';
$remember = isset($_REQUEST['remember']) ? intval($_REQUEST['remember']) : 0;
if($user_name == ''){
showmsg('用户名不能为空');
}
if($pwd == ''){
showmsg('密码不能为空');
}
$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$user_name'");
if($row['num'] == 1){
showmsg('系统用户组不能从前台登录');
}
有一个login函数
$w = login($user_name, $pwd);
跟进login函数
function login($user_name,$pwd){
global $db;
$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('user')." WHERE user_name='$user_name'");
if($row['num']==0){
$result = 0;
}else{
$sql = "SELECT COUNT(*) AS num FROM ".table('user')." WHERE user_name='$user_name' and pwd=md5('$pwd')";
$user_num = $db->getone($sql);
if($user_num['num']){
$result = 1;
}else $result = -1;
}
return $result;
}
可以看出如果user_name后面的值被过滤掉,密码也就无效了
可以尝试万能密码登录跑一波
%df’) or 1=1#
这个可以尝试去注入,sqlmap没有跑出来,可以尝试手工注入
8.评论的地方
if($act == 'send')
{
if(empty($id))
{
return false;
}
$user_id = $_SESSION['user_id'] ? $_SESSION['user_id'] : 0;
$mood = intval($_POST['mood']);
$content = !empty($_POST['comment']) ? htmlspecialchars($_POST['comment']) : '';
$content = nl2br($content);
$type = intval($_POST['type']);
if(empty($content))
{
showmsg('评论内容不能为空');
}
if($_CFG['comment_is_check'] == 0)
{
$is_check = 1;
}
else
{
$is_check = 0;
}
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
$db->query($sql);
if($type == 1)
{
$db->query("UPDATE ".table('article')." SET comment = comment+1 WHERE id = ".$id);
}
elseif($type == 0)
{
$db->query("UPDATE ".table('post')." SET comment = comment+1 WHERE post_id = ".$id);
}
if($_CFG['comment_is_check'] == 1)
{
showmsg('请稍候,您的评论正在审核当中...','comment.php?id='.$id.'&type='.$type);
}
else
{
showmsg('发布评论成功','comment.php?id='.$id.'&type='.$type);
}
}
看到存在查询ip,而ip完全没有经过过滤,所以可以是xff注入
9.支付方式的时候存在一个include
if ($act == 'pay'){
include 'data/pay.cache.php';
$price = $_POST['price'];
$id = $_POST['id'];
$name = $_POST['name'];
if (empty($_POST['pay'])) {
showmsg('对不起,您没有选择支付方式');
}
include 'include/payment/'.$_POST['pay']."/index.php";
}
发现只有include,没有其他东西,可以直接读取文件,写入文件