ebook img

i 春秋月刊 4:SQL 注入 PDF

48 Pages·2018·7.165 MB·Chinese
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview i 春秋月刊 4:SQL 注入

半月刊第四期-SQL注入 01 SQL注入原理篇 - SQL注入初级………………………… 08 SQL注入中级………………………………………………… SQL注入高级………………………………………………… 12 SQL工具篇…………………………………………………… 14 DNS注入&sqlmap进行DNS注入…………………………… 16 11种常见SQLmap使用方法………………………………… 18 SQL注入工具………………………………………………… 23 SQL注入工具拓展篇………………………………………… 25 SQL注入实战篇 - Thinkphp框架 3.2.x sql注入漏洞分 析 …………………………………………………………… 28 ThinkPHP框架 < 5.0.16 sql注入漏洞分析……………… 36 宽字节注入详解 第二集 ………………………………… 44 03 半月刊第四期-SQL注入 01 SQL注入原理篇 - SQL注入初级………………………… 08 SQL注入中级………………………………………………… SQL注入高级………………………………………………… 12 SQL工具篇…………………………………………………… 14 DNS注入&sqlmap进行DNS注入…………………………… 16 11种常见SQLmap使用方法………………………………… 18 SQL注入工具………………………………………………… 23 SQL注入工具拓展篇………………………………………… 25 SQL注入实战篇 - Thinkphp框架 3.2.x sql注入漏洞分 析 …………………………………………………………… 28 ThinkPHP框架 < 5.0.16 sql注入漏洞分析……………… 36 宽字节注入详解 第二集 ………………………………… 44 03 半月刊第四期-SQL注入 SQL 注入原理篇 -SQL 注入初级 作者:zusheng 前言 目录 不管用什么语言编写的Web应用,它们都有一个共同点, 第一节 注入攻击原理及自己编写注入点 具有交互性并且多数是数据库驱动。在网络中,数据库 驱动的Web应用随处可见,由此而存在的SQL注入是影 • 1.1、什么是SQL? 响企业运营且最具破坏性的漏洞之一,这里我想问,我 • 1.2、什么是SQL注入? 们真的了解SQL注入吗?看完本篇文章希望能让你更加 • 1.3、SQL注入是怎么样产生的? 深刻的认识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编写注入点 02 半月刊第四期-SQL注入 输入参数ichunqiu,修改所要执行SQL语句逻辑,达到 攻击的目的。 第五步:执行完查询,我们再对结果进行处理 1.4编写注入点 为了照顾一下新人,这里先介绍一下涉及到的基础知识: mysql_fetch_array(data,array_type) data 可选。规定要使用的数据指针。该数据指针是 mysql_query() 函数产生的结果。 array_type 可选。规定返回哪种结果。可能的值: SQL SELECT 语法 MYSQL_ASSOC - 关联数组 MYSQL_NUM - 数字数组 SELECT 列名称 FROM 表名称; MYSQL_BOTH - 默认。同时产生关联和数字数组 符号 * 取代列的名称是选取所有列 WHERE 子句 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语 题外话:我们使用echo将执行的SQL语句输出,方便 句。 我们查看后台执行了什么语句。 SELECT 列名称 FROM 表名称 WHERE 列 运算符 值 最终代码如下: echo $querry 下面的运算符可在 WHERE 子句中使用: 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'>"; 第一步:我们使用if语句来先判断一下变量是否初始 echo "<tr>"; 化 echo "<td>id</td>"; echo "<td>username</td>"; <?php echo "</tr>"; if(isset($_GET["ichunqiu"])) echo "<tr>"; { echo "<td>".$result['id']."</td>"; echo "<td>".$result['username']."</td>"; echo "</tr>"; } echo "</table>"; ?> mysql_close($con); echo $querry; } ?> 第二步:在if语句里面,我们连接数据库。在PHP中, 这个任务通过 mysql_connect() 函数完成。 MySQL数据库实验环境配置: mysql_connect(servername,username,password); 代码层工作已经做好,但是在数据库里面,我们还没有 servername 可选。规定要连接的服务器。默认是 "localhost:3306"。 ichunqiu这个数据库啊,接下来我就带大家一步步创 username 可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。 password 可选。规定登录所用的密码。默认是 ""。 建数据库,创建表,创建列,插入数据。 第一步:创建数据库 第三步:连接成功后,我们需要选择一个数据库。 mysql_select_db(database,connection) database 必需。规定要选择的数据库。 connection 可选。规定 MySQL 连接。如果未指定,则使用上一个连接。 第四步:选择完数据库,我们需要执行一条 MySQL 查询。 mysql_query(query,connection) query 必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。 connection 可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连 接。 03 半月刊第四期-SQL注入 第三步:我们插入几条数据 同样的道理,大家多插几条数据。到此我们整个任务就 完成了。 最终成果如下: 第二步:创建表users和列id,username,password 04 半月刊第四期-SQL注入 第二节 寻找及确认SQL 注入 2.1推理测试法 寻找SQL注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。 首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个: • GET请求:该请求在URL中发送参数。 • POST请求:数据被包含在请求体中。 • 其他注入型数据:HTTP请求的其他字段也可能会触发SQL注入漏洞。 了解完数据的输入方式,我们接下来再学习数据库错误。这里我们以MySQL为例,其它的请大家自行学习咯。 我们现在参数后面加个单引号,如下图: sql语句最终变为: select * from users where id = 1' 执行失败,所以mysql_query()函数会返回一个布尔值,在下行代码中mysql_fetch_array($sql)将执行失败,并且 PHP会显示一条警告信息,告诉我们mysql_fetch_array()的第一个参数必须是个资源,而代码在实际运行中,给出 的参数值却是一个布尔值。 我们修改代码在 $sql = mysql_query($querry,$con);下一行加上 var_dump($sql); 为了更好的了解MySQL错误,我们在 $ s q l = m y s q l _ q u e r y ( $ q u e r r y , $ co n ) ; 加上 if(!$sql) { die('<p>error:'.mysql_error().'</p>') ; } 05 半月刊第四期-SQL注入 这样当应用捕获到数据库错误且SQL查询失败时,就会返回错误信息:(我们在参数中添加单引号返回的错误信息) 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 然后借助这些错误,我们这可以推断应该存在SQL注入。还有其他数据库错误信息,以及MySQL其他错误信息,由于 篇幅问题就不一一讲解了。 2.2 and大法和or大法 页面不返回任何错误信息,我们就可以借助本方法来推断了,首先我们在参数后面加上 and 1=1和and 1=2看看有 什么不同 可以发现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>"; } 0066 半月刊第四期-SQL注入 2.3、加法和减法 这里我们需要区分一下数字型和字符串型: • 数字型:不需要使用单引号来表示 • 其他类型:使用单引号来表示 综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了。 加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在URL中是有特效含义的,所以我们要对 其进行url编码,最后也就是%2b。 减法是同样的道理,不过我们不需要对-号进行url编码了。 结束语 感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇 教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正, 谢谢。 07 半月刊第四期-SQL注入 SQL 注入攻击中级 据库,我们加个单引号。 前言 error:You have an error in your SQL syntax; check the 找到SQL注入漏洞后,我们可以用它来干什么呢?那么 manual that corresponds to your MySQL server version 本篇文章给大家带来的就是SQL注入漏洞利用技术,现 从错误信息中,我们就可以发现是MySQL。 在是时候让我们去体验一下漏洞利用的乐趣了。 Microsoft OLE DB Provider for ODBC Drivers 错误 上'8面00错40e误14信' 息可以发现是Microsoft SQL Server,如果 错误信息开头是ORA,就可以判断数据库是Oracle,很 目录 简单,道理都是一样的,就不一一列举了。 基于数字函数推断 第三节 利用SQL注入 数据库服务器 函数 Microsoft SQL Server @@pack_received、@@ • 3.1、识别数据库 rowcount • 3.2、UNION语句提取数据 • 3.3、枚举数据库 MySQL connection_id()、last_ • 3.4、窃取哈希口令 insert_id()、row_ • 3.5、获取WebShell count() Oracle BITAND(1,1) 第四节 SQL盲注利用 PostgreSQL select EXTRACT(DOW FROM NOW()) • 4.1、初识SQL盲注 这里以我们搭建的环境为例来做推断: • 4.2、SQL盲注入技术-基于布尔 • 4.3、SQL盲注入技术-基于时间 connection_id()不管它值多少,基本上都是正的,也 • 4.4、我们的好朋友-Python 就是为真,last_insert_id()用法大家自行百度,这里 不存在insert语句,默认情况就是返回零,也就是假。 那么如果and connection_id()数据返回正常,and 正文 last_insert_id()不返回数据,我们就可以推断这是一 个MySQL数据库了。 第三节 利用SQL注入 3.1、识别数据库 要想发动sql注入攻击,就要知道正在使用的系统数据 库,不然就没法提取重要的数据。 首先从Web应用技术上就给我们提供了判断的线索: • ASP和.NET:Microsoft SQL Server • PHP:MySQL、PostgreSQL • Java:Oracle、MySQL Web容器也给我们提供了线索,比如安装IIS作为服 务器平台,后台数据及很有可能是Microsoft SQL 3.2、UINON语句提取数据 Server,而允许Apache和PHP的Linux服务器就很有可 能使用开源的数据库,比如MySQL和PostgreSQL。 UNION操作符可以合并两条或多条SELECT语句的查询结 果,基本语法如下: 基于错误识别数据库 大多数情况下,要了解后台是什么数据库,只需要看一 条详细的错误信息即可。比如判断我们事例中使用的数 08 半月刊第四期-SQL注入 select column-1 column-2 from table-1 得到列数后我们还需要满足第二个条件 UNION select column-1 column-2 from table-2 如果应用程序返回了第一条查询得到的数据,我们就可 以在第一条查询后面注入一个UNION运算符来添加一个 任意查询,来提取数据,是不是很容易啊,当然在使用 UNION之前我们必须要满足两个条件: • 两个查询返回的列数必须相同 • 两个查询语句对于列返回的数据类型必须相同 首先我来看第一个条件,如何知道第一条查询的列数 呢?我们可以使用NULL来尝试,由于NULL值会被转换 成任何数据类型,所以我们不用管第二个条件。 很简单,只要一次一列使用我们的测试字符串替换 NULL即可,可以发现第一列和第二列都可以存放字符 串,第三列数据没有输出。 接下来就让我们提取数据库用户名和版本号: 就是这样的一个个加上去进行尝试,直到不返回错误。 神奇的ORDER BY子句 除了上述方法,我们还可以是用order by子句得到准 3.3、枚举数据库 确列数 这里由于篇幅问题,我们只以MySQL数据库为例了, 枚举数据库并提取数据遵循一种层次化的方法,首先 我们提取数据库名称,然后提取表,再到列,最后才 是数据本身。要想获取远程数据库的表、列,就要访 问专门保存描述各种数据库结构的表。通常将这些结 构描述信息成为元数据。在MySQL中,这些表都保存 在information_schema数据库中 第一步:提取数据库 在MySQL中,数据库名存放在information_schema数 据库下schemata表schema_name字段中 id=1 union select null,schema_name,null from 我们先尝试了12,返回错误,说明列数是小于12的, information_schema.schemata 我们继续尝试了6,返回错误,同理,列数小于6的, 我们尝试3,返回正常,说明列数是大于等于3的,继 续尝试4,返回错误。说明列数是小于4,列数大于等于3, 小于4,可以得到列数是3。使用order by子句可以帮 助我们快速得到列数。 09

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.