对于我自己来说没有采用MVC架构的cms,我比较喜欢直接从源码入手看看整个项目的逻辑以及公共函数文件看是否有啥可利用,然后就是采用黑白盒进行测试。
这个cms拿来作为新手入门也是蛮不错的啦 架构也没框架那么复杂~
看看整个项目的目录结构
先来看看整个项目公共函数的过滤等
根据入口文件查找一些相关config等(这个utf8就已经把宽字节排除在外咯
跟进到fun.inc.php文件过滤有没有不严谨的,若存在绕过的话那十有八九就存在问题了
//安全过滤函数
function safe_replace($string) {
$string = str_replace('%20','',$string);
$string = str_replace('%27','',$string);
$string = str_replace('%2527','',$string);
$string = str_replace('*','',$string);
$string = str_replace('"','"',$string);
$string = str_replace("'",'',$string);
$string = str_replace('"','',$string);
$string = str_replace(';','',$string);
$string = str_replace('<','<',$string);
$string = str_replace('>','>',$string);
$string = str_replace("{",'',$string);
$string = str_replace('}','',$string);
$string = str_replace('\\','',$string);
return $string;
}
//安全过滤函数
function safe_html($str){
if(empty($str)){return;}
$str=preg_replace('/select|insert | update | and | in | on | left | joins | delete |\%|\=|\/\*|\*|\.\.\/|\.\/| union | from | where | group | into |load_file
|outfile/','',$str);
return htmlspecialchars($str);
}
这里safe_replace()进行一些防护过滤一些危险字符,而safe_html防护sql注入,不过虽然过滤了但是可以利用大小写进行绕过,即只要带入数据库查询的地方利用此函数就会存在sql注入(但是safe_replace我实在是绕不过555
安装成功后会生成一个文件锁,且重新访问安装路径会先判断文件锁是否存在(且在进行安装时会判断文件锁是否存在),且在登陆后台过后整个install文件夹会被强制删除…除非找到任意文件删除
全局搜索safe_html,很多地方都调用了 但不是所以都存在注入,因为有些地方存在safe_replace与invtal的保护index.php?m=member&f=login_save
没办法绕过,且xdcms会员管理界面(但是我们暂时不能利用,因为实际我们不知道管理后台账号
member会员界面(单引号包裹且传参只经过safe_html过滤..且开启了报错提示,那就可用报错注入)可以利用报错注入,只要是只将safe_html带入数据库的查询则存在注入
这样就能查询出admin表里面的管理员信息。
/system/module/member/index
public function login_save(){
$username = safe_html($_POST['username']);
$password = safe_html($_POST['password']);
if(empty($username)||empty($password)){
showmsg(C('user_pass_empty'),'-1');
}
$sql="select * from ".DB_PRE."member where `username`='$username'";
if($this->mysql->num_rows($sql)==0){
showmsg(C('member_not_exist'),'-1');
}
$password=md5(md5($password));
$rs=$this->mysql->get_one($sql);
if($password!=$rs['password']){
showmsg(C('password_error'),'-1');
}
if($rs['is_lock']==1){
showmsg(C('user_lock'),'-1');
}
还有多处存在此注入
全局搜file_get_contents意外收获了unlink任意目录文件删除index.php?m=xdcms&c=data&f=delete&file=../../test
public function delete(){
$file=trim($_GET["file"]);
$dir=DATA_PATH.'backup/'.$file;
if(is_dir($dir)){
//删除文件夹中的文件
if (false != ($handle = opendir ( $dir ))) {
while ( false !== ($file = readdir ( $handle )) ) {
if ($file != "." && $file != ".."&&strpos($file,".")) {
@unlink($dir."/".$file);
}
}
closedir ( $handle );
}
@rmdir($dir);//删除目录
}
showmsg(C('success'),'-1');
}
这传入的参数没有过滤也没有白名单,直接拼接进dir,要想触发循环就得进行if判断,所以这里只能是../进行目录遍历可控进行任意文件夹删除
跟着uploadfile文件夹寻找文件上传点,对上传文件后缀进行了限制。
利用admin后台限制的文件格式更改即可上传木马getshell,也可利用上传文件后进行修改后缀。system/function/upload.inc.php(文中有多个文件上传的点
利用admin后台权限修改上传文件格式即可
我感觉不是mvc模式的话 整个项目的逻辑还是蛮清晰的,建议黑白盒审计,但是本人对大结构的框架还是晕晕的:)继续学习!