xctf-supersqli

题目链接
1.首先打开题目链接是一个提交框,习惯性的先提交1看看返回什么结果,
xctf-supersqli_第1张图片
返回了一个数组,再来提交1'看看,
在这里插入图片描述
根据回显可知这里可能存在sql注入,而且数据库为mysql,又根据报错提示提交1'#看看能不能闭合,提交后回显正常,说明是单引号闭合。
2.接下来使用order by看看联合注入的字段数,order by 2回显正常,order by 3,回显错误,说明字段数是2.然后就可以试试能不能进行联合查询注入了,提交1'union select 1,2#,结果提交后返回下图这些东西
xctf-supersqli_第2张图片
显然是正则表达式过滤了这些关键语句,而且忽略大小写,所以不能大小写绕过了,又试了试双写绕过,结果还是一样。
3.既然不能使用上图那些关键语句了,尝试别的方法吧,先来试试提交1 and%20(extractvalue(1,concat(%27~%27,database())))#,结果回显正常
xctf-supersqli_第3张图片
这里正常情况下不可能回显正常啊,检查了几遍提交的内容,抬头一看地址栏,这不是提交的内容吗,F12之后发现,果然这里的methodget,仔细一看地址栏的东西,发现比我提交的东西多了一个+inject=1+and%2520%28extractvalue%281%2Cconcat%28%2527~%2527%2Cdatabase%28%29%29%29%29%23,这下明白为啥回显正常了,问题在于+,由于1+字符串进行了类型转换,变成了1,当然回显正常了,所以应该在地址栏进行注入了。
4.这时再在地址栏提交1%27and%20(extractvalue(1,concat(%27~%27,database())))--+,成功爆出了数据库名
xctf-supersqli_第4张图片
接下来怎么办,select这个关键字被过滤,很多方法就不行了,最后想到了堆叠注入.先来看看能不能进行堆叠注入,提交?inject=0%27;show%20tables;--+
xctf-supersqli_第5张图片
回显两个表名,说明可以进行堆叠注入。
再来依次看看这两个表里面的东西
xctf-supersqli_第6张图片
这里看到了flag,但是这里需要注意红圈的地方,在表
1919810931114514两边使用的是反引号,sql采用单引号环绕文本值,但是对于表名,字段名,关键字这些则使用反引号或者什么都不加,但是对数字或者存在特殊字符的表名需要使用反引号,在where条件表达式则使用单引号。
5.知道了flag在哪,但是该如何查出它?下面有两种方法:
第一种sql预处理:
主要是三个语句的应用,可以看看这篇文章对它们的解释
理解了文章里的三个语句就可以构造出查看flag的语句了,
xctf-supersqli_第7张图片
提交语句后,又弹出了strstr()这个函数在检测传入的setprepare,而该函数对大小写敏感,所以可以采用大写绕过,构造语句是:/?inject=0%27;Set%20@sql=concat(%27s%27,%27elect%20*%20from%20`1919810931114514`;%27);Prepare%20sq%20from%20@sql;execute%20sq;–+
xctf-supersqli_第8张图片
第二种:改表名
通过第一种方法看见了另外一个表words里面的东西
xctf-supersqli_第9张图片
而红圈里面的内容不正是提交1时候所回显的内容吗,再来提交2和114514,回显如下
xctf-supersqli_第10张图片
xctf-supersqli_第11张图片
由这些结果可大致猜测出后台的语句是:select * from words where id=$inject,所以我们可以利用现成的select语句来爆出flag,这就牵涉到把words改为其他名,1919810931114514改为words,再把字段flag改为id,最后利用永真式1'or'1'='1爆出flag
修改表名和字段:
inject=1%27;rename%20table%20words%20to%20words1;rename%20table%20`1919810931114514`%20to%20words;alter%20table%20words%20change%20flag%20id%20varchar(50);–+
flag
xctf-supersqli_第12张图片

你可能感兴趣的:(xctf-supersqli)