挖掘经验:sql注入经常出现在登录界面、获取HTTP请求头、订单处理等地方。而登录界面的注入现在来说大多是发生在HTTP头里面的client-ip和x-forward-for,一般用来记录登录的ip地址。
普通注入:
这里说的普通注入是指最容易利用的sql注入漏洞,比如通过注入union查询就可以查询数据库。源码如下:
<?php
$con=mysqli_connect("localhost","root","123456","test");
// 检测连接
if (mysqli_connect_errno())
{
echo "连接失败: " . mysqli_connect_error();
}
$id = $_GET['id'];
$result = mysqli_query($con,"select * from users where `id`=".$id);
while($row = mysqli_fetch_array($result))
{
echo $row['username'] . ": " . $row['address'];
echo "<br>";
}
?>
含有普通注入漏洞的数据库操作存在一些关键字,比如select from、mysql_connect、mysql_query、mysql_fetch_row等,数据库的查询方式还有update、insert、delete,我们在做白盒审计时,只需要查找这些关键字,即可定向挖掘SQL注入漏洞。
常用语句注释:
mysql_connect() 函数打开非持久的 MySQL 连接。mysql_connect(server,user,pwd,newlink,clientflag)
mysql_query() 函数执行一条 MySQL 查询。
mysql_query(query,connection)
|
参数
|
描述
|
|
query
|
必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
|
|
connection
|
可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。
|
mysql_fetch_row() 函数从结果集中取得一行作为数字数组。
语法
mysql_fetch_row(data)
|
参数
|
描述
|
|
data
|
必需。要使用的数据指针。该数据指针是从 mysql_query() 返回的结果。
|
编码注入:
1.宽字节注入:关于编码的小知识
尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。也有一些cms为了考虑老用户,所以出了gbk和utf-8两个版本。
以gbk字符编码为例,gbk是一种多字符编码
通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。
在php中,我们可以通过输出 echo strlen("我"); 来测试。当将页面编码保存为gbk时输出2,utf-8时输出3。
宽字节注入原理
1、数据库编码(GBK)与PHP编码(utf-8)不一致
2、PHP中使用了用于转义特殊字符的函数:
在mysql中,用于转义(即在字符串中的符号如单引号 ' ,双引号 " 反斜杠 \ 和 NULL 字符前加上"\")的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc(即魔术引号开关),不过高版本的PHP将去除这个特性。
出现这个漏洞的原因是在PHP连接Mysql的时候执行了如下设置:
set character_set_client=gbk
解决方法:在执行查询前先执行SET NAMES 'gbk',character_set_client=binary设置character_set_client为binary
测试代码:
?php
$conn = mysql_connect('localhost', 'root', '123456') or die('bad!');
mysql_select_db('test', $conn) OR emMsg("数据库连接失败");
mysql_query("SET NAMES 'gbk'",$conn);
$id = addslashes($_GET['id']);
$sql="SELECT * FROM kuanzifu WHERE id='$id' LIMIT 0,1";
$result = mysql_query($sql, $conn) or die(mysql_error());
$row = mysql_fetch_array($result);
if($row)
{
echo $row['username'] . $row['address'];
}
else
{
print_r(mysql_error());
}
?>
</font>
<?php
echo "<br>The Query String is : ".$sql ."<br>";
?>
对宽字节注入的挖掘方法也比较简单,只要搜索如下几个关键字即可:
SET NAMES character_set_client=gbk mysql_set_charset('gbk')
二次urldecode注入
只要字符被进行转换就有可能产生漏洞,现在的web程序大多都会进行参数过滤,通常使用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC的方式来防止注入,也就是给单引号(')、双引号(")、反斜杠(\)和NULL加上反斜杠转义。
如果某处使用了urldecode或者rawurldecode函数,则会导致二次解码生成单引号引发注入。原理是我们提交参数到webserver时,webserver会自动解码一次,假设目标开启GPC,我们提交了/1.php?id=1%2527,因为我们提交的参数里面没有单引号,所以第一次解码后的结果为id=1%27,%25解码的结果为%,如果程序里面使用了urldecode或者rawurldecode函数来解码id函数,则解码后的结果为id=1',单引号成功出现引发注入。
既然知道了原理主要是由于urldecode使用不当造成的,那我们就可以通过搜索urldecode和rawurldecode函数来挖掘urldecode注入漏洞。
总结:SQL注入漏洞的防范
在PHP中可以通过魔术引号来防范,不过魔术引号在PHP5.4后被取消,并且gpc在遇到int类型的注入时显得不那么给力了,所以通常用得多的还是过滤函数和类。当然最好的解决方案是利用预编译的方式。
1.gpc/runtime魔术引号
magic_quotos_gpc负责对GET、POST、COOKIE的值进行过滤,magic_quotos_runtime对从数据库或者文件中获取的数据进行过滤。通常在开启2个选项后能防止部分SQL注入漏洞,但在int类型是没多大用。
2.addslashes函数
addslashes函数过滤的值范围和GPC是一样的。他只是一个简单的检查的参数的函数,大多数程序使用它是在程序的入口,进行判断如果没有开启GPC,则使用它对$_POST/$_GET等变量进行过滤,不过它的参数必须是string类型。
3.mysql_[real_]escape_string函数
这两个函数都是对字符串进行过滤,在PHP4.0.3以上版本才存在。区别在于mysq_real_escape_string接受的是一个连接句柄并根据当前字符集转义字符串,所以推荐使用mysql_real_escape_string。
4.intval等字符进行转换
上面提到的过滤方式,在int类型注入时效果并不好,比如可以通过报错或者盲注等方式绕过,这时候intval等函数就起作用了,intval的作用是将变量转换为int类型。这里举例intval是要表达一种方式,一种利用参数类型白名单的方式来防止漏洞。
<?php
$id=intval("1 union select ");
echo $id;
?>
以上代码输出:1
5.过滤危险字符:多数cms都采用过滤危险字符的方式,例如,采用正则表达式匹配union、sleep、load_file等关键字,如果匹配到,就退出程序。
6.PDO 预编译语句
其实使用PDO预编译语句,需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增加、删除、修改、查询。
- PHP代码审计入门(SQL注入漏洞挖掘基础)
SQL注入漏洞 SQL注入经常出现在登陆页面.和获取HTTP头(user-agent/client-ip等).订单处理等地方,因为这几个地方是业务相对复杂的,登陆页面的注入现在来说大多数是发生在HTT ...
- 2020/1/27代码审计学习之SQL注入漏洞
PHP代码审计SQL注入漏洞 0x00 首先明确什么是SQL注入,SQL语句必须掌握. 常见的注入总的来说可以分为两大类:数字型和字符型. 这两类中包含了诸如报错注入,宽字节注入,盲注,二次注入,co ...
- 【代码审计】五指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 ...
- 【代码审计】iZhanCMS_v2.1 前台GoodsController.php页面存在SQL注入漏洞分析
0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...
- 【代码审计】iZhanCMS_v2.1 后台存在多个SQL注入漏洞分析
0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...
- 【代码审计】iCMS_v7.0.7 admincp.app.php页面存在SQL注入漏洞分析
0x00 环境准备 iCMS官网:https://www.icmsdev.com 网站源码版本:iCMS-v7.0.7 程序源码下载:https://www.icmsdev.com/downloa ...
随机推荐
- Jekyll+Github个人博客构建之路
请参考: http://robotkang.cc/2017/03/HowToCreateBlog/
- Spring扫描组件的使用详解
https://blog.csdn.net/you18131371836/article/details/53691044?utm_source=blogxgwz5
- 国内免费可用的STUN服务器(webrtc 必备)
更新于2017年8月,本人亲测,国内可用,而且速度非常快! webRTC不可缺少的环节. 免费 STUN服务器列表(亲测有效)NO. STUN服务器 端口 有效 测试日期1 stun.xten.com ...
- 超长干货丨Kubernetes网络快速入门完全指南
Kubernetes网络一直是一个非常复杂的主题.本文将介绍Kubernetes实际如何创建网络以及如何为Kubernetes集群设置网络. 本文不包括如何设置Kubernetes集群.这篇文章中的所 ...
- 三 模拟实现顺序表ArrayList
/** * 顺序表,重点是数组动态扩容,插入 * 底层采用数组,长度可以动态变化,此处采用增长一倍 * java.util.ArrayList每次增长50% * int newCapacity = ...
- 吴裕雄 PYTHON 神经网络——TENSORFLOW 滑动平均模型
import tensorflow as tf v1 = tf.Variable(0, dtype=tf.float32) step = tf.Variable(0, trainable=False) ...
- WLAN配置SKC
1.关于SKC WLC支持粘滞密钥缓存(Sticky Key Caching,SKC). 通过SKC,客户端为其关联的每个AP接收并存储不同的PMKID. AP还维护发布给客户端的PMKID数据库. ...
- MYSQL---外键 primary key 作用
https://www.cnblogs.com/x739400043/p/4732158.html 外键和级联 关于外键写的不错的网址:http://blog.csdn.net/lidaasky/ ...
- 测试Nginx中location的优先级!(重点)
location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ~ 开头表示区分大小写的正则匹配 ~* 开头表示不区分大小写的正则匹配 ^~ 开头表示uri以某个常规字符串开头 ...
- 什么是SOA架构
什么是SOA架构 SOA是Service-Oriented Architecture的首字母简称,它是一种支持面向服务的架构样式.从服务.基于服务开发和服务的结果来看,面向服务是一种思考方式.其实SO ...