记一次SQL注入绕过思路

admin 2022年1月5日16:25:06评论195 views字数 2781阅读9分16秒阅读模式
记一次SQL注入绕过思路

点击蓝字 关注我们

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

原作者有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经本人允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

在一次寻找漏洞的时候发现这个站点,进去通过wappalyzer插件可知这是一个php站点:

记一次SQL注入绕过思路

熟悉的id传参,果断试了下SQL注入,加个单引号,没有失望,报错了。然后注释闭合,页面恢复正常,说明该页面存在SQL注入

记一次SQL注入绕过思路
记一次SQL注入绕过思路

绕过思路


N

Bypass Rd

S

本文中的截图均是在网站更新前所做的截图,但是现在该站点使用的是Wordpress 这个CMS了,所以有些验证部分就没有截图,没有截图的部分均采用文字描述的方式讲解绕过思路

我们确定了id传参是注入点之后可以先用order by来判断字段数,当order by 31的时候,页面返回正常。拿到字段数我们就可以用union select来查看显示位了,但是这里执行union select的话会被拦截,这里我们可以通过fuzz去寻找一下哪些关键字会被拦截,如果该关键字被过滤的话,那么我们只要传入该关键字时就会被拦截导致页面返回错误,经过测试发现union和select拼接时就会被拦截,所以我们可以针对性的对被拦截的部分进行变形绕过,可以尝试特殊字符、大小写、编码、缓冲区溢出等绕过方法。

经过多种绕过方法测试后发现,发现只需要填充一定长度的垃圾数据在拼接的字符串中间就可以绕过检测,原理是如果在处理数据时超出了其缓冲区长度就会引发bug从而实现绕过,至于需要填充多少数据,我们尝试就可以了,比如我们先随便在记事本写一堆垃圾字符,就先写50字母A,然后填充在union和select中间还有前后,如果被拦截了,那就用100字母A。如果还是被拦截了就用200个,以此类推直到绕过为止,利用的payload是这样的,其中....代表一定数量的A字符:


Id=-22%27%23AAAAAAA............AAunionAAAAAAA............AAAselectAAAAA......%0a 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 -- 


其中%27是单引号,%23是注释符#,%0a是换行符,%20是空格,它们都是经过了url编码后的值,最后面的-- 是注释符,--后面是个空格,至于payload中的%23%0a是绕过安全狗4.0的一种方法,当时想着也是一种方法,所以就加上去了。

按上述payload只在...处填充足够的字符A就可以绕过检测,接下来就可以判断显示位了,很顺利的找到了显示位为6,查看一下当前数据库版本:

记一次SQL注入绕过思路

但是当我们查询库名的时候又被拦截了,这里的系统函数绕过还是非常的简单的,我们只需要在括号前面加上一个注释符即可绕过,例如:

database() -->database/**/()

user()  --> user/**/()

然后查询库名,payload:


Id=-22%27%23AAAAAAA............AAunionAAA............AAAselectAAAAA......%0a 1,2,3,4,5,database/**/(),7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 --


记一次SQL注入绕过思路

查询下数据库版本信息,payload:


Id=-22%27%23AAAAAAA............AAunionAAAAAAA............AAAselectAAAAA......%0a 1,2,3,4,5,version/**/(),7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 --


记一次SQL注入绕过思路

到这其实都是挺简单的,然后就是查询表名,结果查询表名的时候发现information拦截了,本来以为加个注释就绕过了,发现不行,hex编码也不行,16进制也不行,反正就是当时我能想到的都试了,没办法,就去百度,然后经过一顿查找,发现Mysql 开发团队在 5.5.x 版本后将 innodb 作为数据库的默认引擎。

只要Mysql>5.6.x,mysql 库里增添了两个新表,innodb_index_stats 和 innodb_table_stats

记一次SQL注入绕过思路

这两个表是用于记录更改和新创建的数据库和表的信息,但准确的说是保存最近的数据库变动记录。

这里主要用到的是

innodb_table_stats

记一次SQL注入绕过思路

然后我们前面查询了当前数据库的版本为5.6.26,但是由于网站的更新,此处没法验证,所以在此之后的内容仅作为思路参考(下面的思路前提是数据库中存在innodb_table_stat表的情况下使用):

查表名

select table_name from mysql.innodb_table_stats where database_name=database()

通过这种方式得到表名后问题又来了,拿到了表却没法通过这个方法拿到列名,所以我们需要用到无列名注入的方法,无列名注入主要是适用于已经获取到数据表,但无法查询列的情况,关于这点网上也有很多前辈发过文章(http://www.cl4y.top/information被ban的情况下进行sql注入/),大致流程是这样的,我用admin表做演示

记一次SQL注入绕过思路

admin表的内容

记一次SQL注入绕过思路

联合查询

可以看到列名被替换为对应的数字。也就是说,我们可以用数字来查询对应列的数据,如3对应了表里面的 password:

记一次SQL注入绕过思路

``不能用也可以用别名,效果都一样:

记一次SQL注入绕过思路

如此我们便得到了password里面的内容。

注意:末尾的a可以是任意字符,用于命名。

查询username的数据也一样的道理:

记一次SQL注入绕过思路

只取一条数据时可以用limit来遍历,由于我们第一条是数字,所以limit 0,1也是数字,从limit1,1开始才是字段里的第一条数据,如图:

记一次SQL注入绕过思路
记一次SQL注入绕过思路

思路大致就是这样的,我们可以利用这种方法取出表里相应字段的值

但是由于网站的更新,没办法截图了,注入就到此结束了。


总结

本次注入主要是在于学习information_schema的绕过,因为这个information_schema的过滤在之前的注入中没有遇到过,所以通过这次注入也算是学习了一种新姿势,这次的注入仅到这里就结束了。

记一次SQL注入绕过思路

Forest Team


微信号|ForestTeam

记一次SQL注入绕过思路

期待你的

分享

点赞

在看


原文始发于微信公众号(Forest Team):记一次SQL注入绕过思路

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月5日16:25:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次SQL注入绕过思路http://cn-sec.com/archives/718967.html

发表评论

匿名网友 填写信息