挖掘经验: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 ...
随机推荐
- 写作环境搭建(git+github+markdown+jekyll)
转载自: https://site.douban.com/196781/widget/notes/12161495/note/264946576/ 2013-03-04 19:33:10 --- ...
- 时间同步服务器ntpd的搭建
如果系统没有默认安装,可以手动安装,一条命令就可以搞定: yum install ntp -y 安装之后修改配置文件: vim /etc/ntp.conf #restrict 127.0.0.1 #r ...
- PCC值average pearson correlation coefficient计算方法
1.先找到task paradise 的m1-m6: 2.根据公式Dy=D1* 1/P*∑aT ,例如 D :t*k1 a:k2*k1: Dy :t*k2 Dy应该有k2个原子,维度是t: 3.依 ...
- VS中消除ANSI API警告
最近在VS上写网络程序遇到许多问题,因为VS中将许多ANSI中的API都重写了,那些API大多有漏洞或不能支持现在的一些编程需求了,所以在VS中使用会因为警告而不能用. 但一些老API用着比较方便,了 ...
- python写入文件中遇到 UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
在写入TXT文件时,某些页面总是报UnicodeEncodeError: ‘gbk’ codec can’t encode character错误,网上找了半天也没找到解决办法. 后来终于找到了解决办 ...
- 【转】centos升级curl版本
1.安装repo rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/rhel6/x86_64/city-fan.org-release-2-1 ...
- 1082 Read Number in Chinese (25分)
// 1082.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <string> #include <vecto ...
- 添加COOKIE
HttpCookie userinfoCookie = new HttpCookie("userinfo"); JObject o = new JObject();//JObjec ...
- jquery中 $(xxx).each() 和 $.each()的区别,以及enter键一键登录
1.$().each 在dom处理上面用的较多.如果页面有多个input标签类型为text,对于这时用$().each来处理多个text,例如: $("input[type=’text’]& ...
- 「CF383C Propagating tree」
这应该属于一个比较麻烦的数据结构处理树上问题. 题目大意 给出一颗根节点编号为 \(1\) 的树,对于一个节点修改时在它的子树中对于深度奇偶性相同的节点加上这个权值,不同则减去这个值,单点查询. 分析 ...