-
-
[原创]关于SQLI-LABS学习过程中#和--两种单行注释的探索过程
-
发表于:
2017-7-22 10:32
3012
-
[原创]关于SQLI-LABS学习过程中#和--两种单行注释的探索过程
最近读了由@hesir翻译的几篇SQL注入入门文章,作为新手,获益匪浅。然而学习中也发现一些问题,并进行了排查解决,分享给大家,对于高手自然不值一哂,而且直接说解决方案也很简单,但授人以鱼不如授人以渔,在此把过程写出来,希望对于像我一样的新手们能借鉴到一些解决问题的方案,以便以后遇到类似问题供借鉴。
一、问题描述
闲话少叙,直奔主题。大家知道,MYSQL中单行注释有#和--(后面一般要求加一个空格)两种,按道理两种任选其一均应生效。然而在下学习过程中发现有些课程如SQLI-LABS中第一课(传送门)的注入中用--+,而#无效;另一些课程如SQLI-LABS中第11课(传送门)的注入则用#,而--+无效。这是怎么回事呢?
二、寻找答案
首先,当然是选择了最省力的方法:直接请教作者(原谅我如此偷懒)。在hesir明确表示他也不太清楚的情况下,我知道只能自己去摸索一下了。
虽然html和php都不太懂,但会写代码的人照葫芦画瓢调试总是马马虎虎过得去:
(一)查看编辑Less-1/index.php文件:
在30、31行照猫画虎直接写注入后的语句,然后使其依次生效,如你所料,两者都可以生效(为简单我就不贴图了)。
(二)搜索查询
既然直接嵌入可以生效,那么一定是嵌入之前发生了什么,是否#代表了什么特殊含义被吃掉了呢?就像--后面想加空格要写‘+’一样。直接搜索,果然:
(三)解决方案
在hesir译作手动绕过SQL过滤(传送门)中,描述了ascii值代替字符的方法,man ascii可查得#的ascii值为0x23,直接试用看可否解决:
Make it!
(四)表单注入中的--注释解决
为了更好理解,我还添加了63\64行,把注入内容经浏览器消化后的样子输出出来。
直接嵌入都没有问题,是否$_POST会吃掉特殊字符?PHP我不懂啊,继续Google。
好像不会哦,突然想起这不是在URL里面哦,那么--+里面的+不会被转换成空格,我们直接用‘-- ’(注意后面有空格)注入试试呢?Username中输入' union select 1,2 -- (最后加若干空格)
OK!
三、总结
最后,总结一下,原来原理如此简单:URL注入时对#和空格都会特殊对待,所以要用%23代替#,用+代替空格;而表单注入没有这些转换,所以直接输入#或者-- (后面有空格)。
一番周折,回头视之,原来还是由于自己不懂HTTP协议和相关基础知识所致(脸红),不多说了,赶紧补课去了。祝好!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课