挖掘经验: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 ...
随机推荐
- excel 练习玩具统计项目组excel日报
import xlrd import xlwt import os,time import json from xlrd import xldate_as_tuple from datetime im ...
- 1143. Longest Common Subsequence
link to problem Description: Given two strings text1 and text2, return the length of their longest c ...
- Plastic Sprayers Manufacturer - The Basic Components Of A Spray Bottle
From cleaning to personal beauty, many people use spray bottles every day, but few people know how t ...
- JAVA web课堂测试1
1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分)2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分)3性别:要求用单选框或下拉框实现 ...
- 洛谷 P3009 [USACO11JAN]利润Profits
嗯... 题目链接:https://www.luogu.org/problemnew/show/P3009 这是DP的另一个功能,求最大子段和(最大子段和模板:https://www.luogu.or ...
- Centos610无桌面安装Docker-内核升级
1.查看当前操作系统和系统内核 (此处只需要注意一项centos6的docker源只有64位的,x86_64,32位的直接换系统吧) 查看当前内核版本uname -r 2.6.32-754.el6.x ...
- Java直通车——类与对象篇
一.面向对象 教师节来临,一群小学生应召出黑板报,该怎样完成呢?对于一个小孩子来说,你告诉他:“我们要确定黑板报主题.明确内容要旨.搜寻具体内容.构思版面布局.画图和写字.安排人员后勤辅助.”他可能会 ...
- 前端学习 之 JavaScript基础
一. JavaScript简介 1. JavaScript的历史背景介绍 1994年,网景公司(Netscape)发布了Navigator浏览器0.9版.这是历史上第一个比较成熟的网络浏览器,轰动一时 ...
- javascript入门教程02
JavaScript中的运算符 (1)算术运算符 + :相加 var a=123,b=45; document.write(a+b); - :相减 document.write(a-b); *:相乘 ...
- selenium webdriver 操作RadioButton
@Test public void testRadio() { WebDriver driver = ExplorerBase.IESetting(); try { Thread.sleep(500) ...