前言
近期在进行sql注入实战时出现了闭合方式不理解,可能是由于长时间未学习,突然再次做题出现了这种问题。对此我将问题总结如下,希望此能解决部分正在学习sql注入的人
错误理解
$sql = "select username,password from ctfshow_user2 where username !='flag'
and id = '".$_GET['id']."' limit 1;";
此语句中的id首先可以看出是get注入,此时我的想法是'id'
是php中引用变量的固定格式,.
是·拼接符,"
是包裹方式,再外层的'
仍是与最内层那个相似,是引用变量固定格式,这样看的话会误以为"
是实际的包裹方式,我们此时注入语句的话,肯定会构造如下payload
?id=-1" union select 1,2 --+
可是我却发现这样无法正确执行,得到的数据并不是2(正解是2),我看了看相关题目的wp,发现闭合方式是'
,这让我有点费解,在思考了一些时间并请假了大佬后,我发现之前的想法是不可取且错误的
正解
首先看变量sql,其整个语句就是拿双引号写的,那出现双引号是想干什么呢,肯定是想闭合前面的,此时我们把语句分开来看
$sql = "select username,password from ctfshow_user2 where username !='flag'
and id = '"
这是第一部分,后面的双引号与前面进行对应,把语句给闭合了
"' limit 1;";
这是第二部分,两个双引号闭合了一句话
此时我们发现中间还有
.$_GET['id'].
.用来把这个get注入的id和前后两句连起来,我们此时再看语句,发现第一部分最后多了一个'
,很巧,第二部分也有一个'
,此时就可以很明显的看出来id是被单引号包裹的
,假如传入的id=1,实际执行的sql语句就是
select username,password from ctfshow_user2 where username !='flag'
and id = '1' limit 1;
本人只是小白,如有问题还请各位师傅多多指正。