SQL注入原理与实践

本文详细介绍了SQL注入的概念、危害,并通过一个实验案例展示了如何利用PHP进行SQL注入攻击。实验中,通过单引号和and 1=1/2的测试方法判断注入点,解释了SQL注入的原理。文章还探讨了如何通过ORDER BY子句确定列数,利用UNION查询获取其他表数据,以及如何避免SQL注入的安全措施。
摘要由CSDN通过智能技术生成

预备知识

什么是SQL注入?所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
我该如何向非技术人解释SQL注入?https://security.stackexchange.com/questions/25684/how-can-i-explain-sql-injection-without-technical-jargon
PHP基础语法:https://www.w3cschool.cn/php/
MySQL基础语法:https://www.w3cschool.cn/mysql/
mysql创建表时反引号的作用:https://www.cnblogs.com/nmap/p/6714031.html

实验目的

掌握SQL注入的原理,对于简单的SQL注入点,能够通过注入获取数据。

实验环境

一台win7,安装wamp,firefox;IP:随机。

实验步骤一

在学习这个实验请确保已经掌握了“SQL注入中information_schema的作用”、“获取网页参数”这2个实验中的内容。
在开始本次实验前,请先查看预备知识中的链接。文中有关于SQL注入比较形象的说明。
本次实验就来通过PHP代码来实例分析SQL注入,本系列实验使用的数据库是MySQL。
本次实验来学习可联合查询的注入(即union注入),为了方便,我们选择通过GET方式来传参。如果不知道如何给网页传参,不知道服务器如何获取用户传过去的参数的话,可以学习“获取网页参数”这个实验。
本实验的源码保存在c:\wamp\www\sqli目录下。
浏览器打开sqli.com/sqli-1.php。
在这里插入图片描述
其源码如下:
在这里插入图片描述
代码已经写了注释,如果没有给这个页面传参数,则默认传一个id参数,它的值为1。可以看到,在13行,获取到用户传过来的参数后,直接进入了SQL语句,带进了查询语句,没有任何其他操作,很明显的存在SQL注入。在sql语句中,new被反引号包起来了,关于反引号的作用,请参考预备知识中的“mysql创建表时反引号的作用”。以前很多的网站的信息公告页面的代码与上面类似,不过现在一般都是用的MVC框架,更加模块化,这里先不说MVC是什么,会在以后的课程里介绍,不知道MVC也完全不影响本次实验。
在网上搜到的判断网站是否存在注入点最常见的是加单引号,即“’”,如果不加单引号页面显示正常,而加了单引号以后,页面显示不正常或者错误,则说明网页存在SQL注入,还有一种就是如果加and 1=1页面显示正常,加and 1=2页面不正常或者错误,同样说明存在SQL注入,这是什么原因呢?首先通过这个方法来判断是否存在注入点。
先在URL后面加一个单引号,可以看到页面报错了,这个警告的意思是:mysql_fetch_array()这个函数第一个参数期望的参数类型是一个资源集,但是给的是一个布尔值,出现该警告的位置在代码的第15行。
在这里插入图片描述
查看代码,发现它的第一个参数$result这个参数的值来自第14行,它是mysql_query执行后的返回值。
在这里插入图片描述
查看php官方手册,可以看到mysql_query在查询出错的情况下会返回false,还有一种情况就是在没有权限访问查询语句中引用的表的时候,也会返回false。
在这里插入图片描述
这里明显不会是第二种情况,因为我们没有输入单引号的时候,能正常查询,而我们又没有修改查询的表,所以排除这种情况。所以可能就是前面的语句在MySQL里执行出错了,于是返回了false,这说明我们传进去的参数1’破坏了SQL语句,我们可以稍微修改下代码,在第14行后面输出一下当前执行的sql语句。修改后的代码如下:
在这里插入图片描述
然后再次访问页面,输出了数据库最终执行的SQL语句,为:select * from `new` where id = 1’,有编程经验的可能一眼就能看出来该SQL语句有错误,因为如果单引号或者双引号不是出现在字符串中的时候,单引号、双引号都是成对出现的,SQL数据库将单引号解析成代码与数据间的分界线,在单引号外面的内容是需要运行的代码,而单引号引起来的内容都是数据。
在这里插入图片描述
我们可以直接复制该语句到MySQL中去执行。由于数据库编码是utf8的,直接在mysql客户端中进行查询,中文会显示乱码,所以可以到phpmyadmin中来执行这个sql语句。
访问http://localhost/phpmyadmin/,如果需要输入密码,账号输入root,密码为空,然后点击执行登录。
在这里插入图片描述
然后点击左边的sqli,在右侧的new这一行选择浏览。
在这里插入图片描述
再选择SQL。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值