BlueCMS
安装之后,已知漏洞是在根目录下的ad_js.php
文件中,存在sql注入,直奔主题,看代码。
$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);
if($ad['time_set'] == 0)
{
$ad_content = $ad['content'];
}
else
{
if($ad['end_time'] < time())
{
$ad_content = $ad['exp_content'];
}
else
{
$ad_content = $ad['content'];
}
}
其中,判断通过get方式传入的ad_id
是否为空,trim()
移除传入的参数左右两边的空格字符或者其他预定字符。
再看getone方法,可以看到在代码最上方,就一开始是包含了这个文件,然后跟踪这个文件,在/include/common.inc.php
,这个文件中还有一包含更多的文件,使用工具搜索跟踪,发现getone()
方法是在 /include/mysql.class.php
文件中
所以这个包含就是这样的
然后总结出,就是没有过滤,直接传入$ad
中的SQL语句中去执行命令,可以看到,$ad_id
左右也是没有任何闭合符号的,则可以说明这个是个最简单的注入,注入过程如下图:
然后访问路径进行测试http://localhost/bluecms_src/uploads/ad_js.php?ad_id=1
这是还没有加数据,没有回显内容,数据库中没有任何数据而已,但是报错信息已经可以看到了。测试不继续向下了。
KKCMS
vlist.php(前台注入)
<?php
if (isset($_GET['cid'])) {
if ($_GET['cid'] != 0){
$sql = 'select * from xtcms_vod where d_parent in ('.$_GET['cid'].') order by d_id desc';
$pager = page_handle('page',24,mysql_num_rows(mysql_query($sql)));
$result = mysql_query($sql.' limit '.$pager[0].','.$pager[1].'');
}else(....)
....
}
可以看到SQL语句是拼接的,直接将$_GET[‘cid’]直接拼接到sql语句中了。
没有过滤,直接拼接的SQL语句,存在注入的可能性是非常大的。
/admin/cms_usergroup_edit.php(后台注入)
同样是直接拼接SQL语句,所以可以发现在代码审计时,注入漏洞,要针对这种SQL语句多关注一些。同样的地方还有许多。过滤也有很多,绕过暂时不写,CTF中有很多。
一般加控制语句都是在$_GET[‘cid’]后面就加一些自写的过滤函数或者正则匹配,白名单或者黑名单进行过滤。防护
<?php
/*强制类型转换*/
$id=intval($_GET['id']); //因查询ID为整数 所以可以强制转换为整数
/*转义特殊字符 加上引号 (字符串类型)*/
$id=$pdo->quote($_GET['name']);
/*预处理语句*/
$stmt =$pdo->prepare("SELECT id, name FROM users WHERE id=?;");
$stmt->execute([$_GET['id']]);//简单的预处理 完整使用方法见PHP手册
?>
- 强制转换输入内容的类型
- 将特殊字符进行转义
- 预处理,使用PDO::prepare 预处理SQL语句,有效防止SQL注入
- PDO::quote 转义特殊字符并加上引号