php代码审计3审计sql注入漏洞
SQL注入攻击(sql injection)被广泛用于非法获取网站控制权,在设计程序时,忽略或过度任性用户的输入,从而使数据库受到攻击,可能导致数据被窃取,更改,删除以及导致服务器被嵌入后门程序等
sql注入的条件
用户输入数据可控,源程序要执行代码,拼接了用户输入的数据
注入两大类型(不同数据库的比较方式不同)
数字型注入:当输入的参数为整数时,可认为是数字型注入(如 id 年龄,页码等都可以认为是数字型注入,并且不需要单引号来闭合)
$result = "select * freo admin where id=$id";
字符型注入:当输入的参数为字符串时。称为字符型,需要单引号来闭合
$result = "select * from admin where id='$id'";
<?php
$conn = mysql_connect('localhost', 'root', 'root') or die('bad!');
mysql_query("SET NAMES binary'");
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
//这里id没有做整形转换
$id = isset($_GET['id']) ? $_GET['id'] : 1;//sql语句没有做过滤,造成注入
$sql = "SELECT * FROM news WHERE id={$id}";
$result = mysql_query($sql, $conn) or die(mysql_error());
?>
注入的利用方式
查询数据
读写文件
执行命令
注入过程
攻击者访问页面
将包含有攻击字符组成的sql语句转发给数据库执行
数据库执行发回应用程序服务器
应用程序将内容返回浏览器,即成功攻击
盲注:在sql注入过程中,sql语句执行的选择后,选择的数据不在页面显示
基于布尔sql盲注
基于时间sql盲注
基于报错sql盲注
修复方案
使用预编译语句
使用存储过程
检查数据类型
使用安全函数过滤
宽字节注入及二次注入
宽字节注入:字符(charater)是组成字符集(character set)的基本单位,对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置,字符序(collation)指同一字符集内字符间的比较规则,由于ascll表示的字符只有128个,因此规范使用Unicode编码,但是使用ascll表示的字符使用Unicode并不高效,所以出现了中间格式字符集,被称为通用转换格式及UTF。GB2312 GBK GB118030 BIG5 Shift JIS等这些都是常说的宽字节,实际只有两字节,宽字节带来的安全问题主要是ascll字符(一字节)的现象
<?php
//连接数据库部分,注意使用了gbk编码,把数据库信息填写进去
$conn = mysql_connect('localhost', 'root', 'toor!@#$') or die('bad!');
mysql_query("SET NAMES 'gbk'");
mysql_select_db('test', $conn) OR emMsg("连接数据库失败,未找到您填写的数据库");
//执行sql语句
$id = isset($_GET['id']) ? addslashes($_GET['id']) : 1;
$sql = "SELECT * FROM news WHERE tid='{$id}'";
$result = mysql_query($sql, $conn) or die(mysql_error()); //sql出错会报错,方便观察
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="gbk" />
<title>新闻</title>
</head>
<body>
<?php
$row = mysql_fetch_array($result, MYSQL_ASSOC);
echo "<h2>{$row['title']}</h2><p>{$row['content']}<p>\n";
mysql_free_result($result);
?>
</body>
2</html>
SQL语句是SELECT * FROM news WHERE tid='{$id}',就是根据文章的id把文章从news表中取出来,在这个sql语句前面,使用了一个addslashes函数,将$id的值转义。这是通常cms中对sql注入进行的操作,只要我们的输入参数在单引号中,就逃逸不出单引号的限制,无法注入,addslashes函数产生的效果就是,让’变成\’,让引号变得不再是“单引号”,只是一撇而已。一般绕过方式就是,想办法处理\’前面的\,我们这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。如果我们输入%df’会看到报错,说明sql语句出错,看到出错说明可以注入了,为什么在’也就是%27前面加了一个%df就报错了?而且可以看到,报错的原因就是多了一个单引号,而单引号前面的反斜杠不见了,这就是mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就是%5c变成了一个汉字“運”,而’逃逸了出来。
原理:%df%27---->(addslashes)--->%df%5c%27------>(GBK)====運'用户输入---->g过滤函数--->代码层的$sql--->mysql处理请求--->mysql中的sql
默认编码character_set_client-->根据character_set_connection转换-->更新数据库是转换成字段对应的编码。
修复方案
使用mysql_set_charset(GBK)指定字符集
使用mysql_real_escape_string进行转义
二次注入
注入点因为经过过滤处理无法触发sqlsql注入漏洞,比如addslashes函数,将单引号等字符转义变成\’,但是存进数据库后数据又被还原,在这种情况下,如果发现一个新的注入同时引用了被插入的数据库数据时,就可以实现闭合新发现的注入漏洞引发二次注入,
利用思路:
现将注入语句插入到数据库,注册,留言等功能具有insert数据库的操作,然后在使用update的地方触发插入到数据库的注入语句。
一阶sql注入:发生在一个http请求和响应中,对系统的攻击是立即执行的,攻击者在http请求中提交非法输入,应用程序处理非法输入,使用非法输入构造sql语句,在攻击过程中向攻击者返回结果
二阶sql注入:攻击者在http请求中提交恶意输入,恶意输入保存在数据库中,攻击者提交第二次http请求,为处理第二次htt请求,程序在检索存储在数据库中的恶意输入,构造sql语句,如果攻击成功,在第二次请求响应中返回结果
代码1
<?php
include('./connect.php'); //引入数据库配置文件
$id=$_GET['id'];
$select_sql="SELECT * FROM article WHERE title='$id'";
echo $select_sql;
mysql_query('set names utf8');
$select_sql_result=mysql_query($select_sql);
$date=mysql_fetch_assoc($select_sql_result);
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><?php echo $date['title']."啦啦啦啦啦啦"?></title>
</head>
<body>
<h1><?php echo $date['title'] ?></h1><br />
作者:<?php echo $date['author'] ?><br/>
时间:<?php echo date("Y-m-d H:i:s",$date['dateline'])?><br />
概述: <?php echo $date['description']; ?><br />
正文: <?php echo $date['content'] ?>
</body>
</html>
代码2
<?php
include('../connect.php');
$title=addslashes($_POST['title']); //addslashes 将预定义字符串转义
$author=addslashes($_POST['author']);
$description=addslashes($_POST['description']);
$content=addslashes($_POST['content']);
$dataline=time();
$insert="INSERT INTO article(title,author,description,content,dateline) VALUES('$title','$author','$description','$content','$dataline')";
echo $insert;
mysql_query("set names utf8"); //设置编码
if($result=mysql_query($insert)){
$num=mysql_affected_rows($con);
echo $num;
}
?>
代码1是一个内容显示页面,通过传入的title在数据库进行查询,然后在页面调用输出,可以看到传递的参数id并没有经过过滤,可以成为一个典型的字符串GET注入,但是我们今天要讨论的是二次注入,暂时不考虑这个注入。代码2是一个添加页面,通过表单POST的数据执行INSERT语句插入数据,成功后返回数据库影响行数,而且这里的每一个参数都用addslashes函数进行了转义。两段代码结合,是一个典型的二次注入,虽然文章添加页面中过滤的非常严格,但是addslashes有一个特点就是虽然参数在过滤后会添加 “\” 进行转义,但是“\”并不会插入到数据库中,再配合内容显示页面中的查询是通过title查询的,所以可以利用这个构造一个二次注入。
php代码审计3审计sql注入漏洞的更多相关文章
- 2020/1/27代码审计学习之SQL注入漏洞
PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...
- 【代码审计】VAuditDemo SQL注入漏洞
这里我们定位 sqlwaf函数 在sys/lib.php中,过滤了很多关键字,但是42 43 44行可以替换为空 比如我们可以 uni||on来绕过过滤
- [CMS] UsualToolCMS-8.0 sql注入漏洞【转载】
原文地址:http://lyscholar.cn/2019/07/30/代码审计-usualtoolcms存在sql注入漏洞/ 0x01 漏洞环境 版本信息:UsualToolCMS-8.0-Rele ...
- [代码审计]DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入
0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...
- 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析
0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...
- 【代码审计】五指CMS_v4.1.0 后台存在SQL注入漏洞分析
0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...
- 【代码审计】大米CMS_V5.5.3 SQL注入漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- 【代码审计】XIAOCMS_后台database.php页面存在SQL注入漏洞
0x00 环境准备 XIAOCMS官网: http://www.xiaocms.com/ 网站源码版本:XiaoCms (发布时间:2014-12-29) 程序源码下载:http://www.xi ...
- 【代码审计】iZhanCMS_v2.1 前台IndexController.php页面存在SQL注入 漏洞分析
0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...
随机推荐
- 用Python语言设计GUI界面
我们大家都编写过程序,但是如果能够设计一个GUI界面,会使程序增添一个很大的亮点!今天就让我们来用目前十分流行的python语言写出一个最基本的GUI,为日后设计更加漂亮的GUI打下基础. 工具/原料 ...
- 02-26C#三级省市区ajax联动控件,利用UpdatePanel,以及页面取值
第一步:设置界面 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="PCAC ...
- MapReduce文件切分个数计算方法
转自:http://www.crazyant.net/1423.html Hadoop的MapReduce计算的第一个阶段是InputFormat处理的,先将文件进行切分,然后将每个切分传递给每个Ma ...
- EditText中onEditorAction监听事件执行两次
Android的EditText通过setOnEditorActionListener给文本编辑框设置监听事件,但是在其处理方法onEditorAction中的逻辑在每次回车后都触发了两次, 原来是在 ...
- 一次 Mysql 字符集的报错,最后让我万马奔腾!!!
wuba---深圳---龙岗周边----3000元--------- wuba---深圳---龙岗周边----5000元--------- wuba---深圳---龙岗周边----8000元----- ...
- MFC小程序
1.将菜单栏归零,工具栏放在窗口低部,加载自己新建的工具栏 CMainFrame::OnCreate()函数中 this->SetMenu(0); 2.将窗口初始化为最大化 APP类中:m_pM ...
- node.js中模块报错【window is not defined】的解决方法
(function(window) { /* Keep source code the same */ // })(typeof window == "undefined" ? g ...
- 459. Repeated Substring Pattern 判断数组是否由重复单元构成
[抄题]: Given a non-empty string check if it can be constructed by taking a substring of it and append ...
- struts2 与 spring 整合
1. 首先把所有jar包导入工程 2.在struts2的核心配置文件(在src文件目录下)中添加如下配置: <!-- 将Struts的对象交给Spring管理 所以需要导入Spring和Stru ...
- 安装 SQL Server 2014 Express
安装 SQL Server 2014 Express 我的电脑系统: Windows 10 64位 一 . 下载 安装Microsoft SQL Server 2014 Express 软甲下载地址: ...