【渗透攻防WEB篇】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语句达到代码执行进行攻击目的的技术。
1.3、SQL注入是怎么样产生的?
构造动态字符串是一种编程技术,它允许开发人员在运行过程中动态构造SQL语句。开发人员可以使用动态SQL来创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准来决定提取什么字段(如SELECT语句),或者根据不同的条件来选择不同的查询表时,动态构造SQL语句会非常有用。
在PHP中动态构造SQL语句字符串:
$query = "SELECT * FROM users WHERE username = ".$_GET["ichunqiu"];
看上面代码我们可以控制输入参数ichunqiu,修改所要执行SQL语句,达到攻击的目的。
1.4、编写注入点
为了照顾一下新人,这里先介绍一下涉及到的基础知识:
SQL SELECT 语法
SELECT 列名称 FROM 表名称
符号 * 取代列的名称是选取所有列
WHERE 子句
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在 WHERE 子句中使用:
了解了以上基础知识就让我们来自己编写注入点把。
第一步:我们使用if语句来先判断一下变量是否初始化
<?php
if(isset($_GET["ichunqiu"])){
}
?>
第二步:在if语句里面,我们连接数据库。在PHP中,这个任务通过 mysql_connect() 函数完成。
mysql_connect(servername,username,password);
servername 可选。规定要连接的服务器。默认是 "localhost:3306"。
username 可选。规定登录所使用的用户名。默认值是拥有服务器进程的用户的名称。
password 可选。规定登录所用的密码。默认是 ""。
第三步:连接成功后,我们需要选择一个数据库。
mysql_select_db(database,connection)
database 必需。规定要选择的数据库。
connection 可选。规定 MySQL 连接。如果未指定,则使用上一个连接。
第四步:选择完数据库,我们需要执行一条 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将执行的SQL语句输出,方便我们查看后台执行了什么语句。
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这个数据库啊,接下来我就带大家一步步创建数据库,创建表,创建列,插入数据。
第一步:创建数据库




- 第二节 寻找及确认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错误,我们在
$sql = mysql_query($querry,$con);
加上
if(!$sql)
{
die('<p>error:'.mysql_error().'</p>');
}
这样当应用捕获到数据库错误且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>";
}
然后你就可以发现:
2.3、加法和减法
这里我们需要区分一下数字型和字符串型:
- 数字型:不需要使用单引号来表示
- 其他类型:使用单引号来表示
综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了。
加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b。
减法是同样的道理,不过我们不需要对-号进行url编码了。
结束语
感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正,谢谢。
文章首链:http://bbs.ichunqiu.com/thread-9518-1-1.html
感谢您的阅读,如果您学到了,请点赞(码字不易)!
欢迎热心园友补充!
作者:zusheng
系列文章预告及导航
渗透攻防Web篇-SQL注入攻击中级(状态:更新中)
- 第三节 利用SQL注入
- 第四节 SQL盲注利用
渗透攻防Web篇-SQL注入攻击高级(状态:更新中)
- 第五节 避开过滤方法总结
- 第六节 探讨SQL注入防御技巧
【渗透攻防WEB篇】SQL注入攻击初级的更多相关文章
- 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级
[web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...
- 【渗透攻防Web篇】SQL注入攻击高级
前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 ...
- 渗透攻防Web篇-深入浅出SQL注入
1 背景 京东SRC(Security Response Center)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致. 2 手工检测 2.1 前 ...
- 2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践
第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统 ...
- SQL注入攻击三部曲之高级篇
SQL注入攻击三部曲之高级篇 经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意.正所谓学海无涯,技术的进步也是没有止境的.SQL注入是一个看起来简单,但是变数很多的 ...
- SQL注入攻击三部曲之入门篇
SQL注入攻击三部曲之入门篇 服务器安全管理员和攻击者的战争仿佛永远没有停止的时候,针对国内网站的ASP架构的SQL注入攻击又开始大行其道.本篇文章通过SQL注入攻击原理引出SQL注入攻击的实施方法, ...
- 2017-2018-2 20179205《网络攻防技术与实践》第十一周作业 SQL注入攻击与实践
<网络攻防技术与实践>第十一周作业 SQL注入攻击与实践 1.研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 缓冲区溢出原理 在计算机内部,输入数据通常被存放在一个临时空间内, ...
- Web安全篇之SQL注入攻击
在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...
- SQL注入攻击三部曲之进阶篇
SQL注入攻击三部曲之进阶篇 通过入门篇的学习,我们知道了SQL注入攻击的判断方法,但是如果想侵入网站,获取网站的机密内容,那么仅靠入门篇的知识是无法达到的.本篇文章我们将进一步的分析SQL注入攻击. ...
随机推荐
- hibernate的理解
emm~这里就是记录一下,hibernate的save,如果存在id,就可以直接save,就会覆盖原有的,如果不存在id就会在数据库创建一条新的记录 package edu.zut.cs.zutnlp ...
- unity 傅老师学习
辅助插件 I tweeen anmition 补充valueto https://www.bilibili.com/read/cv103358 开关门 iTween event脚本 iT ...
- node.js 从入门到。。。
本人安装环境为 mac ,所以只记录了 mac 下的操作步骤 1.安装 node node的国内下载地址:http://nodejs.cn/download/ 安装之后,在终端输入指令 node -v ...
- mysql8.0 1251错误
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; ALTER USER '; FLUSH PR ...
- python3 第三十四章 - 聊聊File对象
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 序号 方法及描述 实例 1 file.close() 关闭文件.关闭后文件不能再进行读写操作. 方法用于关闭一个已打 ...
- Unity Button事件的简洁处理
看到很多人依然还是通过最原始的方法给button绑定事件并处理,这种通过Find往子集一个个的查找,获取到后再绑定事件这种操作很费事,有些人则是对查找对象写了个方法自动往子集遍历更方便获取对象,但还是 ...
- p2p技术之n2n源码核心简单分析一
首先在开篇之前介绍下内网打洞原理 场景:一个服务器S1在公网上有一个IP,两个私网机器C1,C2 C1,C2分别由NAT1和NAT2连接到公网,我们需要借助S1将C1,C2建立直接的TCP连接,即由C ...
- iOS 关于重定向的那些事(NSURLProcotol-WKWebView)
重定向定义:重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向.域名的重定向.路由选择的变化也是对数据报文经由路径的一种重定向). NSURLProt ...
- SQL 语句中 where 条件后 写上1=1 的意思
这段代码应该是由程序(例如Java)中生成的,where条件中 1=1 之后的条件是通过 if 块动态变化的.例如: String sql="select * from table_nam ...
- python3.0 第三天 文件操作
文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 Somehow, it seems the love I knew was alway ...