漏洞分为系统漏洞和应用漏洞,系统漏洞以二进制漏洞为代表,其挖掘难度较高需要对反汇编和操作系统原理深入理解,而除了系统漏洞以外还有一些应用漏洞,包括不限MySQL,Apache,为代表的Web漏洞,这里我们就挖掘PHP代码层面的漏洞。

漏洞的挖掘也分为,点对点挖掘漏洞,和分散式挖掘漏洞,这我们主要使用点对点挖掘,在挖掘是我们需要找一些关键字,漏洞本身就是两个条件,可控的函数,和可控的变量。

1.首先打开about.php源代码,然后 $GET[r] 通过GET的方式接收一个传递参数,然后通过使用 addslashes 函数过滤,addslashes函数的作用是转义,将多余的单引号全部转义,转义以后交给llink变量保存结果,然后拼接SQL查询语句,由于拼接代码 $llink中存在单引号,那我们需要手动闭合单引号,一旦闭合单引号addslashes函数就起了作用,会自动过滤掉单引号,所以这里无法被绕过。

<?php
require 'inc/conn.php';
require 'inc/time.class.php';
$query = "SELECT * FROM settings";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$info = mysql_fetch_array($resul);
$llink = addslashes($_GET['r']);
$query = "SELECT * FROM nav WHERE link='$llink'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$navs = mysql_fetch_array($resul);
?>

2.打开另一个 content.php 观察下方的PHP代码,虽然有很多处数据库的操作,但是带入查询时都是通过单引号括起来的,并且每一个语句都强制使用addslashes函数进行了不同程度的转义,这里并没有可利用的地方。

<?php
require 'inc/conn.php';
require 'inc/time.class.php';
$query = "SELECT * FROM settings";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$info = mysql_fetch_array($resul); $id=addslashes($_GET['cid']);
$query = "SELECT * FROM content WHERE id='$id'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$content = mysql_fetch_array($resul); $navid=$content['navclass'];
$query = "SELECT * FROM navclass WHERE id='$navid'";
$resul = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$navs = mysql_fetch_array($resul); //浏览计数
$query = "UPDATE content SET hit = hit+1 WHERE id=$id";
@mysql_query($query) or die('修改错误:'.mysql_error());
?>
<?php
$query=mysql_query("select * FROM interaction WHERE (cid='$id' AND type=1 and xs=1)");
$pinglunzs = mysql_num_rows($query)
?>

3.打开 submit.php 文件,观察代码发现这里作者写遗漏了,这里并没有过滤函数的过滤,而且都是POST方式传递的参数,明显可以使用POST注入。

<?php
session_start();
require 'inc/conn.php';
$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'];

将代码向下翻,可以看到  SELECT * FROM interaction WHERE( mail = '$mail') 这么一条查询语句,这条语句虽然 $mail  参数被加了单引号,但是由于没有进行有效的过滤,所以我们可以通过构建一些SQL语句巧妙地闭合它。

//查询用户头像数据
$query = "SELECT * FROM interaction WHERE( mail = '$mail')";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$tx = mysql_fetch_array($result);
if (!mysql_num_rows($result)){
$touxiang = mt_rand(1,100);
}else{
$touxiang = $tx['touxiang'];
}

继续向下找,同样的在最下方也发现了存在查询语句  SELECT * FROM download WHERE( id= $cid) 这个cid参数,也没有进行合法化的检查,也是一个SQL注入漏洞。

if ($type==3){
$query = "SELECT * FROM download WHERE( id= $cid)";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$wz = mysql_fetch_array($result);
$title=$wz['title'];
$body ='<div style="border:1px double #06f;">

上方两处就是这个CMS系统的注入漏洞,虽然mail参数上有单引号,但是并没有检查合法化,这里我们只需要将其闭合掉就可以。

这两个变量我们能够操作他,因为它带入到数据库查询了,我们只需要把前面的单引号闭合掉。

4.上方的漏洞文件在  /files/submit.php,且文件的开头都是 $_POST['xxx']; 明显这是POST注入,这里如果直接使用 http://127.0.0.1/cms/files/submit.php 访问的话会报错,原因是包含不到 require 'inc/conn.php'; 这个文件,我们继续看下主 index.php 是怎么包含的,如下代码:

<?php
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>

如上:首先通过 $_GET['r] 接收一个参数,然后传递给file,action 如果为空则等于index,最终包含 files/.action.php,如果要访问  /files/submit.php 包含以后的写法是:?r=submit 或者完整写法 /index.php?r=submit

5.为了方便演示,我们在 submit.php 文件中加入以行打印函数,echo $mail; 打印出mail里面的参数

<?php
session_start();
require 'inc/conn.php';
$type=addslashes($_GET['type']);
$name=$_POST['name'];
$mail=$_POST['mail'];
echo $mail; < ------------------------
$url=$_POST['url'];

然后使用火狐浏览器的hackBar插件进行POST注入,如下图注入成功了。

除此之外,login.php 文件中也存在一个注入漏洞  /cms/admin/?r=login ,我们可以直接写出他的exp ,但是这里没有地方可以完成回显,但漏洞是存在的。

直接记下 http://127.0.0.1/cms/admin/?r=login 网址然后,我们打开SQLMAP跑一下。

审计一套CMS中的SQL注入的更多相关文章

  1. 在php中防止SQL注入的方法

    摘要:我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PH ...

  2. Python中防止sql注入的方法详解

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文章主要给大家介绍了关于Python中 ...

  3. Django中的sql注入

    Django中防止SQL注入的方法 方案一总是使用Django自带的数据库API.它会根据你所使用的数据库服务器(例如PostSQL或者MySQL)的转换规则,自动转义特殊的SQL参数.这被运用到了整 ...

  4. DEDECMS数据库执行原理、CMS代码层SQL注入防御思路

    我们在上一篇文章中学习了DEDECMS的模板标签.模板解析原理,以及通过对模板核心类的Hook Patch来对模板的解析流量的攻击模式检测,达到修复模板类代码执行漏洞的目的 http://www.cn ...

  5. Java应用开发中的SQL注入攻击

    1. 什么是SQL注入攻击? SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员越来越多.但是由于程序员的水平及经验参差不齐,相当一部分 ...

  6. php中防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

  7. 转:PHP中防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

  8. mysql基础语法及拓展到web中的sql注入

    本来是想写下javaweb的mvc(tomcat, spring, mysql)的搭建,  昨天搭到凌晨3点, 谁知道jdbcTemplate的jar包不好使, 想死的心都有了, 想想还是休息一下, ...

  9. ASP.NET中的SQL注入攻击与防护

    什么是SQL注入攻击? 它是在执行SQL查询的时候,由于接收了用户的非法参数从而导致,所执行的SQL语义与业务逻辑原本所要查询的语义不相符,从而实现的攻击. 例如我们经常使用的用户登录,通常会出现这样 ...

随机推荐

  1. RuntimeException异常处理汇总

    Java中所有异常的父类是Throwable类,在Throwable类下有两大子类: 一个是Error类,指系统错误异常,例如:VirtualMachineError 虚拟机错误,ThreadDeat ...

  2. Android 之Activity启动模式(二)之 Intent的Flag属性

    首页博客链接关于我留言板 前面介绍了通过launchMode设置Activity的启动模式.本章接着介绍Activity的启动模式相关内容,讲解的内容是Intent与启动模式相关的Flag,以及and ...

  3. 2019balsn两道web和2019巅峰极客一道web记录

    遇到3道有点意思的web,记录一下~ web1 题目地址:http://warmup.balsnctf.com/ 源码如下所示: <?php if (($secret = base64_deco ...

  4. 文本处理三剑客之awk

    简介 awk是一种处理文本文件的语言,是一个强大的文本编辑工具.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理. gawk 用法:gawk [optio ...

  5. RISC-V riscv64-unknown-elf

    riscv64-unknown-elf 为 RISC-V指令集的交叉编译工具 以下环境在Liunx ubuntu x86_64 环境下进行,下面示例以生成32位文件为目标来操作使用. screen / ...

  6. vagrant系列三:vagrant搭建的php7环境

    原文:https://blog.csdn.net/hel12he/article/details/51107236 前面已经把vagrant的基础知识已经基本过了一遍 了,相信只要按着教程来,你已经搭 ...

  7. Razor字符串处理

    需要注意的是低版本是不支持C# 6语法中的string interpolation的 <label> @if (!string.IsNullOrEmpty(Model.BudgetValu ...

  8. mac安装mysql数据库及配置环境变量

    mac安装mysql数据库及配置环境变量 mac安装mysql数据库及配置环境变量 原文文链接:https://blog.csdn.net/qq_36004521/article/details/80 ...

  9. JAVA将两个byte数组合并为一个

    /** * 将两个byte数组合并为一个 * @param data1 要合并的数组1 * @param data2 要合并的数组2 * @return 合并后的新数组 */ public stati ...

  10. SQL-W3School-基础:SQL INSERT INTO 语句

    ylbtech-SQL-W3School-基础:SQL INSERT INTO 语句 1.返回顶部 1. INSERT INTO 语句 INSERT INTO 语句用于向表格中插入新的行. 语法 IN ...