1、空格检测
输入1',发现注入。
输入1' ,注意,这里参数后面多加了一个空格。
2、关键字检测
-
and
-
select
-
from
-
union
这里只检测这么些个,因为实际用到的也不多
3、如何绕过?毕竟离不开关键词
我看了网上其他人的答案:
借鉴了几个思路:
1、大小写绕过
2、url编码进行绕过
3、注释进行绕过
结果:
1、大小写绕不过
2、url编码,试了%0a,意思是换行,也没过
3、/* * /和/* !select * /过了!就算屏蔽了*和/号,感觉也可以通过url编码重编,然后再次尝试?!
4、查找所有的表
'union/* !select* /table_name%0afrom%0ainformation_schema.tables%23网上给出的答案是这个。
其实,在经过转化之后,它真正传入到数据库的语句是这样的
'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,也是可以得到目的,而且看起来更加工整?
5、爆列名和字段
所有的表均被爆了出来,看这里,是不是觉得胜利有望?继续干,拿列名!
从information_schema.columns中读取列名
'union/ * !select * /column_name/ ** /from/ ** /information_schema.columns/ ** /where/ ** /table_name='flag'%23
'union/ * !select * /flag/ ** /from/ ** /flag%23
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编码或者注释