SQL注入入门篇 小白 新手逻辑讲解 主流四步 简单易懂
SQL注入入门篇:基本注入流程加注入逻辑
既然要学习SQL注入,那么我们就要知道SQL注入是什么。
SQL 注入的本质是数据和代码的混淆。原本用户输入的应该是“数据”(比如一个用户名、一个 ID),但因为被直接拼接进 SQL 语句,就变成了 SQL 代码的一部分被执行。
一、找“门”
第一步就应该是去寻找一个“门”,一个网站有很多能够和数据库交互的地方,比如日常中我们在某宝去搜索某样商品,或者更改密码。从本质上都是一种种能够通过向服务器传递参数、代码,来查询数据库或更新数据库的一种种手段。
日常生活中的房子有很多可能入口:正门、窗户、通风管道。
网站也是一样的:1.URL里看得见的参数 2.登录框、搜索框(POST参数)
3.如
?id=1(GET参数)4.Cookie、User-Agent等HTTP头
我们的注入点其实就是从一座房子的“门”来进去
二、“敲门”
(在上面我们讲过“门”是什么,所以我在下方会将可以注入的地方形容为“门”)
在我们现实生活中或实战中会有很多“门”,有一些“门”是可以进去的,有一些“门”是没办法进去的,所以我们的第二步就是用一些办法来进行“敲门”,也就是判断“门”是否能够“敲”开。
正常情况下,”门“中应该是各种参数。而参数主要分为两种。一种是数字型,比如1、2、656、255等等,一种是字符型, 比如admin、user、xueyuan等等等。在我们注入的时候,我们可以通过几种方式来测试,这个”门“是应该输入数字型的数据还是字符型的数据。
字符型的数据如admin在被当作参数放入到数据库进行查询时,需要用符号引出来比如: 'admin',只不过在我们输入时闭合符号并不会显示出来,所以我们在输入的时候只需要纯字符就行。而数字型的并不需要闭合符号来进行闭合。
所以我们必须确定好”门“中是该输入数字型还是应该输入字符型。如果是数字型就应该输入数字+恶意代码来完成sql注入。如果是字符型,我们就应该输入字符+闭合符号+恶意代码+(注释符号或闭合符号)
举一个实际例子:比如如原来的url是这样的:http://127.0.0.1/?id=256我们就可以输入http://127.0.0.1/?id=256-1,然后观看回显来查看页面是否执行了?id=255的操作,如果成功执行证明减号被执行,则该注入点为数字型。因为如果是字符型的话减号将不会被执行。
如果确定了是数字型,就可以直接跳转到第三步(开始注入)了。
坤、找闭合
如果是字符型,下一步应该是找闭合,因为字符型的数据就像一个封闭的水库,闭合符号像水库的闸门,而字符就是水,像下图,蓝色部分是我们可以在URL里面见到的部分,而红色部分会隐藏起来。
?id=(“admin”)
而我们输入闭合符号或注释符号,就相当于在水库里面多两道闸门或添加一道闸门或推倒一座闸门。我们若在admin中间添加闭合符号提前截断闭合。黑色是我们输入且可以被看见的恶意闭合代码,红色是自带的闭合代码,蓝色是我们输入的正常搜索代码。
使?id=(“admin1”)变成?id=(“admin“)(”1”)
常见闭合符号有:'、"、)
通常是这三种符号的单个符号双写,或组合搭配
而闭合符号加注释符号的组合既可以将前方的语句闭合,也可以将后方自带的闭合符号注释掉
?id=(“admin”)变成?id=(“admin“)#”)
这样后方的#号后方的 ”)将会被注释掉不需要我们在去将后方的符号闭合
常见的注释符号有:#、--+、/**/
三、开始注入
当我们确定了注入点的数据类型之后,下一步就是”构造轮子“也叫”伪造一个开门钥匙“
(为了方便观察闭合符号我将用字符型的注入来演示)
简单说就是让网站执行一段简单的可以执行的代码,最常用最好用的就是:
?id=1") and 1 = ("1 ?id=1") and 1 = ("0
当我们输入?id=1" and 1 = "1时,网站像数据库发送的请求就是
select * from 表名 where id=("1")and 1 =("1")
其中蓝色的部分时网站自带的隐藏的闭合符号,而红色和绿色是我们输入的,我们通过观察发现,本来的一句语句被我们用闭合符号强行分成了两个部分
(1)select * from 表名 where id=("1")
(2)and 1 =("1")
数据库也就会执行两段命令,首先是查询id=1的字符,第二就是and 1= ("1")这个条件联合判断而1=1恒成立 则这两条语句都会执行,所以页面就应该正常输出查询id=1的结果。但是如果将and 1= ("1")换成and 1= ("0"),页面就会不显示,则我们的SQL注入在某种意义上就是注入成功了。
为什么1=1就能执行出来 1=0就不能?
因为and的意思就是当and两边都成立时才会都执行,同理,如果and左侧的id查不到,则该语句也不会执行,页面会像输入1=0时一样报错。
接下来我们来讲第二个,这个适用于我们不知道能够显示正常的id值的时候使用的。
?id=1") or 1 = ("1 ?id=-1") or 1 = ("1
当我们输入?id=-1"or 1 ="1 时,网站向数据库发送的请求就是:
select * from 表名 where id=("-1")or 1 =("1")
其中蓝色的部分是网站自带的隐藏的闭合符号,而红色和绿色是我们输入的,我们通过观察发现,本来的一句语句被我们用闭合符号强行分成了两个部分
(1) select * from 表名 where id=("-1")
(2)or 1 =("1")
数据库其实只执行了一条SQL命令,意思就是“查id等于-1的数据,或者查1等于1的数据”。因为1等于1永远成立,所以不管id是不是-1,整个条件都成立,结果就是把整个表里所有数据都查出来。如果你把1等于1换成1等于0,那1等于0永远不成立,而且id等于-1通常也不成立,两个条件都错,最后就啥也查不到。通过对比“能查到全部数据”和“啥也查不到”这两种页面结果,就能判断你的注入代码生效了。
因为
OR只要有一边成立就行。1=1恒成立,所以整体必真,查出所有数据;1=0恒假,且id=-1通常也为假,两边全假,所以整体为假,啥也查不到。
四、收尾完成注入
当服务器将我们输入的恶意代码执行时,我们最主要的任务也就完成了,接下来有两种选择
(1)使用工具进行数据库内的查询
可以连接SQlMap和图形化工具开始进行恶意的数据库信息查询了,工具使用教程后续会发
(2)手工注入查询
将第二条语句变成各种形式比如下方的语句来执行查询当前连接数据库名的字符长度,只需将语句末尾的14进行数字枚举就可以得到数据库的长度
?id=1") andlength(database())= ("14
标红的地方初学者可能无法看懂,您只要暂时知道这句话的意思是数据库database()的字符长度是多少就行
接下来就可以如法炮制将length(database())换成各种各样的SQL数据库语句来进行sql注入了
本篇 SQL 注入基础内容到此完结,从注入点判断、逻辑测试,到库名长度探测、基础流程都已梳理清楚。相信你也对SQL注入有了相对全面的理解,后续多加实操练习,就能逐步吃透手工注入技巧,继续加油精进~
下一篇文章预告:SQL注入精进篇:常见的SQL数据库语句和原理
重点:本文为个人学习分享,可能存在不严谨之处,欢迎指正本内容仅用于合法安全学习与漏洞防护,未经授权不得对任意网站进行注入测试,遵守网络安全相关法律法规。
