免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息或工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任!
前言
今天学习了php代码审计的基础知识,然后使用bluecms和emlogcms进行了实验,代码审计前期需要使用到的工具phpstorm,cms坏境的搭建,mysql数据库监控工具。基础知识 sql注入常见的敏感函数:select,mysql_query 挖掘手法:
1. 数据库监控利用利用语句进行分析
2. SQL执行代码函数调用链追踪
3. 正则搜索:(update|select|insert|delete|).*?where.*=
如何快速的发现sql注入:
1. 看文件路径,首先看前台路径(如果是后台路径就可=可能会登录后台才能造成)
2. 看代码里面的变量是否可控
3. 看变量是否进行过滤
漏洞复现
bluecms
通过正则表达式搜索,并配合cnvd找到这个参数
进行代码分析,查看getone声明的含义是什么
在代码审计中经常用到的就是声明、用例和实现
转到第一个文件,查看query声明的是什么
发现query使用的是连接数据库的函数,而且在调用这个声明函数的整个过程都没有进行过滤
查看数据库中的表存在几个字段
构造poc:ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,database() 这里是会回显数据到html代码中
emlogcms
报错注入
通过cnvd分析知道文件在后台的co***.php中
通过文件名大致知道在comment文件中,找可控变量,没有进行过滤
这里的ip是可控的而且没有进行过滤,其余的列如id已经使用intval(这个函数也可以绕过)函数进行过滤
追踪delcommentbyip声明的含义
是一个sql查询语句,而且没有做任何过滤
回到comment.php文件我们需要让action变量为delbyip后才会执行到ip这个参数,但是这个文件没有给action变量赋值的命令,而文件开头引用了globals.php文件。
这里action可以直接使用get赋值
登录过后使用poc:/admin/comment.php?action=delbyip&ip=127.0.0.1 权限不足
通过上面的判断语句后,还有一层判断语句,检测token值
通过checkToken追踪到include/lib/loginauth.php这里写了可以使用get方法给token传值
登录后台获取token值
这些判断条件都满足后,最后会跳转删除界面
可以直接使用报错注入poc:/admin/comment.php?action=delbyip&ip=127.0.0.1'and(extractvalue(1,concat(0x7e,(select user()),0x7e))) --+&token=84735eeab8afdc7657efb14b2c64e24a
后台二次注入
根据cnvd提示是后台的user.php文件,但是没有找到可控参数,利用mysql(MySQL-Monitor-master)监控工具进行查看,把工具导入网站根目录,然后红色为连接成功
我们登录后台访问user.php文件,发现一个可能是传参的变量
使用正则搜索
这里是从数据库查询信息的语句
public function getUsers($email = '', $nickname = '', $page = 1) {
$condition = $limit = '';
if ($email) {
$condition = " and email like '$email%'";
}
if ($nickname) {
$condition = " and nickname like '%$nickname%'";
}
if ($page) {
$perpage_num = Option::get('admin_perpage_num');
$startId = ($page - 1) * $perpage_num;
$limit = "LIMIT $startId, " . $perpage_num;
}
$res = $this->db->query("SELECT * FROM " . DB_PREFIX . "user where 1=1 $condition order by uid desc $limit");
$users = [];
追踪一下getuser的用法
回到了user文件
if (empty($action)) {
$page = Input::getIntVar('page', 1);
$keyword = Input::getStrVar('keyword');
$email = $nickname = '';
if (filter_var($keyword, FILTER_VALIDATE_EMAIL)) {
$email = $keyword;
} else {
$nickname = $keyword;
}
$users = $User_Model->getUsers($email, $nickname, $page);
$usernum = $User_Model->getUserNum($email, $nickname);
$pageurl = pagination($usernum, Option::get('admin_perpage_num'), $page, "./user.php?page=");
include View::getAdmView('header');
require_once View::getAdmView('user');
include View::getAdmView('footer');
View::output();
}
添加用户发现用户名是随机生成的不可控
发现有个备份和导入数据库文件
看了一下data.php文件并没有对上传文件的sql语句进行检测
POC:INSERT INTO emlog_user VALUES('110','','Bn0lOrvu.B3jVC6wDnmimd6K8j1ukQ0.',(select version()),'writer','n','','[email protected] ' , '','','0','1711641244','1711641244');
访问user.php地址造成二次注入
总结
最开始的两个cms还可以理解,最后一个二次注入比较有难度,今天学习了代码审计很多小技巧,例如正则搜索,可控字符,是否过滤等。整个审计的过程是杂乱无章的,还需要努力学习。
原文始发于微信公众号(Piusec):CMS代码审计-SQL入门(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论