BlueCMS

安装之后,已知漏洞是在根目录下的ad_js.php文件中,存在sql注入,直奔主题,看代码。

  1. $ad_id = !empty($_GET['ad_id']) ? trim($_GET['ad_id']) : '';
  2. if(empty($ad_id))
  3. {
  4. echo 'Error!';
  5. exit();
  6. }
  7. $ad = $db->getone("SELECT * FROM ".table('ad')." WHERE ad_id =".$ad_id);
  8. if($ad['time_set'] == 0)
  9. {
  10. $ad_content = $ad['content'];
  11. }
  12. else
  13. {
  14. if($ad['end_time'] < time())
  15. {
  16. $ad_content = $ad['exp_content'];
  17. }
  18. else
  19. {
  20. $ad_content = $ad['content'];
  21. }
  22. }

其中,判断通过get方式传入的ad_id是否为空,trim()移除传入的参数左右两边的空格字符或者其他预定字符。
再看getone方法,可以看到在代码最上方,就一开始是包含了这个文件,然后跟踪这个文件,在/include/common.inc.php,这个文件中还有一包含更多的文件,使用工具搜索跟踪,发现getone()方法是在 /include/mysql.class.php文件中
【代码审计】SQL注入——PHP - 图1
所以这个包含就是这样的
【代码审计】SQL注入——PHP - 图2
然后总结出,就是没有过滤,直接传入$ad中的SQL语句中去执行命令,可以看到,$ad_id左右也是没有任何闭合符号的,则可以说明这个是个最简单的注入,注入过程如下图:
【代码审计】SQL注入——PHP - 图3
然后访问路径进行测试
http://localhost/bluecms_src/uploads/ad_js.php?ad_id=1
【代码审计】SQL注入——PHP - 图4
这是还没有加数据,没有回显内容,数据库中没有任何数据而已,但是报错信息已经可以看到了。测试不继续向下了。

KKCMS

vlist.php(前台注入)

  1. <?php
  2. if (isset($_GET['cid'])) {
  3. if ($_GET['cid'] != 0){
  4. $sql = 'select * from xtcms_vod where d_parent in ('.$_GET['cid'].') order by d_id desc';
  5. $pager = page_handle('page',24,mysql_num_rows(mysql_query($sql)));
  6. $result = mysql_query($sql.' limit '.$pager[0].','.$pager[1].'');
  7. }else(....)
  8. ....
  9. }

可以看到SQL语句是拼接的,直接将$_GET[‘cid’]直接拼接到sql语句中了。

【代码审计】SQL注入——PHP - 图5

没有过滤,直接拼接的SQL语句,存在注入的可能性是非常大的。

/admin/cms_usergroup_edit.php(后台注入)

【代码审计】SQL注入——PHP - 图6

同样是直接拼接SQL语句,所以可以发现在代码审计时,注入漏洞,要针对这种SQL语句多关注一些。同样的地方还有许多。过滤也有很多,绕过暂时不写,CTF中有很多。

一般加控制语句都是在$_GET[‘cid’]后面就加一些自写的过滤函数或者正则匹配,白名单或者黑名单进行过滤。

防护

  1. <?php
  2. /*强制类型转换*/
  3. $id=intval($_GET['id']); //因查询ID为整数 所以可以强制转换为整数
  4. /*转义特殊字符 加上引号 (字符串类型)*/
  5. $id=$pdo->quote($_GET['name']);
  6. /*预处理语句*/
  7. $stmt =$pdo->prepare("SELECT id, name FROM users WHERE id=?;");
  8. $stmt->execute([$_GET['id']]);//简单的预处理 完整使用方法见PHP手册
  9. ?>
  1. 强制转换输入内容的类型
  2. 将特殊字符进行转义
  3. 预处理,使用PDO::prepare 预处理SQL语句,有效防止SQL注入
  4. PDO::quote 转义特殊字符并加上引号