mysql注入攻击实_【渗透攻防WEB篇】SQL注入攻击初级

本文介绍了SQL注入的原理,展示了如何编写注入点并寻找确认SQL注入。通过PHP示例,解释了动态SQL语句导致的安全风险,以及通过推理测试法、AND大法和OR大法来检测SQL注入漏洞。文章还提到了数据库错误信息在检测过程中的作用,为读者提供了深入理解SQL注入的初级教程。
摘要由CSDN通过智能技术生成

前言

不管用什么语言编写的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 子句中使用:

2b942f0eaca22fae5b5b43c0d718cd3d.png

了解了以上基础知识就让我们来自己编写注入点把。

第一步:我们使用if语句来先判断一下变量是否初始化

}?>

第二步:在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 "

idusername
".$result['id']."".$result['username']."
";mysql_close($con);echo $querry;

}?>

MySQL数据库实验环境配置:

代码层工作已经做好,但是在数据库里面,我们还没有ichunqiu这个数据库啊,接下来我就带大家一步步创建数据库,创建表,创建列,插入数据。

第一步:创建数据库

35ce14edd45e9bbedbf30ccd90030d40.png

第二步:创建表users和列id,username,password

47589bbc05b49bc5db300892d2508ac6.png

264df7c5e3d76f3463036ba8c18c2dcd.png

第三步:我们插入几条数据

ba6e724b1f5b1bfa9388ee3e8d28eb9b.png

同样的道理,大家多插几条数据。到此我们整个任务就完成了。

d7d2e3452abfec035fa16103e94a0e50.png

第二节 寻找及确认SQL注入

2.1、推理测试法

寻找SQL注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。

首先我们需要了解数据是通过什么方式进行输入,这里我总结了三个:

GET请求:该请求在URL中发送参数。

POST请求:数据被包含在请求体中。

其他注入型数据:HTTP请求的其他内容也可能会触发SQL注入漏洞。

了解完数据的输入方式,我们接下来再学习数据库错误。这里我们以MySQL为例,其它的请大家自行学习咯。

我们现在参数后面加个单引号,如下图:

34ad1bebb9eede98981b515de7a93db9.png

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);

可以发现:

01212e37b982754dc6fbfd0bfb21a918.png

为了更好的了解MySQL错误,我们在

$sql = mysql_query($querry,$con);

加上

if(!$sql)

{die('

error:'.mysql_error().'

');

}

这样当应用捕获到数据库错误且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看看有什么不同

e8910ab9ab58583d17ac892d37716797.gif

可以发现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是没有数据的。

8d1f7887f3744a7c47a4249eb48fa278.png

可以发现我们加上or 1=1就成功返回了数据,这是因为1=1为真,不管前面是不是假,数据都会返回,这样就把表里面数据全部返回,我们没看见,是因为代码中并没有迭代输出。这样,我们来修改一下代码。

echo "

idusername

while ($result = mysql_fetch_array($sql)) {echo "

";echo "" . $result[0] . "";echo "" . $result[1] . "";echo "";

}

然后你就可以发现:

7c12c933933f4e430006ab1ae7dbcdc1.gif

2.3、加法和减法

这里我们需要区分一下数字型和字符串型:

数字型:不需要使用单引号来表示

其他类型:使用单引号来表示

综合上述,我们可以发现我们的例子是数字型的,这样我们就可以使用加法和减法来判断了。

加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b。

909a7ba80c617d7cae8629e904898724.png

减法是同样的道理,不过我们不需要对-号进行url编码了。

11fc9f3b79a3b65de8db9e66bc6fad61.gif

结束语

感谢大家的支持吧,在此我也总结一下前面自己的不足,由于篇幅很长,宽度是到位了,但是并没有深入,也不算详细,所以本篇教程分为了三级即初级、中级、高级。六节来写,既要深度也要宽度,当然我也不是技术大牛,如文中有错误请指出,我会加以改正,谢谢。

感谢您的阅读,如果您学到了,请点赞(码字不易)!

欢迎热心园友补充!

作者:zusheng

系列文章预告及导航

渗透攻防Web篇-SQL注入攻击中级(状态:更新中)

第三节 利用SQL注入

第四节 SQL盲注利用

渗透攻防Web篇-SQL注入攻击高级(状态:更新中)

第五节 避开过滤方法总结

第六节 探讨SQL注入防御技巧

PentestDB 1 介绍 本项目用于提供渗透测试的辅助工具、资源文件 1.1 辅助工具 提供轻量级的易扩展的工具,可以快速编写exploit、添加漏洞验证/扫描规则、添加指纹规则、爆破规则等;包含以下功能: Exploit系统。易扩展的exploit系统,能够使用API快速编写exploit,能够批量执行exploit 子域名爆破。爆破子域名,使用域传送、DNS爆破、GoogleHacking进行子域名爆破 C段扫描。C段扫描,支持生成html格式输出文件 服务端应用识别。识别CMS类型、Web服务器、操作系统、WEB中间件等 URI敏感资源爆破。爆破WEB敏感文件,整站备份、配置备份、敏感文件等 社工密码典生成。根据社工信息生成密码爆破典 Google Hacking。GoogleHacking,生成URL典 编解码等功能。支持非常丰富的编解码方式,方便做payload编码 1.2 资源文件 各种渗透测试常用的资源文件,包括各种爆破典、exploit、webshell、攻击payload等 2 安装 从这里下载最新版本,或使用命令 git clone https://github.com/alpha1e0/pentestdb.git clone到本地 PentestDB支持Windows/Linux/MacOS,需使用python 2.6.x 或 2.7.x运行 2.1 解决lxml依赖 项目中的脚本文件依赖于lxml linux系统一般默认安装lxml,如果没有可通过以下方式安装: pip install lxml apt-get install lxml yum install lxml windows可通过以下方式安装lxml: 到这里找到对应系统的安装包,下载到本地 安装安装包,pip install package.whl 2.2 解决nmap依赖 项目中的C段扫描依赖于nmap扫描器 到这里下载nmap相应版本 在windows下需要设置环境变量,让系统能够找到nmap.exe。 3 使用 3.1 常用脚本 项目中的python脚本提供用有用的渗透辅助功能,根目录下的pen.py为脚本入口,另外script目录下也有其他一些脚本。 3.1.1 Exploit系统 pen.py的exploit子命令提供了exploit模块相关操作,exploit模块是一个轻量级的exploit框架,可以编写各种web漏洞的exploit: 搜索exploit信息 增加、删除、修改exploit信息 执行某个exploit 搜索并批量执行exploit exploit保存在项目根目录下的exploit目录下 例如: # 列举、搜索、注册、更新、删除 pen.py exploit -l pen.py exploit -q appName:joomla pen.py exploit --register exploit pen.py exploit --update cms_joomla_3_4_session_object_injection.py pen.py exploit -d "Joomla 1.5~3.4 session对象注入漏洞exploit" pen.py exploit --detail "Joomla 1.5~3.4 session对象注入漏洞exploit" # 执行exploit pen.py exploit -e cms_joomla_3_4_session_object_injection.py -u http://127.0.0.1:1234 --attack pen.py exploit -s appName:joomla -u http://127.0.0.1:1234 --verify pen.py exploit -s appName:joomla -u @url.txt 注:有关exploit模块的详细信息请参考exploit/readme.md 3.1.2 服务端应用识别 pen.py的service子命令提供了服务端应用识别的功能,能够识别服务器信息,包括: 操作系统 web服务器 web中间件 CMS等 例如: pen.py service http://xxx.com # 开启CMS识别加强模式 pen.py service http://xxx.com --cms 3.1.3 社工密码典生成 pen.py的password子命令提供了根据社工信息生成密码典的功能,能够设置不同关键生成密码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值