SQL注入

题目地址:http://ctf5.shiyanbar.com/web/index_2.php

1、空格检测

输入1',发现注入。


SQL注入_第1张图片
i单引号检测

输入1' ,注意,这里参数后面多加了一个空格。


SQL注入_第2张图片
空格检测

2、关键字检测

  • and


    SQL注入_第3张图片
    and通过
  • select


    SQL注入_第4张图片
    select不通过
  • from


    SQL注入_第5张图片
    from通过
  • union


    SQL注入_第6张图片
    union被过滤

这里只检测这么些个,因为实际用到的也不多

3、如何绕过?毕竟离不开关键词

我看了网上其他人的答案:
借鉴了几个思路:
1、大小写绕过
2、url编码进行绕过
3、注释进行绕过
结果:
1、大小写绕不过
2、url编码,试了%0a,意思是换行,也没过
3、/* * /和/* !select * /过了!就算屏蔽了*和/号,感觉也可以通过url编码重编,然后再次尝试?!

SQL注入_第7张图片
注释绕过

4、查找所有的表

'union/* !select* /table_name%0afrom%0ainformation_schema.tables%23网上给出的答案是这个。


SQL注入_第8张图片
爆表

其实,在经过转化之后,它真正传入到数据库的语句是这样的
'union/* !select * /table_name
from
information_schema.tables#

很明显,我有很多地方有疑惑。

首先,第一点来说。在《SQL注入与防御》中说到,需要用正确的sql语句来确认注入,使用错误的sql语句来发现注入。在这里,操作数据库的sql语句可能是这样写的:
select * from where id =
而这里,是直接将'union传入,相当于是
select * from where id = '' union select ***
传入了非正确的sql语句
当然了,联合查询这样做也是可以的,只是疑惑了一小会。

接下来,就是不懂的地方了。
使用/* !select* /确实是可以让mysql执行这个关键字,但是,为什么要在
information_shcema.tables后面加个#号呢?
明白了,这个#是代表,注释直到#号这行结束。
但是问题又来了,既然是注释,为什么会被执行?井号为什么不是在/* !select * /后面加,而是在#号后加呢?

解决第一个疑问:
在绝大多数编程语言中/** /都是代表注释的意思。但是mysqldump在导出的时候,为了保持兼容也能在其他SQL数据库运行,唯独能在mysql中被执行的就是/ *! * /了。所以,这里的/ *!select * /也就是顺从了这个规则,未被过滤且被执行。

第二个疑问:#号代表这一行注释的结束,很明显,这是可执行注释的结束,以免影响到后面的语句。

这里的知识点:
1、爆表sql语句:
union select table_name from information_schema.tables
2、使用换行url编码,跳过waf对空格的封锁

其实这里我换了一种方法,'union/ * !select* /table_name/** /from/**/information_schema.tables%23,也是可以得到目的,而且看起来更加工整?


SQL注入_第9张图片
自己的方法

5、爆列名和字段

所有的表均被爆了出来,看这里,是不是觉得胜利有望?继续干,拿列名!


SQL注入_第10张图片
所有表

从information_schema.columns中读取列名
'union/ * !select * /column_name/ ** /from/ ** /information_schema.columns/ ** /where/ ** /table_name='flag'%23

SQL注入_第11张图片
爆列名

'union/ * !select * /flag/ ** /from/ ** /flag%23


SQL注入_第12张图片
flag到手

6、思路总结

一开始拿到这个题目,我是完全没有思路的,不知道该如何下手,但是渗透测试一定要形成自己的思路体系。xss、sql注入各个思路不尽相同。这里总结sql。

首先,看它过滤了哪些,从关键字下手测试,sql注入攻击离不开关键字的帮助。
还有常规的空格过滤测试,特殊符号过滤测试。
这里如果是空格过滤的话,可以使用/ ** /注释进行绕过,当然,绕过过滤空格的方法还有很多,以后遇到再做知识储备。

然后,是爆数据库、列名、字段,这里使用的是information_schema.tables配合/ *! * /结合select这个技术进行爆破。值得我学习的是,这里的sql语句很简洁效果很好,union select table_name from informatin_schema.tables再次安利一下。
知道数据库,就该爆列名了。
union select column_name from information_schema.columns where table_name=flag

知道数据库和列名,最后的答案就可以拿出来了。
union select flag where flag

检测过滤 => 爆数据库 => 爆列名 => 爆字段
过滤分为:
特殊字符和关键字过滤
解决方法是利用url编码或者注释

你可能感兴趣的:(SQL注入)